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++ 总是想卖力地一个复制构造函数?