码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-10-31 01:13:39      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   sp   数据   div   on   log   cti   

一、如果用户没有提供构造函数、copy构造函数、copy assignment操作符和析构函数,当且仅当这些函数被需要的时候,编译器才会帮你创建出来。编译器生成的这些函数都是public且inline。

  当你写下这样一个类的时候:

class Empty {};

  如果上述的函数是被需要的话,那么编译自动会帮你把类修改为,如下:

class Empty
{
public:
    Empty() {...};    //这里进行数据成员的默认初始化,如果有虚函数的话,这里还会配置好虚函数表
    Empty(const Empty& rhs) {…}
    ~Empty() {..} //这里先对数据成员析构,然后销毁虚函数表等
    Empty& operator=(const Empty& rhs) {...}
};

  有待在inside c++ object model中细致考证(注:其实对于copy构造函数、赋值操作符重载,并不是你自己没有编写,当需要被调用的时候就被生成!如果编译器判断这个类的需要生成的copy构造函数等是trival,平凡的copy构造函数,那么编译器也不会生成copy‘构造函数等,只会在其需要copy构造函数的或者赋值操作符重载的地方,施行逐位拷贝)

二、注意,编译器产出的析构函数是个non-vitual,除非这个class的base class自身声明有virtual析构函数。

三、注意,在一个“内含reference成员”的class内支持赋值操作,必须自己定义copy assignment操作符。对于“内含const成员”的class,同样如此。

  不然编译器会提示:

non-static reference member ‘std::string& A::m_name’, can’t use default assignment operator

或者

non-static const member ‘const string A::m_name’, can’t use default assignment operator

四、如果某个base class将copy assignment操作符声明为private,编译器将拒绝为其derived class 生成一个copy assignment操作符。

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

标签:style   blog   color   sp   数据   div   on   log   cti   

原文地址:http://www.cnblogs.com/wangjzh/p/4064066.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!