`
ijavagos
  • 浏览: 1192440 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C++关键字explicit的用法

阅读更多

explicit是显示的意思。而且只能修饰构造函数。

因为在类的构造函数中,凡是只带一个参数的构造函数,都定义了一组隐式转化——把构造函数类型转换为该类的类型。

比如:

class Explicit

{

private:

int _i;

public:

Explicit(int i )

{

// TODO Auto-generated constructor stub

_i = i;

printf("Explicit 构造函数[%d].\n", _i);

}

virtual

~Explicit( )

{

// TODO Auto-generated destructor stub

printf("Explicit 析构函数[%d].\n", _i);

}

};

则:调用:

Explicit e = 1;

打印:

Explicit 构造函数[1].

Explicit 析构函数[1].

调用:

void fun(Explicit e)

{

}

fun(1);

打印:

Explicit 构造函数[1].

Explicit 析构函数[1].

fun(1)相当于:

{

Explicit tmp = Explicit(1);

fun(tmp);

}

tmp 只在{}内有效,运行到{}外则释放掉tmp

注意:一:如果有下定义:

class Number

{

public :

Number(Explicit e)

{

printf("Number 构造函数.\n");

}

virtual

~Number( )

{

printf("Number 析构函数.\n");

}

};

void func(Number n)

{

}

func(1);

编译会报错:: 错误:请求从 int 转换到非标量类型 Number——也就是编译器不会先把1转化为Explicit再转化为Number

注意:二:

double i = 1.01;

fun(i);

编译器会首先做一个类型转换,将double 类型转换为int类型。但是会有告警。

在构造函数前面加上关键字“explicit”可以消除这种隐式转化:

explicit Explicit(int i )

编译会议提示错误:: 错误:请求从 int 转换到非标量类型 Explicit

被声明为explicit的构造函数比其non-explicit构造函数更好一些,因为他可以禁止编译器执行非预期的类型转换。

分享到:
评论

相关推荐

    C++ Explicit关键字详细解析

    以下是对C++中Explicit关键字的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    C++中explict关键字用法

    C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。 c++规定:对于可能只需传一个参数的默认构造函数,都定义了一种隐式调用。 ...

    C++中volatile和mutable关键字用法详解

    C/C++中的volatile关键字和const对应,用来修饰变量,用于告诉编译器该变量值是不稳定的,可能被更改。使用volatile注意事项: (1). 编译器会对带有volatile关键字的变量禁用优化(A volatile specifier is a hint to...

    ANSI C++特征总结

    这些新特征包括关键字 mutable 以及explicit。 有一些修改的潜在作用很大。现在 ANSI 规则鼓励某些编程方法而抛弃其他一些编程方 法。尽管在一段时间内不会放弃对老式编程方法的支持,但是有一些编程方法最终是要...

    新手学习C++入门资料

    这些关键字能作为函数和变量的标识符在C程序中使用,尽管C++包含了所有的C,但显然没有任何C++编译器能编译这样的C程序。 C程序员可以省略函数原型,而C++不可以,一个不带参数的C函数原型必须把void写出来。而C++...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    C++标准程序库STL的架构

    2.9 explicit关键字 5 2.10 新的类型转换符 5 2.11 静态常量成员的初始化 6 2.12 时间复杂度O记号 6 3 一般概念 7 3.1 头文件 7 3.2 错误处理和异常处理 7 3.2.1 异常头文件 7 3.2.2 标准异常分类 7 3.2.3 异常规格 ...

    C++大学教程,一本适合初学者的入门教材(part2)

    第1章 计算机与C++编程简介 1.1 简介 1.2 什么是计算机 1.3 计算机组成 1.4 操作系统的变革 I.5 个人计算、分布式计算与客户/a匠务器计算 l. 6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++...

    C++大学教程,一本适合初学者的入门教材(part1)

    第1章 计算机与C++编程简介 1.1 简介 1.2 什么是计算机 1.3 计算机组成 1.4 操作系统的变革 I.5 个人计算、分布式计算与客户/a匠务器计算 l. 6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++...

    2010年 c语言入门到精通

    下面就介绍这类变量的创建和使用方法。  1.变量的命名规则  首先,我们必须给变量取一个合适的名字,就好像每个人都有自己的名字一样,否则就难以区分了。  在VB6中,变量的命名必须遵循以下规则:  (1)变量...

Global site tag (gtag.js) - Google Analytics