Accustoming_Yourself_to_C++
//条款1 用const,enum,inline 替换#define
//1 const 替换 #define 常量
/*
* 对于浮点数,const double 代码小
* 在class内不能提供封装性
* #defien函数用
* template<typename>
* inline dectltype(auto) function 替换
*/
#include<cstring>
#include<string>
class CTextBlock
{
public:
size_t length() const;
private:
private:
char* pText;
mutable size_t textLength;
mutable bool lengthIsValid;
};
size_t CTextBlock::length() const
{
if (!lengthIsValid)
{
//function const 由于正在通过常量对象访问“textLength”,因此无法对其进行修改
//解决:mutable
textLength = std::strlen(pText);
lengthIsValid = true;
}
return textLength;
}
//解决 代码只有返回类型的重复问题:令non-const function 调用另一个 const-function
class TextBlock
{
public:
const char& operator[](std::size_t position) const
{
//bounds chexking
//log access data
//verify data integrity
return text[position];
}
char& operator[](std::size_t position)
{
return
const_cast<char&>(//去掉 返回值的const
static_cast<const TextBlock&>//调用 operator[]()const
(*this)[position]);
}
private:
std::string text;
};
//因为为 const 成员函数承若绝不改变其对象的逻辑状态,So don't const function call non-const function
//条款四:Make sure that objects are initialized before they're used
/*
*在构造函数中使用()初始化:减少一次copy
问题:如果某编译单元(cpp)内的某个non-local static对象的初始化
使用了另一个编译单元(cpp)的non-local static对象
c++对“定义于不同编译单元内的non-local static对象”的初始化次序并无明确定义
解决:用local static 替换 non-local static(已经被未命名空间取代)
c++保证:函数内的local static 对象会在“该函数被调用期间”“首次遇上该对象的定义”时被初始化
*/
class FileSystem
{
public:
std::size_t numDisks() const;
};
inline FileSystem& tfs() //tfs:the file system
{
static FileSystem fs;
return fs;
}
class Directory
{
public:
Directory() = default;
Directory(std::string params);
};
Directory::Directory(std::string params)
{
std::size_t disks = tfs().numDisks();
}
inline Directory& tempDir()
{
static Directory td;
return td;
}
int main()
{
return 0;
}