三五法则
首先自己好好梳理下自己的理解,然后:
琢磨设计段100行的代码进行debug,覆盖这6个动作的发生,观察其语义行为。
1. Home类:成员变量包含 内置类型、Man*、Dog、vector<Chair>
2. 包含函数的调用/返回、对象拷贝等行为。
3. default版本 vs 自定义版本 ,比较其构造的值的变化。
默认构造(无参) T()
拷贝构造 T(const T& )
移动构造 T()
拷贝赋值 T& operator=(T& )
移动赋值 T& operator=(T&& )
析构 ~T()
===============================================
以上6个行为是instance从{创建--传递--析构} 必用的6个语义。
如果没自行delete,就存在。(当定义了其他无参构造函数时,默认无参构造如果未default显示保留,会被丢弃)
===============================================
★ 搞清它们在什么时候被(隐式)调用?
对于一句初始化语句,分清楚它采用的是何种初始化方式。
★ 搞清每一种行为编译器默认版本的语义:
对不同类型的成员,它是如何的?
★ 判断什么时候可以使用默认提供的版本,什么时候必须重写/ 如何重写?
+ 自行定义的指定值初始化(有参构造):
若member a; 在自定义的构造函数中未进行初始化,会怎么样?未定义了 还是该成员使用默认的初始化行为?
+ T foo() {...}
之前debug发现,返回的对象用的是 拷贝构造、而非赋值。
定义define、初始化initialize、赋值assign是两回事:
——构造instance时:
step1: 先初始化其成员(分配内存、赋初值(成员变量可设置初值/ 未指定则采用系统默认初值))
step2: 若有指定值则再进行赋值 。(通过构造函数的调用参数指定值)
p.s. 某些情形下,定义内置类型变量时 并不会进行初始化,其值是未定义的。
“定义一个变量” (!=定义一个函数/类) 的语义只是:分配内存、指定变量名。(不包含值的初始化)
=====================================================================================
==================================================================================
=========================================================================================
默认构造函数
7.1.5节,
7.5.3 节
P236:
拷贝构造函数
对其各成员 都采取‘拷贝新的相同值的一份’的语义: ①内置类型、指针、乃至数组直接值拷贝 ②类类型调用其拷贝构造函数进行拷贝。
所谓“浅拷贝”:对于指针成员,只拷贝指针、不拷贝指针所指向的对象。 有的时候不能采用这种行为。
P441:
2.2.1节 变量定义
3.2.1节 定义和初始化string对象
<第13章 拷贝控制> 全面细致的讨论了这些问题...
13.1.1节 拷贝构造函数