[018]C++ explicit构造函数
explicit
adj.明确的,清楚的; 直言的; 详述的; 不隐瞒的;
看到上面的英文解释,我们应该就知道explicit构造函数是什么意思了:显式的构造函数!
一、隐式构造函数
如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
class Myclass {
public:
Myclass(int num){};
};
如果我们执行这样的操作,就相当于自动将整型转换为MyClass类对象
MyClass obj = ; //ok,convert int to MyClass
它与下面的代码相等:
MyClass temp();
MyClass obj = temp;
二、显示构造函数
虽然隐式转换很方便,但是在有些时候,我们可能不需要这些隐式转换,比如:
class Myclass {
public:
Myclass(int num) { // 输出数字
cout << num <<endl;
}
Myclass(const char* p) { // 输出字符
cout << *p << endl;
}
};
如果我们按照下面的方式来定义:
Myclass obj2();
Myclass obj3 = Myclass("b");
这样会各自调用各自的构造函数来进行打印,分别输出“2”和“b”。
但是如果我们继续按照隐式转换的方式来写:
Myclass obj = ;
Myclass obj1 = 'a';
虽然都会编译通过,但是会被隐式转换,obj1最后打印输出了b的ASCII码。
为了避免上面的情况的错误发生,我们可以声明显示的转换,使用explicit 关键字:
class Myclass {
public:
explicit Myclass(int num) {
cout << num <<endl;
}
Myclass(const char* p) {
cout << *p << endl;
}
};
这样下面的写法:
Myclass obj = ; // 编译不通过
Myclass obj1 = 'a'; // 编译不通过
Myclass obj2(); // OK
Myclass obj3 = Myclass(); // OK
[018]C++ explicit构造函数的更多相关文章
- explicit构造函数
explicit构造函数 Explicit Constructors(显式构造函数)收藏 按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面 ...
- explicit构造函数的作用
explicit构造函数是用来防止隐式转换的.请看下面的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
- explicit 构造函数
一.构造函数.默认构造函数.合成的默认构造函数 构造函数,是函数名与类名同样.没有返回类型的特殊的成员函数.能够有初始化列表. 默认构造函数,没有形參.或全部形參都有默认实參的构造函数. 假设没有显示 ...
- C++笔记(1)explicit构造函数
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); ...
- Effective C++ 第0章 explicit构造函数
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); ...
- c++ explicit 构造函数
代码 #include<iostream> using namespace std; class Example { private: int data; public: Example( ...
- C++关键字 explicit
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. C++中, 一个参数的构造函数(或者除了第一个参数 ...
- 关键字 explicit
C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色. 1 是个构造器 ,2 是个默认且隐含的类型转换操作符. 所以, 有时候在我们写下如 AAA ...
- C++ Primer 学习笔记_54_类和数据抽象 --拷贝构造函数、赋值运算符
拷贝控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,须要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用! 复制构造函数: ...
随机推荐
- Cookie设置HttpOnly,Secure,Expire属性
在eclipese中创建Web工程时,有个dynamic web module version选项,首先解释下这个选项的意思: http://stackoverflow.com/questions/3 ...
- Azure 负载平衡器新分发模式
Yves Pitsch Azure 网络首席项目经理 Azure负载平衡器是一种第四层(TCP.UDP)类型的负载平衡器,它可以将传入流量分发到云服务中正常运行的服务实例上,或者分发到负载平衡器集内所 ...
- Xcode7下载地址
XCode 7 7.3.1:https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_7.3. ...
- 《深入Java虚拟机学习笔记》- 第2章 平台无关
Java虚拟机学习笔记(二)平台无关
- JSP文件上传代码
一.首先建立一个上传的界面,取名为a.jsp,代码如下 <%@ page contentType="text/html; charset=utf-8" language=&q ...
- POJ2104 K-th Number 划分树 模板题啊
/*Source Code Problem: 2104 User: 96655 Memory: 14808K Time: 1282MS Language: G++ Result: Accepted S ...
- Tomcat 7 Connector 精读(2) CoyoteAdapter
这个适配器类只讲2个方法,构造方法中我们看到一个适配器对象有自己关联的连接器类. 其中Service的重要任务就是讲客户端端请求交给容器. public void service(org.apache ...
- codeforce 606A - Magic Spheres
题意:a,b,c三种球,能把俩个一样的球变成另一颜色不一样的球.给你目标x,y,z,问能否经过变化至少达打目标. #include<iostream> #include<stdio. ...
- leetcode@ [127] Word Ladder (BFS / Graph)
https://leetcode.com/problems/word-ladder/ Given two words (beginWord and endWord), and a dictionary ...
- Dijkstra in python
下面是一段由python实现的Dijkstra算法,一些地方的处理实在非常棒,相比于C,代码的数量已经缩减到了60行,所以我想通过本文简单的介绍一下这段代码的细节之处,首先给出源程序: from sy ...