`
andy136566
  • 浏览: 290628 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

c++关键字explicit使用指南

 
阅读更多

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++11 标准的早期草稿版本,旨在为 C++ 开发者提供全面的更新指南,帮助理解并掌握 C++11 的新特性和改进之处。 #### 三、文档主要内容 - **1. General 一般性介绍** - **1.1 Scope 范围**:定义了 C++...

    谷歌_C++编码风格指南

    - **显式构造函数(Explicit Constructors)**:使用`explicit`关键字防止隐式类型转换,增加代码清晰度。 - **复制构造函数(Copy Constructors)**:为类提供复制构造函数以处理对象的深拷贝和浅拷贝问题。 - **...

    the c++ programming language

    《C++编程语言》是Bjarne Stroustrup编著的一本C++经典教程,它为初学者和有经验的程序员提供了深入理解C++语言的全面指南。这本书详细阐述了C++的核心特性以及如何有效地使用它们,同时也涵盖了C++的最新标准,包括...

    高质量C++编程指南

    1. **显式转换**:避免隐式类型转换,使用`explicit`关键字防止不期望的自动类型转换。 2. **枚举类**:使用`enum class`代替传统的枚举,增强类型安全,避免枚举值与整数混淆。 六、多态与面向对象设计 1. **虚...

    C++常用术语

    使用explicit关键字可以禁止这种行为,确保类型转换的明确性。 #### 29. 全特化(Full Specialization) 全特化是指为模板类或模板函数的特定实例提供完全不同的实现。在C++中,全特化允许根据类型参数的具体值提供...

    Google C++ Style Guide(谷歌C++编码规范 )

    - **Explicit Constructors**:当构造函数只有一个参数时,应当使用`explicit`关键字,以避免不必要的类型转换导致的问题。 - **Copy Constructors**:复制构造函数用于创建一个新对象作为现有对象的副本。在编写...

    effective c++.pdf

    18. **避免隐式类型转换**:过度的隐式类型转换可能导致意料之外的行为,应谨慎使用`operator=`和`explicit`关键字。 19. **使用`override`和`final`**:`override`确保成员函数覆盖基类的虚函数,`final`阻止...

    Google C++编码规范.pdf

    该文档为Google公司内部使用的C++编程规范指南,旨在提高代码的一致性与可维护性,同时也适用于其他使用C++进行软件开发的团队和个人。 #### 三、头文件规范 - **#define保护**: 使用`#ifndef`、`#define`及`#endif...

    Google C++ Style Guide (English)

    - **常量使用**:尽可能地使用 `const` 关键字来表示不可更改的值。 - **整型**:选择合适的整型大小,如 `int32_t` 或 `uint64_t`,以确保跨平台兼容性。 - **64 位兼容性**:确保代码在 64 位系统上正确运行。 ...

    google c++ 编程规范

    - 避免隐式类型转换,使用`explicit`关键字防止意外构造。 - 使用`static_assert`进行编译时检查,确保类型正确。 5. **异常安全**: - 在可能抛出异常的代码块前后,使用`try-catch`处理异常。 - 保证函数在...

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

    对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1  1.1 编写一个简单的C++程序 2  1.1.1 ...

    effective c++

    《Effective C++》是Scott Meyers撰写的一本经典C++编程指南,旨在帮助开发者更高效、更专业地使用C++语言。这本书包含了55条经过实践验证的编程建议,每一条都深入探讨了C++的一些关键特性,以提升代码的质量、性能...

    C++ Templates 完全导引

    《C++ Templates 完全导引》是一本深入解析C++模板编程的权威指南,针对C++中的模板机制提供了详尽的阐述和实践指导。模板是C++语言中的一项核心特性,它允许开发者创建泛型代码,从而实现代码的复用和高效编写。...

    C++11标准_n3242

    C++11标准是C++编程语言的最新国际标准之一,它在之前的C++标准基础上进行了大量的改进和扩展。C++11标准文档,本文档编号为N3242,是在2011年2月28日修订的版本,代表了ISO/IEC的正式草案。文档详细地描述了C++11...

    src_themselves9sm_effectiveC++_zip_

    《effectiveC++》是由Scott Meyers撰写的一本经典C++编程指南,这本书深入探讨了如何有效地使用C++语言,提高代码质量和效率。"src_themselves9sm_effectiveC++_zip_"这个标题可能指的是一个包含《effectiveC++》...

    Google_C++_Style_Guide

    14. **Default Constructors**:默认构造函数应当简单,避免隐式类型转换,推荐使用`explicit`关键字。 15. **Copy Constructors**:复制构造函数应处理深拷贝和浅拷贝问题,遵循“Rule of Three”。 16. **...

Global site tag (gtag.js) - Google Analytics