#include <iostream>
using namespace std;
class CMyclass {
public:
CMyclass() {};//无参构造函数
CMyclass( CMyclass & c){ //复制构造函数
cout << "copy constructor" << endl;
}
~CMyclass() { cout << "destructor" << endl; }//析构函数
};
void fun(CMyclass obj_ )
{
cout << "fun" << endl;
}
CMyclass c;
CMyclass Test( )
{
cout << "test" << endl;
return c;
}
int main(){
CMyclass c1; //创建c1,并调用无参构造函数初始化c1
fun( c1); //创建形参obj_ ,调用复制构造函数,将实参c1的值复制到形参obj_ 中
Test();
return 0;
}
/*
输出结果:
copy constructor 调用复制构造函数初始化:fun()形参obj_
fun 执行fun
destructor //形参obj_消亡
test 进入Test()
copy constructor 构造一个临时对象,调用复制构造函数,将全局变量c的内容复制到这个临时对象中(初始化)
destructor //Test();调用结束, 返回值临时对象消亡
destructor // 局部变量消亡
destructor // 全局变量消亡
*/
关于使用构造函数考虑的点:
(1)见到创建对象的句子:
考虑:先创建对象,
创建对象时使用参数:带参数的构造函数初始化该对象。
创建对象时没有使用参数初始化:使用不带参数的构造函数初始化该对象。
(2)见到函数返回一个对象的句子:
考虑:调用该函数时,返回语句一定会创建一个临时对象,这个临时对象使用复制构造函数进行初始化,将返回的值复制给这个临时对象。
(3)函数的形参为类对象的句子:
调用该函数时,一定会创建一个形参对象,该形参对象使用复制构造函数或者使用转换构造函数进行初始化。
(3)见到为对象赋值的句子:
等号两边类型相同:将右边赋值给左边。
等号两边类型不同:等号右边是否有课匹配的转换构造函数,如果有,将其转换为一个临时的对象,然后赋值给左边。