发新话题
打印

c++ 复制,移动构造函数

c++ 复制,移动构造函数

0. 构造函数,有多少种?按参数个数来分,就比较清楚
            1. 无参数,也叫默认构造函数,定义了其他构造函数,编译器就不会合成默认构造函数,瞧你能耐的,你这么厉害,我不管了,你自己去定义默认构造函数
            2. 单个参数的构造函数:
                 a. 类型转换,非同类型,使用场合:
                       1 显式使用
                       2. =赋值构造函数   可以被 explicit 禁掉
                       3. 传参临时对象,   可以被 explicit 禁掉, 如 hello(const string & x)  , hello("abc"); 是不是可以看成用显式调用创建了一个临时对象
                       4. 用于返回对象
                       5. static_cast<T>()  , 类似 make_shared<T>()
                       c++ 可以让自定义的类,具有内建类型一样的语义,比如,可以将不同类型的值,赋给另一种类型:
                            int i = false;  // 将 bool 型值,赋给 int 类型, 能不能看作,编译器内部有一个int类型构造函数:
                                                //   class int
                                                //   {
                                                //       public:  int(bool b){  // 呵,能不能 explicit ?估计不行吧
                                                //                           *this= b? 1:0;
                                                //                     }
                                                //   }
                                                
                           string str = "hello";  // 调用 string(const char *)
                           这种转换,反映出 c++ 试图对内建,和自建的类型,做形式上的统一,方便使用和理解。
                           但使用 explicit ,就是告诉自建类型,你不要太嚣张,你仅仅是一个自建类型,不要表现得象内建类型似的,试图让 c++(编译器)发现=,和临时对象参数生成时,调用你的转换构造函数,
                           
                 b. 复制,移动构造,参数是同类型
           3.多参数构造函数

1. 复制构造函数总是有的,没有的话,总会合成一个,c++ 对复制很大方,对默认有点吝啬,? why ? google 一下吧
   经查,这说法有问题,有一种情况,是不会合成复制构造函数的,比如,成员中,有不能公用的复制构造函数,这时,如果你仍想使用复制与幅值,那你就得自己定义一个
   为什么C++ 总是想卖力地一个复制构造函数?

TOP

以下情况,不能合成默认构造函数,
1. 如果有成员是  const, 引用
    编译器不知道,这值如何初始化,不初始化,const,引用都是非法的,所以只能留给聪明的你,显式定义它。
2. 如果有成员,没有默认构造函数,或者私有
3. 还有吗?  ...

TOP

c++ primer 将:
string name("john") ;//称作 direct initialize,
string name="john" ; //称作 copy initialize
string name=string() ;// 也称 copy initialize

而将:
string::string(const char *) ;  // 称作 convertion constructor
string::string(const string &) ;// 称作 copy constructor

开始我就被这概念搞混了,似乎 copy initialize只能用 copy constructor?   错!
我认为的正确理解:
1. copy constructor ,实际上就是一种特殊的 convert constructor ,只不过它的源类型,跟自己类型一样罢了,
    在编译器的角度看,看到 = 就去判断出两边的类型,再从目标类型里,找到以源类型为参数的构造函数
2. copy constructor 比 convert constructor 厉害的地方,它能在合成 copy constructor 时使用,也可以在容器对像复制时使用,这些都是隐式的,是编译器偷偷做的。

TOP

将 copy intialize 称作 assign initialize 是不是会好一些 ? 这样就可以说:
赋值初始化可以由复制构造函数,和转换构造函数完成

如果按 c++ primer 理解,就只能这么说:
复制初始化即可以由复制构造函数,和转换构造函数完成

别扭? 好比说:
张三家的事情,可以由张三做,也可以由李四做

那既然两个都可以做,就不仅仅是张三家的事情了,应该是大家的事情了?

TOP

发新话题