了解C++默默编写并调用哪些函数
在C++中,如果你写下
1 classEmpty{…};
1 classEmpty{ 2 public: 3 Empty();//default构造函数 4 Empty(constEmpty& rhs){……};//copy构造函数 5 ~Empty(){…}//析构函数 6 Empty&operator=(constEmpty& rhs){…};//copy赋值运算符 7 };
1 Empty e1; //default构造函数 2 Empty e2(e1); //析构函数 3 e2=e1; //copy构造函数,copy赋值运算符
1 template<typename T> 2 classNamedObject{ 3 public: 4 NameObject(constchar* name,const T& value); 5 NameObject(const std::string& name,const T& value); 6 private: 7 std::string nameValue; 8 T objectValue; 9 }; 10 NamedObject<int> no1("Smallest Prime Number",2); 11 NamedObject<int> no2(no1);//调用copy构造函数
1 template<typename T> 2 classNamedObject{ 3 public: 4 NamedObject(std::string& name,const T& value); 5 private: 6 std::string& nameValue; 7 const T objectValue; 8 };
1 std::string newdog("Persephone"); 2 std::string olddog("Satch"); 3 NamedObject<int> p(newdog,2); 4 NamedObject<int> s(olddog,36); 5 p=s; //现在p要发生什么事?
赋值前,p.nameValue和s.nameValue都指向string对象。p该如何变化?是reference改变吗?C++不允许让 reference改指向不同的对象。是string对象被修改吗?那么将影响其他持有指针或引用而且指向该string的其他对象。对此,C++拒绝编译那一行赋值动作。
而如果你不想使用这些自动生成的成员函数,可以在private成员里面声明他们,而不提供定义。
1 class HomeForSale{ 2 public: 3 …… 4 private: 5 HomeForSale(const HomeForSale); 6 HomeForSale& operator=(const HomeForSale); 7 };
有了上述class定义,当用户企图拷贝HomeForSale对象,编译器会阻挠他,如果你不慎在member函数或friend函数内那么做,轮到链接器发出抱怨。
将链接期错误移至编译期是可能的(而且那是好事,毕竟愈早发现错误愈好),只要将copy构造函数和copy赋值运算符声明为private就可以办到,但不是HomeForSale自身,而是在一个专门为了阻止copying动作而设计的base class非常简单。
1 class Uncopyable{ 2 protected: 3 Uncopyable() {} //允许derived对象构造和析构 4 ~Uncopyable(){} 5 private: 6 Uncopyable(const Uncopyable&); //但阻止copying 7 Uncopyable& operator=(const Uncopyable&); 8 };
参考资料:《Effective C++》
转载于:https://www.cnblogs.com/Lighters-c/p/6060322.html
了解C++默默编写并调用哪些函数相关推荐
- EffectiveC++详解:条款05-了解C++默默编写并调用哪些函数
文章目录 条款05-了解C++默默编写并调用哪些函数 当我们写了一个空类,意味着什么 编译器什么时候拒绝生成拷贝赋值运算符 总结 @Author:CSU张扬 @Email:csuzhangyang@g ...
- Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)
Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls) 条款05:了解C++默默编写 ...
- 条款05:了解C++默默编写并调用哪些函数
空类 如果你没有声明,编译器会为它声明一个default构造函数,copy构造函数,析构函数,赋值操作符. class Empty{}; //--------- class Empty { publi ...
- C++编译器默默编写并调用哪些函数
什么时候empty class(空类)不再是个empty class呢?当C++处理过它之后,是的,如果你自己没有声明,编译器就会为它声明(编译器版本)一个copy构造函数.一个copy assign ...
- Effective C++条款05:了解C++默默编写并调用哪些函数
class Empty{};class Empty{Empty(){};Empty(const Empty& rhs){};~Empty(){};Empty& operator=(co ...
- [Effective C++读书笔记]005_条款05_了解C++默默编写并调用哪些函数
其实这一点在C++的基础类入门书,如C++ primer里面也有说过,不过很少有人去注意而已,作者把这一点提出来,是为了提醒我们. 这一条款的内容如下:就是说当你书写下面的[代码片段1]的时候,其实经 ...
- 条款5:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)...
1.default costructor / copy constructor / copy assignment 者三者的区别? 特别是copy constructor & copy as ...
- Effective C++:条款05:了解C++默默编写并调用哪些函数 (Know what functions C++ silently writes and calls.)...
编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 转载于:https://www.cnblogs.com/elite/arc ...
- Effective C++ 学习笔记 条款05 了解C++默默编写并调用了哪些函数
当写下一个空类时,编译器会为你合成一个拷贝构造函数.一个拷贝赋值运算符.一个析构函数,如没有声明其他的构造函数,编译器会合成一个默认构造函数.这些都是inline的public成员. 当类有一个引用成 ...
最新文章
- 谷歌启动AlphaFold商业化:成立新公司,专注AI新药开发技术
- 给定关键字不在字典中怎么解决_什么是字典?我们为什么要学它?你不知,现在你只需1分钟就可学会...
- 怎么把路由的#号去掉_VLAN应用篇系列:交换机VLAN间路由与传统单臂路由(子接口)方式...
- 针对plsql developer使用做的三个小设置
- Div+CSS布局入门教程(一) 页面布局与规划
- Google Go:初级读本
- 二分图判定(涂色问题)
- oracle迁移性能对比,SQL Server 2015与Oracle性能对比.doc
- NOIP2017普及组复赛 解题分析
- 企业抖音账号流量提升3步法,新号也能过百万播放量
- 注塑机服务器显示e011,深圳市产业导向目录(2005-2006年)
- java-net-php-python-jspm零担快跑物流管理系统计算机毕业设计程序
- 基于图数据库、图算法、图神经网络的 ID Resolution/ID Mapping 大数据分析方法与代码示例
- 非隔离AC-DC恒压开关电源控制驱动降压芯片功能应用及原理图参考
- 点击获取GOOGLE MAP地图上的经纬度坐标的方法
- 编译VirtualNES虚拟红白机
- ppspp android编译,安卓PSP模拟器 PPSSPP金手指
- 如何抓取各种网页上的图片
- 全国城市数据及地图数据-python爬取
- C 强制类型转换 char转int的小陷阱