#pragma once
#include <string>
using std::string;
/*
条款05
编译器会为class自动创建 default构造函数,一个析构函数,一个copy构造函数,一个 copy assignment操作符
*/
/*
1. 当成员变量有 const 变量, 编译器无法自动生成default构造函数; 不会自动生成 copy assignment操作符函数
必须自己主动添加构造函数和copy assignment操作符函数
2. 成员变量为引用时也是如此。
3. 如果base class将copy assignment操作符声明为private, 编译器将拒绝为derived class 生成copy assignment操作符
*/
class CTest
{
public:
CTest(int nVal = 0, double dVal = 0.0):m_nVal(nVal),m_dVal(dVal){}
public:
const int m_nVal;
double &m_dVal;
};
inline void TestAll()
{
CTest t1;
}
/*
条款06 禁止编译器自动生成函数,可将相应的函数声明为private并且不予实现。
*/
class CMyClass
{
private:
CMyClass(const CMyClass &); // 禁止 copy 构造函数
CMyClass& operator=(const CMyClass &); // 禁止 copy assignment操作符函数
};
// 方法2
class IUncopyable
{
protected:
IUncopyable(){}
~IUncopyable(){}
private:
IUncopyable(const IUncopyable &);
IUncopyable & operator=(const IUncopyable &);
};
class CXxx : private IUncopyable
{
};
// 方法3 使用 boost 库里面的 nocopyable class
/*
条款06
polymorphic base class 应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。
class的设计目的如果不是作为base classes使用,或者不是为了具备多态性,就不应该声明virtual析构函数。
*/
class CPure
{
public:
virtual ~CPure() = 0; // 小技巧,应该在cpp文件中实现该方法; CPure::~CPure(){}
};
effective c++ 05,06,07
最新推荐文章于 2020-07-22 11:14:00 发布