构造析构赋值运算:条款5-条款12
Posted narjaja
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造析构赋值运算:条款5-条款12相关的知识,希望对你有一定的参考价值。
条款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的主要内容,如果未能解决你的问题,请参考以下文章
条款09:不要在构造过程和析构过程中调用 virtual 方法