zoukankan      html  css  js  c++  java
  • Effective C++ 读书笔记(1117):构造析构和赋值函数

    Item11--如果class内动态置有内存,请为此class声明一个copy constructor和一个assignment运算符

    也就是说,class内有一个指针,使用new来动态申请内存的情况下,默认的copy constructor和assignment运算符是浅拷贝(bitwise copy),也即直接拷贝指针的值,可能会有内存泄露的危险
    String a("hello");{String b("hello");b=a;}当b=a,b原来的内容变成野指针,当b结束作用域后a的内容也被删除。这真是灾难
    所以条款11告诉我们:class内有指针需要申请内存,则自己撰写拷贝构造和赋值函数,避免内存泄露和异常。

    Item 12 -- 在constructor中尽量以initialization动作取代assignment动作

    原因:
    1,const、reference只能通过初始化列表进行初始化
    2,从效率角度。对象的构造分成两阶段:初始化data member(可以根据初始化列表进行,无则初始化为0等默认值),执行被调用的构造函数。所以执行assignment实际执行了两次赋值。
    3,基本类型的non-const, non-reference对象,初始化和赋值之间没有2所说的区别

    Item 13 -- initialization中的members初始化次序应该和其在class内的声明次序相同

    原因也很容易理解:编译器构造和析构的顺序是相反的,编译器不可能针对初始化列表中的顺序进行初始化,否则重载不同初始化顺序的构造函数会让编译器头晕的。编译器内部确定是按照class内的声明次序,如果初始化列表不同,很可能初始化列表的数据会错误。
    核心:先按class内声明成员默认赋值,然后调用初始化参数列表进行初始化。

    Item 14 --  总是让base class拥有virtual destructor

    原因很容易理解:基类指针指向具体派生类,delete基类指针的时候,需要虚函数进行多态。
    tip:如果析构函数不是虚的,那么基类和派生类的析构都要调用 ,先调用派生,再调用基类
    tip2
    :虚函数要占用class空间,要综合考量

    Item 15 -- 令operator= 传回"*this的reference"

    原因:objA = objB = objC这种连续的重载=号行为
    e.g.

    String& String::operator =(const String&rhs)
    {

    return *this;
    }

     

    Item16-- 在operator=中为所有的data members设定(赋值)内容

    原因:编译器会默认为你生成一个operator=,采用bitwise,所以最好都是自己写一个
    注意点:继承机制的引入,Base中的私有成员Derived对象无法访问
    要么 Base::operator=(rhs),要么staqtic_cast<Base&>(*this) = rhs两种方式解决

    Item17 -- 在Operator=中检查是否"自己赋值给自己"

    一般采用的方法:

    C& C::operator=(const C&rhs)
    {
    if(this==&rhs) return * this;
    }

    这主要是针对如何判断对象相等的问题,这里采用的是地址相等的方法

  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/liuchen/p/1582879.html
Copyright © 2011-2022 走看看