一、定义时初始化
源码
#include <iostream>
using namespace std;
class A
{
public:
A(){std::cout << "构造函数" << std::endl;}
~A(){std::cout << "析构函数" << std::endl;}
public:
A(const A &obj){std::cout << "拷贝构造函数" << std::endl;}
};
int main()
{
A a1;
A a2 = a1;
return 0;
}
上述代码中,
A a2 = a1;
执行 A 的拷贝构造函数。从编译器的角度来看,其实际的过程如下:
A a2; // 此时不调用 A 的构造函数,只是单纯的申请了 sizeof(A) 大小的内存。
a2.A::A(a1); // 调用 A 的拷贝构造函数,完成 a2 的初始化。
二、参数的初始化
继续使用上述代码中的类 A ,源码如下:
void func(A tmp) { }
int main()
{
A a1;
func(a1);
return 0;
}
结果:
构造函数
拷贝构造函数
析构函数
析构函数
过程和第一个是一样的。
三、返回值初始化
继续使用上述代码中的类 A ,源码如下:
A func()
{
A tmp;
return tmp;
}
int main()
{
A a = func();
return 0;
}
结果:
构造函数
拷贝构造函数
析构函数
析构函数
从编译器角度上看,其过程如下:
A a; // 此时不调用 A 的构造函数,只是单纯的申请了 sizeof(A) 大小的内存。
func 函数变成了如下形式:
void func(A &a)
{
A tmp; // 执行 A 的构造函数。
a.A::A(tmp); // 执行 a 的拷贝构造函数。
}
(SAW:Game Over!)