Effective C++ 条款5~7
程序员文章站
2022-07-12 17:52:46
...
条款5. 认知c++默认提供的类函数
如果你只是声明一个empty class ,c++编译器也会默认提供四个函数
class Empty{
public:
Empty();
Empty(const Empty& rhs);
~Empty();
Empty& operator=(const Empty& rhs);
}
//defult构造函数 如果你已经定义一个新的构造函数,则不会提供default
//copy构造函数
//析构函数
//copy assignment操作符
//注意区分:
每次存在新对象的构造时则调用copy构造函数:Empty e2(e1) ; 或者 Empty e2 = e1;
而对于已经存在的对象这调用copy assignment: Empty e3; e3 = e1;
/*
注:
何时编译器不会提供默认重载的operator= ? 思考下为什么?
1.class 成员变量是reference //C++reference不允许reference指向不同对象
或者:
2.class 成员变量存在const修饰
==》 这时候需要我们重新定义operator = 的函数
-
条款6.如果不想使用编译器自动生成的函数则需要明确拒绝
目的: 阻止class实例被再一次复制
解决: 私有化copy构造和operator=
class HomeForSale{
public:
private:
;//在private中 仅仅声明 copy构造和赋值运算符
HomeForSale(const HomeForSale& );
HomeForSale& operator=(const HomeForSale&);
}
/*
注释:
但是类的friend函数 member函数仍然可以调用private,如果使用了它们,那么在编译期间将会得到linkage error ===》 这里我不太明白 为什么会报错呢?
book P39
*/
-
条款7.多态基类声明virtual析构函数
如果对多态的机制有所了解的话,我们很容易的知道virtual 析构函数的目的。
目的: delete pointer时出现局部销毁的情况,只把基类的成分销毁,从而导致资源泄漏
其他:
vptr virtual table pointer
vtbl virtual table ====》 book P42
使用case:
1.带有多态 polymorphic的base class 需要声明virtual 析构函数。此外如果class 带有任何virtual函数,也应该拥有virtual析构函数
2.如果class的设计目的不是为了作为base class 或者 不是为了具备多态性,就不应该声明为virtual函数
推荐阅读
-
Effective C++ 笔记:条款 31 将编译关系降至最低
-
Effective Modern C++ 条款32 对于lambda,使用初始化捕获来把对象移动到闭包
-
Effective Modern C++ 条款23 理解std::move和std::forward
-
Effective Modern C++ 条款37 在所有路径上,让std::thread对象变得不可连接(unjoinable)
-
Effective Modern C++ 条款38 意识到线程句柄的析构函数的不同行为
-
Effective Modern C++ 条款22 当使用Pimpl Idiom时,在实现文件中定义特殊成员函数
-
Effective C++ 笔记:条款 33 避免继承导致的名称遮掩
-
Effective C++:条款26:尽可能延后变量定义式的出现时间
-
Effective C++ 条款26 尽可能延后变量定义式的出现时间
-
Effective C++条款50:定制new和delete之(了解new和delete的合理替换时机)