zoukankan      html  css  js  c++  java
  • 类型转换构造函数 及使用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++程序设计

    转载请注明出处

  • 相关阅读:
    Sql Server 中的 @@ERROR
    MVC 自定义HtmlHelper帮助类型之分页
    CI(CodeIgniter)框架中的增删改查操作
    WMAP 启动报错 PHP- 提示缺少 msvcr110.dll 的问题
    Bat命令学习 (转载)
    C# 实现刻录光盘功能
    几个操作、名词的说明
    CheckStateChanged(复选框选中状态更改事件)和 CheckedChanged(单选按钮选中状态更改事件)二者区别?
    关于设置Visaul Studio 2010 代码编辑界面背景的方法
    checkBox1_CheckedChanged(object sender, EventArgs e)和checkBox1_CheckStateChanged(object sender, EventArgs e)不同
  • 原文地址:https://www.cnblogs.com/l2017/p/7758229.html
Copyright © 2011-2022 走看看