[018]C++ explicit构造函数

explicit

[英][?k?spl?s?t][美][?k?spl?s?t]

adj.明确的,清楚的; 直言的; 详述的; 不隐瞒的;

看到上面的英文解释,我们应该就知道explicit构造函数是什么意思了:显式的构造函数!

一、隐式构造函数

如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:

class Myclass {
public:
    Myclass(int num){};
};

如果我们执行这样的操作,就相当于自动将整型转换为MyClass类对象

MyClass obj = 10; //ok,convert int to MyClass 

它与下面的代码相等:

MyClass temp(10);
MyClass obj = temp; 

二、显示构造函数

虽然隐式转换很方便,但是在有些时候,我们可能不需要这些隐式转换,比如:

1 class Myclass {
2 public:
3     Myclass(int num) {                       // 输出数字
4         cout << num <<endl;
5     }
6     Myclass(const char* p) {                 // 输出字符
7         cout << *p << endl;
8     }
9 };

如果我们按照下面的方式来定义:

Myclass obj2(2);
Myclass obj3 = Myclass("b");

这样会各自调用各自的构造函数来进行打印,分别输出“2”和“b”。

但是如果我们继续按照隐式转换的方式来写:

Myclass obj = 10;
Myclass obj1 = ‘a‘;

虽然都会编译通过,但是会被隐式转换,obj1最后打印输出了b的ASCII码。

为了避免上面的情况的错误发生,我们可以声明显示的转换,使用explicit 关键字:

1 class Myclass {
2 public:
3     explicit Myclass(int num) {
4         cout << num <<endl;
5     }
6     Myclass(const char* p) {
7         cout << *p << endl;
8     }
9 };

这样下面的写法:

Myclass obj = 10;                   // 编译不通过
Myclass obj1 = ‘a‘;                 // 编译不通过
Myclass obj2(2);                    // OK
Myclass obj3 = Myclass(2);          // OK 
时间: 2024-10-22 00:27:10

[018]C++ explicit构造函数的相关文章

explicit 构造函数

一.构造函数.默认构造函数.合成的默认构造函数 构造函数,是函数名与类名相同.没有返回类型的特殊的成员函数.可以有初始化列表. 默认构造函数,没有形参,或所有形参都有默认实参的构造函数. 如果没有显示定义任何构造函数,编译器会自动创建合成的默认构造函数.一个类哪怕只定义了一个构造函数(不管是不是默认构造函数),编译器也不会再生成默认构造函数. 合成的默认构造函数使用与变量初始化相同的规则来初始化成员:具有类类型的成员通过运行各自的默认构造函数来进行初始化:内置和复合类型的成员,如指针和数组,只对

explicit构造函数和private

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

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: