标题:
c++ 复制,移动构造函数
[打印本页]
作者:
admin
时间:
2018-6-30 00:39
标题:
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++ 总是想卖力地一个复制构造函数?
作者:
admin
时间:
2018-6-30 01:43
以下情况,不能合成默认构造函数,
1. 如果有成员是 const, 引用
编译器不知道,这值如何初始化,不初始化,const,引用都是非法的,所以只能留给聪明的你,显式定义它。
2. 如果有成员,没有默认构造函数,或者私有
3. 还有吗? ...
作者:
admin
时间:
2018-6-30 12:32
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 时使用,也可以在容器对像复制时使用,这些都是隐式的,是编译器偷偷做的。
作者:
admin
时间:
2018-6-30 12:33
将 copy intialize 称作 assign initialize 是不是会好一些 ? 这样就可以说:
赋值初始化可以由复制构造函数,和转换构造函数完成
如果按 c++ primer 理解,就只能这么说:
复制初始化即可以由复制构造函数,和转换构造函数完成
别扭? 好比说:
张三家的事情,可以由张三做,也可以由李四做
那既然两个都可以做,就不仅仅是张三家的事情了,应该是大家的事情了?
欢迎光临 杰表技术论坛 (http://bbs.jatools.com/)
Powered by Discuz! 6.1.0