类型转换构造函数 及使用explicit避免类型自动转换------新标准c++程序设计
发布日期:2022-04-04 06:36:20 浏览次数:10 分类:博客文章

本文共 1005 字,大约阅读时间需要 3 分钟。

类型转换构造函数: 

  除复制构造函数外,只有一个参数的构造函数一般可以称作类型转换构造函数,因为这样的构造函数能起到类型自动转换的作用。例如下面的程序:

#include
using namespace std;class Complex{ public: double real,imag; Complex(int i){ cout<<"IntConstructor called"<

  输出结果:

IntConstructor calledIntConstructor called9,0

  Complex(int )这个构造函数就是类型转换构造函数。可以看书,该构造函数一共被调用了两次。第一次来自于对c2的初始化,第二次来自于第20行的赋值语句。这条赋值语句的等号两边的类型是不匹配的,之所以不会报错,是因为Complex(int)这个类型转换构造函数能够接受一个整型参数。因此,编译器在处理这条赋值语句时,会在等号右边自动生成一个临时的Comples对象,改临时对象以9为实参,用Complex(int)构造函数初始化,然后再将这个临时对象的值赋给c1,也可以说是9被自动转换成一个Complex对象然后再赋值给c1。

注意:

  第19行是初始化语句而不是赋值语句,编译器经过优化后,往往不会将12转换成一个临时对象,而是直接以12作为参数调用Complex构造函数来初始化c2。

使用explicit关键字避免隐式转换:

  增加explicit关键字后,程序不能运行,因为explicit关键字可以防止由构造函数定义的隐式转换。

   示例:

#include
using namespace std;class Complex{ public: double real,imag; explicit Complex(int i){ cout<<"IntConstructor called"<

 此时程序报错:

[Error] conversion from 'int' to non-scalar type 'Complex' requested[Error] no match for 'operator=' (operand types are 'Complex' and 'int')

  

新标准c++程序设计

转载请注明出处

 

转载地址:https://www.cnblogs.com/l2017/p/7758229.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c++小知识
下一篇:析构函数的调用------新标准c++程序设计

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月29日 10时33分00秒