c++知识细节-拷贝构造函数
拷贝构造函数(复制构造函数)
(1) 默认情况下,类对象的拷贝是每个成员变量逐个拷贝.
(2) 如果一个类的构造函数的第一个参数是所属类类型的引用,如果还有其他参数,这些额外的参数还都有默认值,则这个构造函数就被称为拷贝构造函数.
作用:
会在一定的时机被系统自动调用.
(3) 函数默认参数必须放在函数生命中,除非该函数没有函数声明.
(4) 拷贝构造函数只能有一个
(5) 拷贝构造函数第一个参数建议带const.不要声明成explicit,因为会涉及到隐性类型转换.
(6) 成员变量逐个拷贝功能因为拷贝构造函数的存在而失去了作用,或者说我们自己的拷贝构造函数取代了系统默认的每个成员变量逐个拷贝的这种行为.
(7) 如果我们没有为类定义一个拷贝构造函数,编译器就会为我们定义一个"合成拷贝构造函数"
(8)如果是编译器为我们生成的"合成拷贝构造函数",这个合成拷贝构造函数一般是将参数tmptime的成员逐个拷贝待正在创建的对象中.每个成员的类型决定了他如何拷贝,如果是整型的,那么就把值直接拷贝过来,如果是类类型,就会调用这个类的拷贝构造函数来拷贝.
(9) 如果你自己定义了拷贝构造函数,那么就会取代系统合成的拷贝构造函数,这个时候,你就必须在你自己的拷贝构造函数中给类成员赋值,以免出现类成员没有赋值就使用的情况.
(10) 还有一些情形会发生拷贝构造.
①将一个对象作为实参传递给一个非引用类型形参.
func(myTime);
②返回局部对象时,返回的是一个新的临时对象并调用了拷贝构造函数
Time func()
{
Time linshitime;
return linshitime
}
//Time.h声明
//拷贝构造函数
Time(const Time &tmptime,int a = 56);
class TmpClass
{
public:
TmpClass()
{
std::out << "调用了TmpClass类的构造函数" << std::endl;
}
TmpClass(TmpClass &tmpclass)
{
std::out << "调用了TmpClass类的拷贝构造函数" << std::endl;
}
}
//此时main中Time对象的拷贝会调用系统定义的合成拷贝构造函数,然后再调用TmpClass类的拷贝构造函数
TmpClass cl;
//Time.cpp定义
/*
Time::Time(const Time &tmptime, int a)
{
cout << "调用了拷贝构造函数";
}
*/
//main.cpp使用
Time myTime; //调用默认构造函数(不带参数)
Time myTime2 = myTime; //2-5都调用了拷贝构造函数
Time myTime3(myTime);
Time myTime4{myTime};
Time myTime5 = {myTime};
Time myTime6; //也会执行一次默认构造函数
myTime6 = myTime5;
//以上代码一共执行两次构造函数