explicit关键字的作用

explicit作用:

在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

explicit使用注意事项:

explicit 关键字只能用于类内部的构造函数声明上。

explicit 关键字作用于单个参数的构造函数。

 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换

先来看下面一道例题:

#include "stdafx.h"  
#include <iostream>  
#include <string>  
#include <vector>  
  
class B  
{  
private:  
    int data;  
public:  
    B()  
    {  
        std::cout<<"default constructor!"<<std::endl;  
    }  
    B(B &)  
    {  
        std::cout<<"copy constructor!"<<std::endl;  
    } 

    ~B()  
    {  
        std::cout<<"destructed!"<<std::endl;  
    }  
    B(int i) : data(i)  
    {  
        std::cout<<"constructed by parameter "<<data<<std::endl;  
    }  
};  
B Play(B b)  
{  
    return b;  
}  
int _tmain(int argc, _TCHAR* argv[])  
{  
    B temp = Play(5); //这里发生了隐式转换;(B)5 
    return 0;  
}  



问题:

(1)该程序输出的结果是什么?为什么会有这样的输出?

(2)B(int i):data(i),这种用法的专业术语叫什么?

(3)Play(5),形参类型是类,而5是个常量,这样写合法吗?为什么?【英国著名图形图像公司A2008年面试题】

(1)程序的输出结果为:

  onstructedby parameter 5

copy constructor;//temp=b;

destructor;  //B b;

destructor;  // temp;

 

注:5首先转换成B类型,调用一个有参的构造函数,然后Play返回之后,局部变量b会被析构掉。整个程序返回后,temp会调用析构函数。

为什么只有一个构造函数呢???这里又设计到另外一个问题,等会儿在后面接着讲。

(2)带参数的构造函数,冒号后面是成员变量初始化列表(members initialization list)。

(3)合法。单个参数的构造函数如果不添加explicit关键字,会定义一个隐含的类型转换,调用了相应的构造函数。(从参数的类型转换到自己);添加explicit关键字会消除这种隐含转换。


但是如果添加了explicit关键字来修饰构造函数后:问题3将变得不合法!

如果是 explicit B(int i ):data(i);

那么问题三就变的不合法:必须传:

B play(5); 

没有加之前可以是:B play=B(5);


看下面的实例:

    class A  //没有关键字explicit的类
    {
      public:
          int size;
         A(int _size)
        {
           size = _size;
        }
     };

如果没有explicit:

A a1(12);//OK

A a2=12;//OK  A a2=A(12);

A a3;  //error ,没有默认的构造函数;

a1=11;//OK

a2=13;//OK

a2=a1;//OK

BUT

如果加了explicit关键字:

   class A  //有关键字explicit的类
    {
      public:
          int size;
         explicit A(int _size)
        {
           size = _size;
        }
     };

A a1(12);//OK

A a2=12;//error

A a3;  //error ,没有默认的构造函数;

a1=11;//error

a2=13;//error 不 能做相应的隐形的转换;

a2=a1;//error 如果重载了operator=就可以了;

calss Cnum
{
public:
int data;
Cnum(int  i):data(i)
{
	cout<<"constructor"<<endl;
};
 operator int()
{
	return data;
}
int  operator=( Cnum num)
{
	int a;
	a=num.data;
	return a;
}
};
Cnum num;
num=100;

num=100; //先看看有没有operator=,若没有而进行隐式转换类型,在调用相应的构造函数;

int a=num; //运算符重载:

//


















  • 13
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值