拷贝构造函数
1.什么是拷贝构造函数?什么时候使用拷贝构造函数?
第一个参数为自身类型引用的构造函数。
比如
class Foo{
public:
Foo(); //默认构造函数
Foo(const Foo&); //拷贝构造函数
//...
};
在以下情况中被使用:
- 拷贝初始化(用=定义变量)
Foo b; Foo a=b;
- 函数参数采用值传递而不是指针传递时
Foo a(b);
- 返回类型为非引用类型的函数返回一个对象
Foo example(){.......; return b;}// b为Foo类型
2.为什么拷贝构造函数的第一个参数要是引用?
如果不是引用的话,在参数值传递时会调用另一个拷贝构造函数,然后开始进入死循环。
拷贝赋值函数
用在比如
Foo a,b; //已调用默认构造函数初始化
a=b; //拷贝赋值函数
定义:类型为Foo的类型的拷贝赋值函数定义为
Foo& operator=(const Foo&)
其中返回值为引用类型的目的,是为了使用户自定义类型能够和内置类型一样,能够连续赋值。比如a=b=c;
应当注意的是,默认拷贝赋值只是简单的挨个赋值,在有些时候,不能使用默认拷贝函数,否则会出现编译错误。
比如
class Foo{
public:
const int a;
int& b;
Foo();
//...
private:
int c;
}
Foo a,b;
b=a;
//上面那一句话明显是错误的,因为如果正确的话,那就意味着我们能够对引用,const重新赋值,以及能够直接获取到类的私有成员,这显然是错误的。