explicit 构造函数

一、构造函数、默认构造函数、合成的默认构造函数

构造函数,是函数名与类名相同、没有返回类型的特殊的成员函数。可以有初始化列表。

默认构造函数,没有形参,或所有形参都有默认实参的构造函数。

如果没有显示定义任何构造函数,编译器会自动创建合成的默认构造函数。一个类哪怕只定义了一个构造函数(不管是不是默认构造函数),编译器也不会再生成默认构造函数。

合成的默认构造函数使用与变量初始化相同的规则来初始化成员:具有类类型的成员通过运行各自的默认构造函数来进行初始化;内置和复合类型的成员,如指针和数组,只对定义在全局作用域中的对象才初始化,当对象定义在局部作用域中时,内置和复合类型的成员不进行初始化。

二、隐式类类型转换

单个形参的构造函数定义了从形参类型到该类类型的一个隐式转换。

那么,如何抑制由构造函数定义的隐式转换?

三、explicit (显示)构造函数

可以通过将构造函数声明为explicit。

explicit 关键字只能用于类内部的构造函数声明上,不能在类的定义体外部的函数定义上再重复它。

通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为explicit。将构造函数设置为 explicit 可以避免错误,并且当转换有用时,用户可以显示地构造对象。

参考:C++ Primer 中文版第4版P393

对于只定义了explicit构造函数的类来说,只能使用直接初始化,不能使用复制初始化。

参见C++ Primer 中文版第4版P407

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 01:31:54

explicit 构造函数的相关文章

explicit构造函数和private

某天写一个用特定数据类型才能构造的类,就习惯性的声明了一个默认的构造函数,并声明为了private,避免勿调用默认的构造函数去声明这个类.但是却收到领导的一封邮件,建议用explicit去申明就行了,不建议用private. 处于懒惰的习惯,我回了一个ok,今天无意中看到邮件了,发现不对,靠 还是用代码说话吧: class myStr { protected: char* str_; public: myStr(void) // 默认的构造函数,什么也不做 : str_(nullptr) {}

[018]C++ explicit构造函数

explicit [英][?k?spl?s?t][美][?k?spl?s?t] adj.明确的,清楚的; 直言的; 详述的; 不隐瞒的; 看到上面的英文解释,我们应该就知道explicit构造函数是什么意思了:显式的构造函数! 一.隐式构造函数 如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class Myclass { public: Myclass(int num){}; }; 如果我们执行这样的操作,

explicit构造函数

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 //- } String s1 = "hello"; //OK 隐式转换,等价于String s1 = String("hello"); 但是有的时候可能会不需要这种隐式转换,如下: class String { String (

【转】C++中的explicit关键字

在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上.再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决.但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的.了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用.既然C++语言提供这种特性,我想在有些时候这种特性将会非常有用. 按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举

explicit关键字

说明:C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色. 1 是个构造器 ,2 是个默认且隐含的类型转换操作符. 所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象.

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除

c++ explicit关键字

explicit关键字不经常看到,切实比较生僻.今天总结一下. C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. 这是百度百科给的定义. 从定义上来看大概可以明白什么意思. 具体作用如下: explicit构造函数的作用解析: explicit构造函数是用来防止隐式转换的.请看下面的代码: Test1的构造函数带一个int型的参数,代码23行会隐式转换成调用Test1的这个构造函数.而Test2的

C++复制控制:拷贝构造函数

一.拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.与默认构造函数一样 ,拷贝构造函数可由编译器隐式调用.拷贝构造函数应用的场合为: (1)根据另一个同类型的对象显式或隐式初始化一个对象. (2)复制一个对象将它作为实参传给一个函数. (3)从函数返回时复制一个对象. (4)初始化顺序容器中的元素. (5)根据元素初始化式列表初始化数组元素. 下面分别对以上5点进行说明. 1.对象的定义式. C++支持两种初始化形式:直接初始化和复制初始化.复制初始

C++中的explicit关键字(转)

按默认规定,只用传一个参数的构造函数也定义了一个隐式转换.举个例子: #pragma once class CExample { public: CExample(void); CExample(int iFirst, int iSecond = 4); ~CExample(void); public: int m_iFirst; int m_iSecond; }; #include "StdAfx.h" #include "Example.h" CExample: