发帖子讨论explicit的用法,什么情况下会发生隐式调用。

lj197912 2005-11-03 10:02:48
对什么时候用explicit还不是很清楚。希望抛砖引玉。
我只知道在下面的情况会发生隐式调用:
class Myclass
{
public:
int m_data;
........
const Myclass operator *(const Myclass&rhs) const
{
....
}

}
Myclass a;
Myclass result = a * 2;-------2会隐式转换为一个Myclass的object
用explicit 可以避免此现象。
我想知道还有什么情况会发生隐式调用呢?
...全文
136 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluckyxl 2005-11-03
  • 打赏
  • 举报
回复
//以前我写关于多态的文章中提到过的转化

②使用对象内嵌自定义构造函数可以消除一些隐式的类型转换。当然你也可以使用explicit来显式声明构造函数避免他被你“无意识情况下调用成为c++完美支持自定义类型牺牲品”。
举个例子:
class Example
{
public:
...
Example( int i ) : m_Member(i) {};
friend BOOL operator == ( Example A, Example B );
BOOL DoSomething( Example& A )
{
return (A == m_Member); //这里虽然没有匹配==操作的类型,但是编译器
//会发现构造函数 可以将int转化为可以比较的对象形式
//它就去做而不管你是否可能因为手误或是什么
//结果可想而知了^_^
};
...
private:
int m_Member;
};
对于以上隐式转化的问题稍微提一下,可以用explicit消除,也可以使用内嵌单变量对象构造函数来减少自动隐士转化的概率。随便说一下多元构造函数不会带来隐士转化的问题
zhouhuahai 2005-11-03
  • 打赏
  • 举报
回复
居然又错了, 狂晕菜:
operator type();
zhouhuahai 2005-11-03
  • 打赏
  • 举报
回复
搞错了,晕:
type operator() ;
zhouhuahai 2005-11-03
  • 打赏
  • 举报
回复
隐式类型转换运算符:
type operator() ( parameter list);
zhouhuahai 2005-11-03
  • 打赏
  • 举报
回复
BS那些只抄书的..... 却没有自己的东东拿出来的, ^_^
fiftymetre 2005-11-03
  • 打赏
  • 举报
回复
C++编译器能够在两种数据类型之间进行隐式转换(implicit conversions),它继承了C语言的转换方法,例如允许把char隐式转换为int和从short隐式转换为double。因此当你把一个short值传递给准备接受double参数值的函数时,依然可以成功运行。C中许多这种可怕的转换可能会导致数据的丢失,它们在C++中依然存在,包括int到short的转换和double到char的转换。



你对这些类型转换是无能为力的,因为它们是语言本身的特性。不过当你增加自己的类型时,你就可以有更多的控制力,因为你能选择是否提供函数让编译器进行隐式类型转换。



有两种函数允许编译器进行这些的转换:单参数构造函数(single-argument constructors)和隐式类型转换运算符。单参数构造函数是指只用一个参数即可以调用的构造函数。该函数可以是只定义了一个参数,也可以是虽定义了多个参数但第一个参数以后的所有参数都有缺省值。以下有两个例子:



class Name { // for names of things

public:

Name(const string& s); // 转换 string 到

// Name

...



};



class Rational { // 有理数类

public:

Rational(int numerator = 0, // 转换int到

int denominator = 1); // 有理数类

...



};



详情请看More Effective C++ 条款5 谨慎定义类型转换函数

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧