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!)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部