explicit constructor: explicit关键字用来修饰构造函数,使之不能参加隐式转换。
对于例子:
class T
{
public:
explicit T(){} //没有效果。因为default constructor不会参加隐式转换
explicit T(int i){} //good
explicit T(int i, double){} //没有效果。因为本constructor有多个参数,不会参加隐式转换
explicit T(T const &t){} //bad design
};
T t = 1; //error. 不能从int转换到T
T t2(2); //ok. 显示调用.
T t3 = T(3); //当拷贝构造函数为explicit时:error. no copy constructor available or copy constructor is declared 'explicit'
//当拷贝构造函数不为explicit时:ok. 但不会调用copy constructor.
//我猜想,copy constructor用explicit修饰时,表示作者不容许任何形如T obj1 = obj2;行为
T t4 = t2; //error.原因与T t3 = T(3);同
/*注意:当类T是下面定义时:
class T
{
public:
T(int i){} //not explicit
explicit T(T const &t){} //explicit
operator int(){ return 1; } //
};
T t4 = t2; //ok.编译器会:先t2 -> int,再T(int)
//即explicit T(T const &t){}只是将这个函数从可能的转换集合中排除了,如果还有其它的路径,也是可以的。
*/
T t5(t2); //ok.显示调用
总结:compile在构造类的一个对象上做的小动作太多了,为了使代码清晰,推荐:
1. 总是定义一个default constructor和一个copy constructor,都不要声明为explicit
2. 如果类的成员有非数值类型(比如指针,类对象,数组),总是定义一个copy constructor,不要声明为explicit
如果没有,如果bitewise copy足够好的化,可不定义copy constructor,
2. 定义其它有单个参数的constructor时,声明为explicit
3. 定义对象时总是用显示调用的方式,而不是用赋值符'='。
这点最重要。
参考:
class T
{
public:
T(): value(0) {} //不采用缺省值的方案,更清晰。(普通的函数可以。)
T(T const &t): value(t.i) {}
explicit T(int i): value(i) {} //使用explicit关键字
private:
int value;
};
void test(T t){}
int main()
{
T t;
T t2(t);
T t3(3);
//T t4 = 3; //不推荐
//T t5 = t; //不推荐
test(t);
test(t2);
test(t3);
//test(4); //4不能隐式转换为T
}
摘自:http://blog.csdn.net/xtyyumi301/article/details/662631
分享到:
相关推荐
### C++基础知识总结 #### 目录概览 本文档主要涵盖了C++语言的基础知识及其在实际开发中的应用,特别适合于C++的初学者。文档由多个章节组成,包括了C/C++语言特性、面向对象编程基础、内存管理、标准模板库(STL...
C++ explicit关键字在刚学的时候就接触到了,也从各处了解了一些,但始终云里雾里,在闲来无事的时候再仔细研究了一下,自己消化理解了一下,自认为比其他网友总结的精简而不失准确。
在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制构造函数的隐式类型转换。本文将深入探讨`explicit`的作用,并通过示例代码帮助理解其工作原理。 `explicit`关键字用于声明单参数构造函数...
C++中的显式构造函数(Explicit Constructors)是编程实践中一个重要的概念,主要用来控制类对象的隐式类型转换。在C++中,如果一个类有一个只接受一个参数的构造函数,那么这个构造函数可以被用来进行隐式类型转换...
《C/C++面试基础知识总结》 C/C++是两种强大的编程语言,它们在软件开发领域有着广泛的应用。面试时,了解这些语言的基础知识是至关重要的。以下是对C/C++面试基础知识的详细解释: 1. **const和static作用**:`...
c++,隐式转换及explicit简单介绍,个人(新人)分享,有误请勿喷。
在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制类的构造函数如何参与类型转换。本文将详细解析`explicit`关键字的用途、意义以及它如何影响类对象的创建和赋值。 `explicit`关键字用于...
在C++编程语言中,`explicit`关键字是一个非常重要的特性,它用于控制类的构造函数如何进行隐式类型转换。本文将深入探讨`explicit`构造函数的概念、作用以及如何避免潜在的编程错误。 首先,让我们理解什么是构造...
在C++编程语言中,`explicit`关键字是一个非常重要的修饰符,它用于构造函数,用于控制类型转换的行为。本文将深入探讨`explicit`关键字的作用、使用场景以及它如何帮助避免潜在的错误。 首先,让我们来看一下`...
如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么Inside TheC++ Object Model正适合你。 目录: 本立道生(侯捷 译序) 前言(Stanley B.Lippman) 第0章 导读(译者的话) 第1章 关于对象...
### 关于VC++学习的基础知识 对于初学者来说,学习VC++可能会遇到各种挑战,但通过系统地了解其基础知识,可以有效地克服这些困难。本文将详细介绍VC++的基础知识,包括但不限于基本语法、代码规范以及一些高级特性...
一、C++编程基础 1. inline函数的处理步骤:当函数被定义为inline时,编译器在编译过程中会将函数的代码直接展开在调用处,以减少函数调用的开销。但是,最终是否内联取决于编译器的优化策略和函数的复杂度。 2. ...
C++中的拷贝构造函数和关键字explicit详解 C++中的拷贝构造函数是一种特殊的构造函数,它用于初始化对象时拷贝另一个对象的内容。拷贝构造函数的格式为`Type::Type(const Type&)`,其中`Type`是类的名称。拷贝构造...
在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下会发现现有的MFC库或者C++标准库中的相关类...
《高效C++中级编程教程》是一份针对有一定C++基础的学习者精心编撰的课程资料。这份教程旨在深化对C++编程思想的理解,特别是面向对象的编程思想,以及这一思想在实际编程中的应用技巧。教程内容丰富,涵盖了C++语言...
C++基础知识点总结 本篇文章对C++的核心知识点进行了详细的归纳,欢迎下载。完全符合计算机二级C++考试大纲要求。 一、C++概述 C++语言是由Bjarne Stroustrup博士于1980年开始创建的,旨在设计一种模拟语言,...
### C++基础关键字详解 #### 一、引言 C++是一种广泛使用的面向对象的编程语言,它在软件开发、系统编程以及高性能计算等领域扮演着重要角色。掌握C++的关键字是学习这门语言的基础。本文将详细介绍C++中的一些...
`explicit`关键字在C++中是一个非常重要的特性,它用于控制类的构造函数是否允许进行隐式类型转换。在默认情况下,如果一个类有一个接受单个参数的构造函数,那么这个构造函数可以被用来进行隐式类型转换。然而,...
在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制类的构造函数的行为,特别是涉及类型转换的情况。`explicit`关键字用来修饰单参数构造函数,目的是防止编译器进行隐式类型转换,从而避免...