1.拷贝构造函数的调用时机
class Student {
public:
Student();// 无参构造
Student(int age); //有参构造函数
Student(Student &stu);// 拷贝构造
~Student();
void show();
private:
int m_age;
};
// 有参构造函数
Student::Student(int age) {
this->m_age = age;
cout << "有参构造" << endl;
}
// 无参构造函数
Student::Student() {
this->m_age = 1000;
cout << "无参构造" << endl;
}
// 有参构造函数
Student::Student(Student &stu) {
this->m_age = stu.m_age;
cout << "拷贝构造函数" << endl;
}
Student::~Student() {
cout << "析构函数" << endl;
}
void Student::show() {
cout <<this->m_age << endl;
}
复制代码
>a. 使用一个已经创建完毕的对象来初始化一个新对象
Student stu;//调用无参构造函数
Student stu1(stu);//调用拷贝构造函数
复制代码
>b. 值传递的方式给函数参数赋值
void func1(Student p1) {
cout << "传值" << endl;
}
Student stu1(10);
func1(stu1);//这里发生个赋值操作,会调用拷贝构造函数
复制代码
>c. 以值的方式返回局部对象
Student func2(){ //以局部方式返回对象会发生拷贝构造
Student stu(20);//调用有参构造函数
return stu;
}
复制代码
2. 析构函数调用规则
a. 如果用户定义有有参构造函数,那么系统不再提供默认构造函数,但是会提供默认拷贝构造函数
class Dog {
public:
Dog(string name){
this->name = name;
}
string name;
}
// 调用
Dog d1;//错误,没有与之对应的无参构造,用户定义了有参构造,系统不再提供无参构造
Dog d1(10);//正确
Dog(d1);//正确,系统默认提供拷贝构造函数
复制代码
b. 如果用户定义有拷贝构造函数,那么系统不再提供其他构造函数
```c
class Dog {
public:
Dog(Dog &dog){
this->name = dog.name;
}
string name;
}
// 调用
Dog d1;//错误,没有与之对应的无参构造,用户定义了有参构造,系统不再提供无参构造
Dog d1(10);//错误
Dog(d1);//正确,系统默认提供拷贝构造函数,但是无法初始化
评论