类型转换构造函数: 

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

#include<iostream>
using namespace std;
class Complex{
public:
double real,imag;
Complex(int i){
cout<<"IntConstructor called"<<endl;
real=i;imag=0;
}
Complex(double r,double i){
real=i;imag=i;
}
}; int main(){
Complex c1(7,8);
Complex c2=12;
c1=9; //9被自动转换成一个临时Complex对象
cout<<c1.real<<","<<c1.imag<<endl;
}

输出结果:

IntConstructor called
IntConstructor called
9,0

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

注意:

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

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

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

示例:

#include<iostream>
using namespace std;
class Complex{
public:
double real,imag;
explicit Complex(int i){
cout<<"IntConstructor called"<<endl;
real=i;imag=0;
}
explicit Complex(double r,double i){
real=i;imag=i;
}
}; int main(){
Complex c1(7,8);
Complex c2=12;
c1=9; //9被自动转换成一个临时Complex对象
cout<<c1.real<<","<<c1.imag<<endl;
}

此时程序报错:

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

  

新标准c++程序设计

转载请注明出处

类型转换构造函数 及使用explicit避免类型自动转换------新标准c++程序设计的更多相关文章

  1. 3_PHP表达式_5_数据类型转换_类型自动转换

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 1.布尔型数据参与算数运算时,TRUE被转换为整数1,FALSE被 ...

  2. JavaScript的类型自动转换高级玩法JSFuck

    0 前言 最开始是不小心在微信公众号(程序员大咖)看到一篇JS的高逼格代码,然后通过里面的链接跳转到了JSFuck的wiki,就像顺着迷宫找宝藏的感觉,感叹JS的自动类型转换的牛逼. 1 样例 (!( ...

  3. tp类型自动转换和自动完成

    一.类型自动转换 在模型中对数据库字段自动完成 //模型中数据类型自动转换 添加一个$type数组即可protected $type=array( 'username'=>'serialize' ...

  4. 复制构造函数被调用的三种情况------新标准c++程序设计

    1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用.例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2. C c2 (c1); C c2=c1; 这两条语句是等价的.注意 ...

  5. spring类型自动转换——@InitBinder和Converter

    spring有2种类型转换器,一种是propertyEditor,一种是Converter.虽然都是类型转换,但是还是有细微差别. 所以这里以一个例子的形式来分析一下这2种类型转换的使用场景和差别. ...

  6. struts2(三)之表单参数自动封装与参数类型自动转换

    前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...

  7. struts2各个功能详解(1)----参数自动封装和类型自动转换

    struts2里面的各个功能,现在确实都不清楚,完全属于新学! 通过前面的例子,有时就会疑问,这些jsp中的数据信息是怎么传送给action的?例如: <form action = " ...

  8. JavaScript的类型自动转换样例集合处

    1.前言 如果Javascript期望使用一个字符串,它会把给定的值转换成字符串:如果Javascript期望使用一个数字,它会把给定的值转化成数字. 2.样例 2.1.字符串拼接时有数字 windo ...

  9. struts2(二) 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

随机推荐

  1. 如何在 C#中添加 dll 文件

    按住鼠标左键,按住dll文件 ,然后将其拖动到工具箱里面 ,就出现了如图所示的控件

  2. NetBeans配置Xdebug 远程调试PHP

    1.配置PHP 说明:xdebug.trace_output_dir和xdebug.profiler_output_dir需要增加权限 #chmod 755 /usr/xdebug-tmp xdebu ...

  3. requirejs——基础

    一.requirejs存在的意义: 我们引用外部JS文件通常是这样引用的: <script src="1.js"></script> <script ...

  4. linux下的定时或计时操作(gettimeofday等的用法,秒,微妙,纳秒(转载)

    一.用select()函数实现非阻塞时的等待时间,用到结构体struct timeval {},这里就不多说了. 二.用gettimeofday()可获得微妙级(0.000001秒)的系统时间,调用两 ...

  5. SQL Where 字符串拼接

    ) set @s='1,2,3' --法一: --法二: exec('select * from tb where id in ('+@s+')')

  6. Linux 常用命令(转)

    转自:https://www.cnblogs.com/gaojun/p/3359355.html 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文 ...

  7. 【总结整理】原创概念原创idea---摘自《结网》

    假如你有一个原创想法,搜索引擎是否已有现成产品与自己的想法一致,如果有,研究他可以节省很多摸索的时间:若没有,那就是一个货真价实的原创idea: 第一类:受到现有产品的启发,将既有概念进行了转换. 第 ...

  8. 2014蓝桥杯B组初赛试题《切面条》

    题目描述: 一根高筋拉面,中间切一刀,可以得到2根面条.     如果先对折1次,中间切一刀,可以得到3根面条.     如果连续对折2次,中间切一刀,可以得到5根面条.     那么,连续对折10次 ...

  9. 【转】Provisional headers are shown

    在chrome开发者工具的 Network 面板中,某些请求头后面会跟着下面这行文字: Provisional headers are shown 这种请求实际上根本没有产生,对应的请求头当然也不应该 ...

  10. Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码

    通过 正则表达式 来获取一个网页中的所有的 URL链接,并下载这些 URL链接 的源代码 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 ...