[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_类和数据抽象 --拷贝构造函数、赋值运算符
拷贝控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,须要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用! 复制构造函数: ...
随机推荐
- [POJ 2420] A Star not a Tree?
A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4058 Accepted: 200 ...
- vim 退出保留显示的内容
/*************************************************************************** * vim 退出保留显示的内容 * 声明: * ...
- (七)学习MVC之CodeFirst迁移更新数据库
1.首先在程序包管理控制台输入:enable-migrations -force ,然后回车: 问题1: The EntityFramework package is not installed on ...
- (六)学习MVC之标签a提交页面
标签<a>如何做到与<input type="submit"/>一样有提交页面信息的效果? @using (Html.BeginForm("Log ...
- Simple XML
官网:http://simple.sourceforge.net/home.php 截止目前最新版本:simple-xml-2.7.1.jar 特点: jar lib文件只有360K左右的大小 它的使 ...
- ORACLE的sign函数和DECODE函数
比较大小函数 sign 函数语法:sign(n) 函数说明:取数字n的符号,大于0返回1,小于0返回-1,等于0返回0 示例:一.select sign( 100 ),sign(- 100 ),sig ...
- 扩展类加载器-------改变JAVA的父优先类加载顺序
java的类加载机制默认情况下是采用委托模型:当加载某个类时JVM会首先尝试用当前类加载器的父类加载器加载该类,若父类加载器加载不到再由当前类加载器来加载,因此这种模型又叫做“父优先”模型. 但是在实 ...
- 本地连接图标消失;修改地址IP地址
(1)网络连接中没有本地连接,电脑无法进行拨号.无法上网,右键点击“网上连接”选择“属性”,弹出的“网络连接”文件夹中没有本地连接的图标,类似情况处理起来要相对复杂些了,我们逐一判断故障原因,在想办法 ...
- SQL Server 2005如何远程连接数据库?
SQL Server 2005如何远程连接数据库? 方法/步骤 1 在配置工具中的服务和远程连接的外围应用配置器 --->远程连接-->本地连接和远程连接-->同时使用TCP/I ...
- NOIP2014 生活大爆炸版石头剪刀布
生活大爆炸版石头剪刀布 (rps.cpp/c/pas) [问题描述] 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 ...