C++ Explicit Constructors(显式构造函数)
2015-08-27 11:48
288 查看
http://www.cnblogs.com/xudong-bupt/p/3671972.html
C++ 为类(Class)提供了许多默认函数。如果自己没有申明,编译器会为我们提供一个copy构造函数、一个copy assignment操作符和一个析构函数。此外,如果没有申明任何构造函数,编译器会为我们申明一个default构造函数。很像下面的Empty类:
![](http://common.cnblogs.com/images/copycode.gif)
![](http://common.cnblogs.com/images/copycode.gif)
就像Effective C++说的,如果不想使用编译器自动生成的函数,就应该明确拒绝。
1.C++中的隐式构造函数
如果c++类的其中一个构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。
2.Explicit Constructors显式构造函数
为了避免上面提到的只有一个参数的构造函数采用的缺省转换操作,在构造函数前,使用Explicit 关键字修饰即可。
3.如下面的例子:
![](http://common.cnblogs.com/images/copycode.gif)
![](http://common.cnblogs.com/images/copycode.gif)
程序第11行,将int转换为B类型的对象,就是使用了隐式构造函数。因为B中存在一个只有一个参数的构造函数,且参数类型也是int。
如果在构造函数前加explicit ,表示为显示构造函数,则第11行编译不能通过。因为这时,就没有隐式构造函数啦。
C++ 为类(Class)提供了许多默认函数。如果自己没有申明,编译器会为我们提供一个copy构造函数、一个copy assignment操作符和一个析构函数。此外,如果没有申明任何构造函数,编译器会为我们申明一个default构造函数。很像下面的Empty类:
![](http://common.cnblogs.com/images/copycode.gif)
1 class Empty{ 2 public: 3 Empty(); 4 Empty(const Empty &rhs); 5 ~Empty(); 6 Empty& operator=(const Empty &rhs); 7 };
![](http://common.cnblogs.com/images/copycode.gif)
就像Effective C++说的,如果不想使用编译器自动生成的函数,就应该明确拒绝。
1.C++中的隐式构造函数
如果c++类的其中一个构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。
2.Explicit Constructors显式构造函数
为了避免上面提到的只有一个参数的构造函数采用的缺省转换操作,在构造函数前,使用Explicit 关键字修饰即可。
3.如下面的例子:
![](http://common.cnblogs.com/images/copycode.gif)
1 #include <iostream> 2 using namespace std; 3 class B{ 4 public: 5 int data; 6 B(int _data):data(_data){} 7 //explicit B(int _data):data(_data){} 8 }; 9 10 int main(){ 11 B temp=5; 12 cout<<temp.data<<endl; 13 return 0; 14 }
![](http://common.cnblogs.com/images/copycode.gif)
程序第11行,将int转换为B类型的对象,就是使用了隐式构造函数。因为B中存在一个只有一个参数的构造函数,且参数类型也是int。
如果在构造函数前加explicit ,表示为显示构造函数,则第11行编译不能通过。因为这时,就没有隐式构造函数啦。
相关文章推荐
- C语言中正切的相关函数总结
- 字符串组合问题(无重复)
- c++读取16进制文件
- POJ C++程序设计 编程题#2 魔兽世界之二:装备
- c++builder2010安装好了以后,好多功能键显示灰色
- C语言课程设计之招生管理系统
- Google C++测试框架系列:入门
- C++ 11智能指针之shared_ptr
- Item 15:资源管理类需要提供对原始资源的访问 Effective C++笔记
- C语言程序的编译以及库的构建与使用---查漏补缺笔记
- C++ 实现观察者(Observer)模式详解
- 在C语言中转换时间的基本方法介绍
- C++ vector,list,dequeue,stack 存储结构浅析
- 基于kubuntu的C/C++开发环境搭建
- 使用GDB命令行调试器调试C/C++程序
- 使用GDB命令行调试器调试C/C++程序
- 【深入理解C++】从初始化列表和构造函数谈C++的初始化机制
- C语言中读取时间日期的基本方法
- 字符串类的实现:构造函数、析构函数、复制构造函数和赋值操作符
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区