三五法则

首先自己好好梳理下自己的理解,然后:

琢磨设计段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节 拷贝构造函数

原文地址:https://www.cnblogs.com/nanlan2017/p/9236744.html