什么是拷贝构造函数?什么是拷贝构造函数?在什么情况下必须实现拷贝构造函数,请说明理由?
拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。...
拷贝构造函数,是一种特殊的构造函数,它由编译器调用 来完成一些基于同一类的其他对象的构建及初始化。
展开
2个回答
展开全部
什么是拷贝构造函数?
是一种特殊的构造函数,特殊之处在于它有的时候会隐式调用
class A {
public:
A(int x, int y, ...) // 普通构造函数
A(const A&) // 拷贝构造函数,一个参数必须是引用类型
};
当你有个函数
calculate(A a) {...}
你调用的时候
A a_in_main(...) // 调用普通构造函数
calculate(a_in_main); // 这个调用因为是参数是A类型的(不是引用也不是指针),所以要拷贝这个对象,这时就会用a_in_main作为A(const A& other)的参数other,在函数calculate中构造一个新的A类对象。
在什么情况下必须实现拷贝构造函数?
因为你不忽略拷贝构造函数的时候,编译器会给你生成一个按数据位拷贝的一个默认版本,即把类的数据成员直接拷贝到新的对象中。这样如果成员有指针指向动态分配的内存,那么直接拷贝指针就会使两个对象中的指针指向同样的内存,一般情况下这种效果都不是想要的。还有一种说法是深拷贝浅拷贝,编译器给你生成的默认版本就是浅拷贝,不会管你指针指向的是什么,只会给你直接把指针的值复制过去。所以只要你需要深拷贝的时候,才需要实现拷贝构造函数。
是一种特殊的构造函数,特殊之处在于它有的时候会隐式调用
class A {
public:
A(int x, int y, ...) // 普通构造函数
A(const A&) // 拷贝构造函数,一个参数必须是引用类型
};
当你有个函数
calculate(A a) {...}
你调用的时候
A a_in_main(...) // 调用普通构造函数
calculate(a_in_main); // 这个调用因为是参数是A类型的(不是引用也不是指针),所以要拷贝这个对象,这时就会用a_in_main作为A(const A& other)的参数other,在函数calculate中构造一个新的A类对象。
在什么情况下必须实现拷贝构造函数?
因为你不忽略拷贝构造函数的时候,编译器会给你生成一个按数据位拷贝的一个默认版本,即把类的数据成员直接拷贝到新的对象中。这样如果成员有指针指向动态分配的内存,那么直接拷贝指针就会使两个对象中的指针指向同样的内存,一般情况下这种效果都不是想要的。还有一种说法是深拷贝浅拷贝,编译器给你生成的默认版本就是浅拷贝,不会管你指针指向的是什么,只会给你直接把指针的值复制过去。所以只要你需要深拷贝的时候,才需要实现拷贝构造函数。
展开全部
拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为复制初始化);
可以找C++的学习教程看看
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为复制初始化);
可以找C++的学习教程看看
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询