关于复制控制

来源:互联网 发布:lol for mac 汉化 编辑:程序博客网 时间:2024/06/13 07:44

复制控制包括复制构造函数、赋值操作符和析构函数。

1. 默认情况下,编译器会为我们自动合成默认构造函数、默认复制构造函数、默认赋值操作和析构函数,一旦用户定义了自己的相关函数,则编译器就不会自动合成默认函数。

2. 为了防止被复制,可以将类的复制构造函数声明为privateC++iostream类就采用了此机制,其copy构造函数和copy assignment操作符被声明为private而且没有定义。

3. 不要再构造函数和析构函数中条用virtual函数。因为在derived class构造时,首先调用base class的构造函数,base class构造期间virtual函数绝对不会下降到derived class阶层,因此调用的仍然是base class的相关函数。同样析构函数中析构函数调用的也是base class的相关函数,即没有实现动态绑定。

4. 处理好“operator=”中的“自我赋值”

class Bitmap {...};

class Widget

{

       ...

private:

       Bitmap *pb;

};

//危险做法

Widget& Widget::operator=(const Widget& rhs)

{

       delete pb;

       pb = new Bitmap(*rhs.pb);

       return *this;

}

//正确做法

Widget& Widget::operator=(const Widget& rhs)

{

       if(this == &rhs) return *this;  //证同测试

       delete pb;

       pb = new Bitmap(*rhs.pb);

       return *this;

}

5. copy构造函数和copy assignment函数应该确保赋值“对象内的所有成员变量”及“所有base class成分”。

6. 赋值操作符返回对坐操作数的引用,加法操作符返回一个右值(非引用)。

7. 关于深拷贝与浅拷贝。大凡有指针成员的类必须定义自己的复制控制,因为合成的满足不了要求。C++中管理指针成员通常有三种做法:

(1)      采用常规指针型行为。此种做法有缺陷,即所谓的浅拷贝。

(2)      采用“智能指针”行为。指针所指对象是共享的,能够防止悬垂指针。

(3)      采用值型行为。指针所指的对象是唯一的,有每个类对象独立管理,即所谓深拷贝。

原创粉丝点击