1.默认构造函数和explicit关键字的使用
2016-06-04 09:26
381 查看
1.默认构造函数
C++里面有默认的构造函数,这样的构造函数要么不带有参数,要么每个参数都有相应的缺省值。下面我们来看一个例子:
上面的我们定义了一个A类型的对象,使用了默认的构造函数。下面我们再来看一段代码:
2.explicit关键字
explicit关键字可以阻止对象被隐形类型转换,有些时候编译器会做一些人们无法预知的类型转换,下面我们来看一段代码:
C++里面有默认的构造函数,这样的构造函数要么不带有参数,要么每个参数都有相应的缺省值。下面我们来看一个例子:
#include <iostream> using namespace std; class A { public: A() { } }; int main() { A aObj1(); return 0; }
上面的我们定义了一个A类型的对象,使用了默认的构造函数。下面我们再来看一段代码:
#include <iostream> using namespace std; class A { public: A(int i = 0, bool b = true) { } }; int main() { A aObj1(); return 0; }
2.explicit关键字
explicit关键字可以阻止对象被隐形类型转换,有些时候编译器会做一些人们无法预知的类型转换,下面我们来看一段代码:
#include <iostream> using namespace std; class B{ public: B(int x = 0, bool b = true) { } }; void doSomething(B bObject) { } int main() { B bObj1; doSomething(bObj1); // 没有问题 B bObj2(28); // 也没有问题 // 我去,竟然也没有问题,但是默认发生了隐式的转换(把一个整形隐式的转换成的一个B类型),但是这个是我们不想要 doSomething(28); doSomething(B(28)); // 没有问题 return 0; }红色加粗的代码在编译的时候没有出错是因为 int 和 B隐式的发生了类型转换,是不是很可怕,我们可以使用explicit关键字来阻止,看下面代码:
#include <iostream> using namespace std; class B{ public: explicit B(int x = 0, bool b = true) { } }; void doSomething(B bObject) { } int main() { B bObj1; doSomething(bObj1); // 没有问题 B bObj2(28); // 也没有问题 // 报错:error C2664: 'doSomething' : cannot convert parameter 1 from 'const int' to 'class B' doSomething(28); doSomething(B(28)); // 没有问题 return 0; }所以一般构造函数之前添加一个 explicit 关键字会使得程序安全性更高,不会发生类型的隐式转换。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 详解C#编程中构造函数的使用
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++中explict关键字用法
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例