在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赋值运算符

如果你设计了一个class,其构造函数要求有实参,你就无需担心编译器会为你添加一个无实参版本而覆盖掉你的版本

 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构造函数

编译器为NamedObject<int>所生成的copy赋值运算符,其行为基本上与copy构造函数如出一辙,但一般而言只有在生出的代码合法且有合适机会证明它有意义,其表现才会如先前所说。万一条件不符,编译器会拒绝为其生出operator=。
例如:

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++拒绝编译那一行赋值动作。

最后还有一种情况:    如果某个基类将copy赋值运算符声明为private,编译器将拒绝为其派生类生成copy赋值运算符。
毕竟编译器为派生类所生的copy赋值运算符想象中可以处理基类成分,但他们当然无法调用派生类无法调用的函数。

而如果你不想使用这些自动生成的成员函数,可以在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++默默编写并调用哪些函数相关推荐

  1. EffectiveC++详解:条款05-了解C++默默编写并调用哪些函数

    文章目录 条款05-了解C++默默编写并调用哪些函数 当我们写了一个空类,意味着什么 编译器什么时候拒绝生成拷贝赋值运算符 总结 @Author:CSU张扬 @Email:csuzhangyang@g ...

  2. 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++默默编写 ...

  3. 条款05:了解C++默默编写并调用哪些函数

    空类 如果你没有声明,编译器会为它声明一个default构造函数,copy构造函数,析构函数,赋值操作符. class Empty{}; //--------- class Empty { publi ...

  4. C++编译器默默编写并调用哪些函数

    什么时候empty class(空类)不再是个empty class呢?当C++处理过它之后,是的,如果你自己没有声明,编译器就会为它声明(编译器版本)一个copy构造函数.一个copy assign ...

  5. Effective C++条款05:了解C++默默编写并调用哪些函数

    class Empty{};class Empty{Empty(){};Empty(const Empty& rhs){};~Empty(){};Empty& operator=(co ...

  6. [Effective C++读书笔记]005_条款05_了解C++默默编写并调用哪些函数

    其实这一点在C++的基础类入门书,如C++ primer里面也有说过,不过很少有人去注意而已,作者把这一点提出来,是为了提醒我们. 这一条款的内容如下:就是说当你书写下面的[代码片段1]的时候,其实经 ...

  7. 条款5:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)...

    1.default costructor  / copy constructor / copy assignment 者三者的区别? 特别是copy constructor & copy as ...

  8. Effective C++:条款05:了解C++默默编写并调用哪些函数 (Know what functions C++ silently writes and calls.)...

    编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 转载于:https://www.cnblogs.com/elite/arc ...

  9. Effective C++ 学习笔记 条款05 了解C++默默编写并调用了哪些函数

    当写下一个空类时,编译器会为你合成一个拷贝构造函数.一个拷贝赋值运算符.一个析构函数,如没有声明其他的构造函数,编译器会合成一个默认构造函数.这些都是inline的public成员. 当类有一个引用成 ...

最新文章

  1. 谷歌启动AlphaFold商业化:成立新公司,专注AI新药开发技术
  2. 给定关键字不在字典中怎么解决_什么是字典?我们为什么要学它?你不知,现在你只需1分钟就可学会...
  3. 怎么把路由的#号去掉_VLAN应用篇系列:交换机VLAN间路由与传统单臂路由(子接口)方式...
  4. 针对plsql developer使用做的三个小设置
  5. Div+CSS布局入门教程(一) 页面布局与规划
  6. Google Go:初级读本
  7. 二分图判定(涂色问题)
  8. oracle迁移性能对比,SQL Server 2015与Oracle性能对比.doc
  9. NOIP2017普及组复赛 解题分析
  10. 企业抖音账号流量提升3步法,新号也能过百万播放量
  11. 注塑机服务器显示e011,深圳市产业导向目录(2005-2006年)
  12. java-net-php-python-jspm零担快跑物流管理系统计算机毕业设计程序
  13. 基于图数据库、图算法、图神经网络的 ID Resolution/ID Mapping 大数据分析方法与代码示例
  14. 非隔离AC-DC恒压开关电源控制驱动降压芯片功能应用及原理图参考
  15. 点击获取GOOGLE MAP地图上的经纬度坐标的方法
  16. 编译VirtualNES虚拟红白机
  17. ppspp android编译,安卓PSP模拟器 PPSSPP金手指
  18. 如何抓取各种网页上的图片
  19. 全国城市数据及地图数据-python爬取
  20. C 强制类型转换 char转int的小陷阱

热门文章

  1. MySQL 用户与授权管理详解
  2. JS-arguments分析
  3. magento模板区块--首页content区块
  4. WatchStor观察:思科携EMC等合作伙伴 圈地数据中心市场
  5. cisco2950交换机密码恢复
  6. UIButton 的不同设置和UITextField 的默认值(修改默认值)
  7. 新年新技术:MongoDB 3.0
  8. MySQL02-升级
  9. mac gource_如何使用Gource显示项目的时间表
  10. css游戏代码_介绍CSSBattle-第一个CSS代码搜寻游戏