C++ primer读书笔记7-复制控制

来源:互联网 发布:文化部网络动漫黑名单 编辑:程序博客网 时间:2024/06/06 06:29
1 复制构造函数,赋值操作符,析构函数
这三者都是编译器会自动提供的函数,其中复制构造函数,赋值操作符是如果你没有自己编写,那么编译器就会提供。析构函数是不


管自己有没有实现,编译器都会提供一个合成构造函数,在释放对象的时候会先调用自己编写的构造函数,然后调用编译器合成的构


造函数。


2 IO类型的类没有复制构造函数


3 形参为非引用类型时候,函数的返回类型是非引用类型时候,这个时候都要用到复制构造函数。


4 初始化容器元素
vector<string> strs(4);
这样会先调用默认构造函数产生一个string对象,然后利用复制构造函数去初始化剩余的。


5 初始化数组元素
<1>如果没有为类类型数组提供元素初始化式,那么将会采用默认构造函数来初始化每个元素
<2>如果有用常会的花括号的数组初始化列表来提供显式的元素初始化式,则采用复制构造函数


6 合成复制构造函数
<1>合成复制构造函数直接复制内置类型的成员值
<2>类类型成员使用该类的复制构造函数来进行复制
<3>数组成员则将复制数组的每一个元素


7 禁止复制
<1>为了防止复制,类必须显式的声明其复制构造函数为private
<2>为了友元和成员进行复制,可以只声明私有复制构造函数,但是不去实现它


8 赋值操作符
赋值是2元运算,所以必须有两个形参,一个是对应的左操作数,一个是对应的右操作数。当操作符成为成员函数的时候,第一个操


作数被隐式的绑定到this指针。


9 关于赋值操作符的返回值
至于为什么会用到函数的返回值,这个其实很简单,有时候我们会遇到 a = b = c,这个时候 先执行 b = c会返回同类型的值,这


个时候就可以继续把值赋给a了。


A& operator = (A& right)
{
this.x = right.x;
//...
return *this;
}


10 析构函数使用的时候
<1> 撤销类对象的时候会自动调用
<2> 动态分配的对象,只有在指向该对象的指针被删除的 时候
<3> 容器中的元素,首先撤销小标为size()-1的元素,最后撤销小标是0的元素。


11 合成析构函数


不管有没有自己去写析构函数,系统都会为我们生成一个合成的构造函数。最后在释放对象的时候,先是执行自己写的构造函数,最


后执行合成构造函数。


12 关于智能指针
当几个类共享同一个内存区域时,可以采用智能指针来管理内存的释放。
class U_Ptr
{
friend class HasPtr
int *ip;
size_t use;
U_Ptr(int *p):ip(p),use(1){}
~U_Ptr{delete ip}
};
0 0
原创粉丝点击