八、构造函数和析构函数(二) 转换构造函数、赋值和初始化的区别、explicit
来源:互联网 发布:淘宝模版怎么做 编辑:程序博客网 时间:2024/06/02 01:40
一、转换构造函数
转换构造函数是能把一个其他类型转换成类类型的操作,本质上还是构造函数。例子如下:
class Test{public:Test() { cout<<"initnal"<<endl; }Test(int num){ cout<<num<<endl; }void Display(){};~Test(){ cout<<"destory"<<endl; }private:int num_;};int main(){Test t = 10;t = 20;cout<<"end"<<endl;<span style="white-space:pre"></span>return 0;}
运行结果:
10
20
destory
end
destory
1、调用转换构造函数将20这个整数转换成类类型 (生成一个临时对象,赋值之后即被销毁)
2、将临时对象赋值给t对象(调用的是=运算符)
注意:类的构造函数只有一个参数是非常危险的,因为编译器可以使用这种构造函数把参数的类型隐式转换为类类型
二、赋值和初始化的区别
例子如下:
int main(){Test t = 10;// 等价于Test t(10); 这里的=不是运算符,表示初始化。t = 20;// 赋值操作Test t2;t = t2;// 赋值操作 t.operator=(t2);return 0;}由此我们可以看出,=不一定就是初始化操作。赋值和初始化我们可以这样区别:
1、在变量声明时就给出初始值是初始化
2、在变量声明之后用=给出值是赋值
三、explicit
有时候我们不需要隐式转换,那么我们就应该讲类的构造函数声明为explicit,避免隐式转换出现我们不能预料的行为。explicit只提供给类的构造函数使用的关键字,编译器不会把声明为explicit的构造函数用于隐式转换,它只能在程序代码中显示创建对象。
class Test{public:Test() { cout<<"initnal"<<endl; }explicit Test(int num){ cout<<num<<endl; }void Display(){};~Test(){ cout<<"destory"<<endl; }private:int num_;};我们在执行Test t = 10;这样的操作时就会出错,提示:error C2440: “初始化”: 无法从“int”转换为“Test”。此时若要初始化Test,必须显示调用构造函数。
0 0
- 八、构造函数和析构函数(二) 转换构造函数、赋值和初始化的区别、explicit
- 构造函数初始化列表和函数内部赋值的区别
- 构造函数初始化列表和赋值的区别
- 两种不同构造函数的区别:初始化列表和赋值构造函数
- 拷贝构造函数和赋值构造函数的区别
- 拷贝构造函数和赋值构造函数的区别
- 赋值构造函数和拷贝构造函数的区别
- 赋值构造函数和拷贝构造函数的区别
- 拷贝构造函数和赋值构造函数的区别
- string类的构造函数,析构函数,拷贝构造函数和赋值构造函数
- String 的构造函数、析构函数和赋值函数
- string的构造函数,析构函数和赋值函数
- 构造函数初始化列表和构造函数的区别
- 构造函数初始化列表和构造函数体内赋值
- 区别拷贝构造函数和赋值函数
- 构造函数和初始化列表的区别
- 构造函数中的初始化列表和赋值
- C++类使用构造函数初始化类表和构造函数函数体中赋值的区别
- 交通运输部:预计2014年快递业务收入2032亿
- html+js一个简单的日历
- MYSQL查询~ 存在一个表而不在另一个表中的数据
- 手把手教你构建百万级高性能网站---0-引言
- debian 7 出现下列软件包有未满足的依赖关系
- 八、构造函数和析构函数(二) 转换构造函数、赋值和初始化的区别、explicit
- PS 滤镜——(扭曲)球面化 Spherize
- 泛型 + Comparable接口(感觉输出时候有C#,C的感觉)
- java线程:新特征-原子量
- 使用JAXB 将java继承的类序列化xml
- poj1185
- uva 11457 Tennis contest(概率,递推, 简单题)
- DD-WRT配置DNSMasq (可以谷歌,加速,索尼/任天堂/微软的服务网络)
- OJ刷题之成绩输出