C++的隐式转换和explicit关键字

 1  class  T
 2  {
 3  public :
 4      T( int  t){}
 5  };
 6  void  foo(T t)
 7  {
 8       return ;
 9  }
10  int  main()
11  {
12      T t( 3 );
13      foo( 3 );  // 此时会将3隐式转换为T
14 
15       return   0 ;
16  }
17 
通explicit关键字可以禁止这种隐式转换
 1  class  T
 2  {
 3  public :
 4       explicit  T( int  t){}
 5  };
 6  void  foo(T t)
 7  {
 8       return ;
 9  }
10 
11  int  main()
12  {
13      T t( 3 );
14      foo( 3 );  // 编译器报错error: conversion from ‘int’ to non-scalar type ‘T’ requested
15 
16       return   0 ;
17  }
看到过说对有多个参数的构造函数使用 explicit 是个语法错误。
但是用gcc好像这样不报错
g++ -O2 -Wall -o tt tt.cpp
 1  class  T
 2  {
 3  public :
 4       explicit  T( int  t,  int  s){}
 5  };
 6  void  foo(T t)
 7  {
 8       return ;
 9  }
10 
11  int  main()
12  {
13      T t( 3 4 );
14       return   0 ;
15  }
16 

ExpandedBlockStart.gif
 1 class T
 2 {
 3 public:
 4     explicit T(int t){}
 5 };
 6 void foo(T t)
 7 {
 8     return;
 9 }
10 
11 int main()
12 {
13     T t(3);
14     foo(3); //编译器报错error C2664: 'foo' : cannot convert parameter 1 from 'int' to 'T'
15 
16     return 0;
17 }
18 

转载于:https://www.cnblogs.com/lbsx/archive/2009/08/16/1547123.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值