c++中拷贝构造函数的调用时机有三种情况:
- 使用一个已经创建完成的对象来初始化一个新对象
- 值传递的方式给函数参数传值
- 以值方式返回局部对象
1.创建一个新对象
#include<iostream>
using namespace std;
class person
{
public:
person()
{
cout << "person的默认的构造函数的调用" << endl;
}
person(int num)
{
m_age = num;
cout << "person的有参的构造函数的调用" << endl;
}
//按照类型分类:普通构造和拷贝构造函数
//拷贝构造函数:
person(const person &p)
{
m_age = p.m_age;
cout << "person的拷贝构造函数的调用" << endl;
}
~person()
{
cout << "person的析构函数的调用" << endl;
}
int m_age;
};
void test01()
{
person p1(20);
person p2(p1);
}
//构造和析构都是必须有的实现,如果不提供,编译器会提供一个空实现和析构
int main()
{
test01();
cout << "程序运行结束" << endl;
system("pause");
return 0;
}
2.以值传递的方式给函数参数传值
#include<iostream>
using namespace std;
class person
{
public:
person()
{
cout << "person的默认的构造函数的调用" << endl;
}
person(int num)
{
m_age = num;
cout << "person的有参的构造函数的调用" << endl;
}
//按照类型分类:普通构造和拷贝构造函数
//拷贝构造函数:
person(const person &p)
{
m_age = p.m_age;
cout << "person的拷贝构造函数的调用" << endl;
}
~person()
{
cout << "person的析构函数的调用" << endl;
}
int m_age;
};
void doWork(person p)
{
}
void test01()
{
person p;
doWork(p);//值传递的本质就是拷贝一个临时的副本
}
//构造和析构都是必须有的实现,如果不提供,编译器会提供一个空实现和析构
int main()
{
test01();
cout << "程序运行结束" << endl;
system("pause");
return 0;
}
3.值方式返回局部变量
#include<iostream>
using namespace std;
class person
{
public:
person()
{
cout << "person的默认的构造函数的调用" << endl;
}
person(int num)
{
m_age = num;
cout << "person的有参的构造函数的调用" << endl;
}
//按照类型分类:普通构造和拷贝构造函数
//拷贝构造函数:
person(const person &p)
{
m_age = p.m_age;
cout << "person的拷贝构造函数的调用" << endl;
}
~person()
{
cout << "person的析构函数的调用" << endl;
}
int m_age;
};
person doWork()
{
person p5;
cout << (int *) &p5 <<endl;
return p5;//值传递的时候,不会直接返回p5,会按照p5返回一个新的对象
}
void test01()
{
person p=doWork();//此处p就是函数体内返回的对象
cout << (int *)&p << endl;
}
//构造和析构都是必须有的实现,如果不提供,编译器会提供一个空实现和析构
int main()
{
test01();
cout << "程序运行结束" << endl;
system("pause");
return 0;
}