Cpp 对象模型探索 / 程序转化语义
一、定义时初始化
源码
#include
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 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!)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
