C++学习笔记16,C++11中的显式的默认构造函数以及显示删除默认构造函数
2014-05-26 13:05
459 查看
在早期的C++中,如果需要一些接受一些参数的构造函数,同时需要一个不接收任何参数的默认构造函数,就必须显示地编写空的默认构造函数.例如:
同样的,C++还支持显式删除构造函数的概念。例如,你想定义一个类,这个类没有任何的构造函数,并且你也不想让编译器自动生成一个默认的空参数的构造函数,那么你就可以显式地删除默认构造函数。
编译结果:
可以看到,默认构造函数被删除了,那么,能不能删除一些其他的带参数构造函数呢?
其实这个问题有点多余,因为如果你不想要这个构造函数,你不定义这个带参的构造函数就OK了!
//tc.h
class A{ private: int i; public: A(){}; A(int ii); };但最好就是接口和声明分离,那么就是如下的定义
//tc,h class A{ private: int i; public: A(); A(int ii); };这样,就必须在实现中给出空参数构造函数的实现:
#include <iostream> #include "tc.h" using namespace std; A::A(){//必须给出其实现 }; A::A(int ii){ i=ii; } void A::show()const{ std::cout<<"this is A object!"<<std::endl; }; int main() { A a; a.show(); }为了避免手动编写空默认构造函数,C++11引入了显示默认构造函数的概念,从而只需在类的定义中编写空默认构造函数而不需要在实现文件中提供其实现:
//tc.h #ifndef tc_h_ #define tc_h_ class A{ private: int i; public: A()=default;//default A(int ii); void show()const; }; #endif
//tc.cpp #include <iostream> #include "tc.h" using namespace std; /* A::A(){//不必给出其实现 }; */ A::A(int ii){ i=ii; } void A::show()const{ std::cout<<"this is A object!"<<std::endl; }; int main() { A a; a.show(); }编译以及执行结果:
同样的,C++还支持显式删除构造函数的概念。例如,你想定义一个类,这个类没有任何的构造函数,并且你也不想让编译器自动生成一个默认的空参数的构造函数,那么你就可以显式地删除默认构造函数。
//tc.h #ifndef tc_h_ #define tc_h_ class A{ private: int i; public: A()=delete;//delete void show()const; }; #endif
//tc.cpp #include <iostream> #include "tc.h" using namespace std; /* A::A(){//必须给出其实现 }; A::A(int ii){ i=ii; }*/ void A::show()const{ std::cout<<"this is A object!"<<std::endl; }; int main() { A a; a.show(); }
编译结果:
可以看到,默认构造函数被删除了,那么,能不能删除一些其他的带参数构造函数呢?
其实这个问题有点多余,因为如果你不想要这个构造函数,你不定义这个带参的构造函数就OK了!
相关文章推荐
- C++学习笔记16,C++11中的显式的默认构造函数以及显示删除默认构造函数
- opencv [c++版] 学习笔记(1) 显示图像及播放视频
- Effective C++ 学习笔记(16)
- C++学习笔记->堆和栈的区别以及各个区的划分
- C++学习笔记16 static 实现单例模式
- No.1 iOS---UI学习第一天(笔记)(以及为什么模拟器上不显示我们添加的控件的解决办法)
- C++ Data Structure 学习笔记 (2011.5.2)——Cin的用法详解以及文件的读取
- ASP学习笔记(16)--Add and update对象以及date和time
- C++学习笔记36 模版的显式具体化(template specialization)和显式实例化(template instantiation)
- C++学习笔记18,C++11中的初始化列表构造函数(二)
- 学习笔记:Unity战斗卡牌游戏(二)-----滑动列表及克隆删除对象以及代码添加脚本
- C++对象模型学习笔记(二)--默认构造函数
- C++学习笔记-类5-浅拷贝和深拷贝以及赋值操作符的重载
- C++学习笔记16-2 编译器对构造函数的调用处理
- C/C++中strlen(),strcpy(),strcat()以及strcmp()的代码实现--学习笔记
- C++对象模型学习笔记(二)--默认构造函数
- 【C++学习笔记】优先级队列以及运算符重载
- 【Rails学习笔记】更新、显示和删除用户(涉及分页)(上)
- C++学习笔记(七):string类用法及使用大全——在C++11下的使用详解
- C++学习笔记36 (模板的细节明确template specialization)和显式实例(template instantiation)