http://tech.e800.com.cn/articles/2009/713/1247452155502_1.html
explicit作用:
在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
例子:
未加explicit时的隐式类型转换
1. class Circle
2. {
3. public:
4. Circle(double r) : R(r) {}
5. Circle(int x, int y = 0) : X(x), Y(y) {}
6. Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}
7. private:
8. double R;
9. int X;
10. int Y;
11. };
12.
13. int _tmain(int argc, _TCHAR* argv[])
14. {
15. //发生隐式类型转换
16. //编译器会将它变成如下代码
17. //tmp = Circle(1.23)
18. //Circle A(tmp);
19. //tmp.~Circle();
20. Circle A = 1.23;
21. //注意是int型的,调用的是Circle(int x, int y = 0)
22. //它虽然有2个参数,但后一个有默认值,任然能发生隐式转换
23. Circle B = 123;
24. //这个算隐式调用了拷贝构造函数
25. Circle C = A;
26.
27. return 0;
28. }
加了explicit关键字后,可防止以上隐式类型转换发生
1. class Circle
2. {
3. public:
4. explicit Circle(double r) : R(r) {}
5. explicit Circle(int x, int y = 0) : X(x), Y(y) {}
6. explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}
7. private:
8. double R;
9. int X;
10. int Y;
11. };
12.
13. int _tmain(int argc, _TCHAR* argv[])
14. {
15. //以下3句,都会报错
16. //Circle A = 1.23;
17. //Circle B = 123;
18. //Circle C = A;
19.
20. //只能用显示的方式调用了
21. //未给拷贝构造函数加explicit之前可以这样
22. Circle A = Circle(1.23);
23. Circle B = Circle(123);
24. Circle C = A;
25.
26. //给拷贝构造函数加了explicit后只能这样了
27. Circle A(1.23);
28. Circle B(123);
29. Circle C(A);
30. return 0;
31. }
分享到:
相关推荐
该文档为 C++11 标准的早期草稿版本,旨在为 C++ 开发者提供全面的更新指南,帮助理解并掌握 C++11 的新特性和改进之处。 #### 三、文档主要内容 - **1. General 一般性介绍** - **1.1 Scope 范围**:定义了 C++...
- **显式构造函数(Explicit Constructors)**:使用`explicit`关键字防止隐式类型转换,增加代码清晰度。 - **复制构造函数(Copy Constructors)**:为类提供复制构造函数以处理对象的深拷贝和浅拷贝问题。 - **...
《C++编程语言》是Bjarne Stroustrup编著的一本C++经典教程,它为初学者和有经验的程序员提供了深入理解C++语言的全面指南。这本书详细阐述了C++的核心特性以及如何有效地使用它们,同时也涵盖了C++的最新标准,包括...
1. **显式转换**:避免隐式类型转换,使用`explicit`关键字防止不期望的自动类型转换。 2. **枚举类**:使用`enum class`代替传统的枚举,增强类型安全,避免枚举值与整数混淆。 六、多态与面向对象设计 1. **虚...
使用explicit关键字可以禁止这种行为,确保类型转换的明确性。 #### 29. 全特化(Full Specialization) 全特化是指为模板类或模板函数的特定实例提供完全不同的实现。在C++中,全特化允许根据类型参数的具体值提供...
- **Explicit Constructors**:当构造函数只有一个参数时,应当使用`explicit`关键字,以避免不必要的类型转换导致的问题。 - **Copy Constructors**:复制构造函数用于创建一个新对象作为现有对象的副本。在编写...
18. **避免隐式类型转换**:过度的隐式类型转换可能导致意料之外的行为,应谨慎使用`operator=`和`explicit`关键字。 19. **使用`override`和`final`**:`override`确保成员函数覆盖基类的虚函数,`final`阻止...
该文档为Google公司内部使用的C++编程规范指南,旨在提高代码的一致性与可维护性,同时也适用于其他使用C++进行软件开发的团队和个人。 #### 三、头文件规范 - **#define保护**: 使用`#ifndef`、`#define`及`#endif...
- **常量使用**:尽可能地使用 `const` 关键字来表示不可更改的值。 - **整型**:选择合适的整型大小,如 `int32_t` 或 `uint64_t`,以确保跨平台兼容性。 - **64 位兼容性**:确保代码在 64 位系统上正确运行。 ...
- 避免隐式类型转换,使用`explicit`关键字防止意外构造。 - 使用`static_assert`进行编译时检查,确保类型正确。 5. **异常安全**: - 在可能抛出异常的代码块前后,使用`try-catch`处理异常。 - 保证函数在...
对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1 1.1 编写一个简单的C++程序 2 1.1.1 ...
《Effective C++》是Scott Meyers撰写的一本经典C++编程指南,旨在帮助开发者更高效、更专业地使用C++语言。这本书包含了55条经过实践验证的编程建议,每一条都深入探讨了C++的一些关键特性,以提升代码的质量、性能...
《C++ Templates 完全导引》是一本深入解析C++模板编程的权威指南,针对C++中的模板机制提供了详尽的阐述和实践指导。模板是C++语言中的一项核心特性,它允许开发者创建泛型代码,从而实现代码的复用和高效编写。...
C++11标准是C++编程语言的最新国际标准之一,它在之前的C++标准基础上进行了大量的改进和扩展。C++11标准文档,本文档编号为N3242,是在2011年2月28日修订的版本,代表了ISO/IEC的正式草案。文档详细地描述了C++11...
《effectiveC++》是由Scott Meyers撰写的一本经典C++编程指南,这本书深入探讨了如何有效地使用C++语言,提高代码质量和效率。"src_themselves9sm_effectiveC++_zip_"这个标题可能指的是一个包含《effectiveC++》...
14. **Default Constructors**:默认构造函数应当简单,避免隐式类型转换,推荐使用`explicit`关键字。 15. **Copy Constructors**:复制构造函数应处理深拷贝和浅拷贝问题,遵循“Rule of Three”。 16. **...