类型转换构造函数 及使用explicit避免类型自动转换------新标准c++程序设计
类型转换构造函数:
除复制构造函数外,只有一个参数的构造函数一般可以称作类型转换构造函数,因为这样的构造函数能起到类型自动转换的作用。例如下面的程序:
#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++程序设计的更多相关文章
- 3_PHP表达式_5_数据类型转换_类型自动转换
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 1.布尔型数据参与算数运算时,TRUE被转换为整数1,FALSE被 ...
- JavaScript的类型自动转换高级玩法JSFuck
0 前言 最开始是不小心在微信公众号(程序员大咖)看到一篇JS的高逼格代码,然后通过里面的链接跳转到了JSFuck的wiki,就像顺着迷宫找宝藏的感觉,感叹JS的自动类型转换的牛逼. 1 样例 (!( ...
- tp类型自动转换和自动完成
一.类型自动转换 在模型中对数据库字段自动完成 //模型中数据类型自动转换 添加一个$type数组即可protected $type=array( 'username'=>'serialize' ...
- 复制构造函数被调用的三种情况------新标准c++程序设计
1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用.例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2. C c2 (c1); C c2=c1; 这两条语句是等价的.注意 ...
- spring类型自动转换——@InitBinder和Converter
spring有2种类型转换器,一种是propertyEditor,一种是Converter.虽然都是类型转换,但是还是有细微差别. 所以这里以一个例子的形式来分析一下这2种类型转换的使用场景和差别. ...
- struts2(三)之表单参数自动封装与参数类型自动转换
前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...
- struts2各个功能详解(1)----参数自动封装和类型自动转换
struts2里面的各个功能,现在确实都不清楚,完全属于新学! 通过前面的例子,有时就会疑问,这些jsp中的数据信息是怎么传送给action的?例如: <form action = " ...
- JavaScript的类型自动转换样例集合处
1.前言 如果Javascript期望使用一个字符串,它会把给定的值转换成字符串:如果Javascript期望使用一个数字,它会把给定的值转化成数字. 2.样例 2.1.字符串拼接时有数字 windo ...
- struts2(二) 表单参数自动封装和参数类型自动转换
前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...
随机推荐
- Composer安装使用
Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 1.下载 2.安装成功 3.配置地址 4.安装代码库 镜像 配置json
- 3 ignite windows 上安装
实在懒得写了, 基本上按照官网的操作就行,很简单 https://apacheignite.readme.io/docs/getting-started
- DFT的补0运算
在实际的DFT中,如果需要增加采样的密度.这里的采样是频域的采样.可以等到更加密集的谱. 如对于信号 x = [1, 1, 1, 1]做DFT如下图: 不零后的DFT, N = 8, N= 16, N ...
- DIKW模型与数据工程
DIKW 体系 DIKW体系是关于数据.信息.知识及智慧的体系,可以追溯至托马斯·斯特尔那斯·艾略特所写的诗--<岩石>.在首段,他写道:“我们在哪里丢失了知识中的智慧?又在哪里丢失了信息 ...
- 泛型集合List<T>
- linux信号量使用
#include <pthread.h> #include <semaphore.h> #include <unistd.h> #include <stdio ...
- RabbitMQ操作方法
/// <summary> /// 消费者(消息) /// </summary> public class CustmerMq { /// <summary> // ...
- 2-1 gradle安装
因为Gradle是基于JVM的,所以一定要确保本机已经安装了JDK,我们可以通过java -version来验证一下是否已经安装了JDK. bin目录里面是两个可执行文件,一个是Windows下面的 ...
- SSH连接Linux
转载自百度经验 https://jingyan.baidu.com/article/bea41d439d16d7b4c51be619.html 连接Linux的工具有Putty.SSH Secure ...
- Arcgis engine编程报错查询(转)
Arcgis engine编程报错查询 标签: arcgis arcengine arcgisengine 2016年04月10日 17:29:35429人阅读 评论(0) 收藏 举报 分类: Ar ...