写点什么

[C++ 总结记录] 构造函数与析构函数调用时机

用户头像
图解AI
关注
发布于: 2021 年 03 月 24 日
[C++总结记录]构造函数与析构函数调用时机

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);//正确,系统默认提供拷贝构造函数,但是无法初始化


用户头像

图解AI

关注

技术成就未来 2021.03.22 加入

致力于:机器学习、深度学习、数据分析、算法、架构、C/C++、Rust、HTML5/webApp、Go、Python、Lua...

评论

发布
暂无评论
[C++总结记录]构造函数与析构函数调用时机