C++ 拷贝构造函数看这一篇就够了
默认情况下,类对象的拷贝,是每个成员变量逐个拷贝。
如果一个类的构造函数的第一个参数,是所属类类型的引用,如果还有其他额外参数,额外参数都有默认值。函数默认参数必须放在函数声明中。则这个构造函数就叫做拷贝构造函数。
作用:会在一定的时机,被系统自动调用。
Time::Time(const Time& temptime, int a) {//第一个参数一般都是const
minute = 40;
cout << "调用了拷贝构造函数" << endl;
}
Time mytime;//调用不带参数的构造函数
Time mytime2 = mytime;//指向拷贝构造函数
Time mytime3(mytime);//指向拷贝构造函数
Time mytime4{ mytime };//指向拷贝构造函数
Time mytime5 = { mytime };//指向拷贝构造函数
Time mytime6;//调用不带参数的构造函数
mytime6 = mytime5;//调用的不是拷贝构造函数
拷贝构造函数只能有一个。
- 拷贝构造函数第一个参数带着const。如果不加,可能会造成错误,比如Time mytime = fun(),fun()为一个返回值为Time对象的函数。
- 拷贝构造函数不要声明成explicit(禁止隐式转换)。因为系统会自动隐式转换。无参,一个参数的构造函数一般加上explicit(防止系统把数字当成对象)。
- 成员变量逐个拷贝这个功能,因为我们自己定义的拷贝构造函数丢失了作用。或者说,我们自己的拷贝构造函数取代了系统的默认的拷贝构造函数。
- 如果我们没有定义拷贝构造函数,编译器会帮我们定义一个默认拷贝构造函数,一般叫合成拷贝构造函数
- 这个合成拷贝构造函数,一般就是将参数的成员逐个拷贝到正在创建的对象中。每个成员的类型,决定了它如何拷贝,如果成员变量时整型,就直接把值拷贝过来,如果成员是类类型,就会调用这个类的拷贝构造函数。
- 如果自己定义了拷贝构造函数,就取代了系统定义了。就必须在自己的拷贝构造函数中给类成员赋值。否则成员值会随机。
- 发生调用拷贝构造函数的情形
将对象作为实参传递给非引用的形参。
从一个函数中返回对象的时候
还有一些其他情况