码迷,mamicode.com
首页 > 其他好文 > 详细

构造、析构、赋值运算:条款5-条款12

时间:2018-12-05 00:12:09      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:const   创建   修改   绑定   类对象   named   自动   ssi   新特性   

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

编译器为class默认创建6个函数:

  • default构造函数
  • copy构造函数
  • move构造函数
  • copy assignment操作符
  • move assignment操作符
  • 析构函数
struct A { 
    A() {}                                                 //default构造函数
    A(const A& a) {}                                //copy构造函数
    A(A&& a) {}                                       //move构造函数
    A& operator=(const A& other) {}      //copy assignment操作符
    A& operator=(A&& a) {}                    //move assignment操作符
    ~A() {}                                              //析构函数
};
  • 如果自己构造了带参数的构造函数,编译器不会产生default构造函数
  • base class如果把拷贝构造函数或者赋值操作符设置为private,不会产生这两个函数
  • 含有引用成员变量或者const成员变量不产生赋值操作符
class NamedObject{
private:
    std::string& str;//引用定义后不能修改绑定对象
    const std::string con_str;//const对象定义后不能修改
};

条款6:若不想使用编译器自动生成的函数,就该明确拒绝

将默认生成的函数声明为private,或者C++ 11新特性"=delete"

class Uncopyable{
    //Uncopyable(const Uncopyable&) = delete;                        //拒绝使用默认
    //Uncopyable& operator= (const Uncopyable&) = default;   //使用默认
private:
    Uncopyable(const Uncopyable&);
    Uncopyable& operator= (const Uncopyable&);
}

条款7:为多态基类声明virtual析构函数

  • 给多态基类应该主动声明virtual析构函数
    • 当子类对象经由一个父类指针删除时,如果父类带有一个non-virtual析构函数,可能会使得对象的子类成分没有被销毁。
  • 非多态基类,没有virtual函数,不要声明virtual析构函数
    • 没有virtual函数的类一般不做基类,为其声明vitual会导致在创建对象时,C++编译器会给对象添加一个vptr指针,类中创建的虚函数的地址会存放在一个虚函数表中,vptr指针就是指向這个表的首地址。

构造、析构、赋值运算:条款5-条款12

标签:const   创建   修改   绑定   类对象   named   自动   ssi   新特性   

原文地址:https://www.cnblogs.com/narjaja/p/10067735.html

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