Effective C++ 学习笔记(1) : 语言联邦、弱化预编译器、const、初始化

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cppyin/article/details/6230198

来源:Effective C++ P11 ~ P23
级别:200


C++没有绝对适当的语言用法
注意:C++是一个四大语言联邦国:C、Object-Oriented C++、Template C++、STL。

 

 

const double AspectRatio = 1.653;
注意:常量问题上多用编译器而少用预处理器。预处理会额外增加debug时追踪变量的时间、使程序变胖。除非编译老到对const的处理有额外内存开销,否则没必要定义宏常量。

 

 

class GamePlayer { static const int NumTruns = 5; };
注意:类的常量成员,往往可以使用静态的,来节省内存开销。

 

注意:如果要取上面的地址,则不可以写这种声明式,而应该声明与定义式分开写:
class CostEstimate { static const double FudgeFactor; }; // 头文件内
const double CostEstimate::FudgeFactor = 1.35; // 实现文件内

 


The Enum Hack
class GamePlayer { enum { NumTurns = 5 }; };
注意:如果不想别人获取常量成员的地址,可以使用The Enum Hack方式在编译器中拒绝这种用法。
并且Enum和#define一样,都可以避免因为编译器太老而在使用const时额外分配内存。

 


const Rational operator* (const Rational& lhs, const Rational& rhs);
注意:这是一个带有非左值约束的返回值的函数,这使得Rational a,b,c; (a * b) = c;遭到编译器拒绝。

 

 

编译器对const成员函数满足bitwise constness
注意:编译器满足bitwise constness但不满足logical constness,所以会出现下面的状况:
class CTextBlock {
public:
    char& operator[] (std::size_t position) const { return pText[position]; } // const成员函数
private:
    char* pText;
};

const CTextBlock cctb("Hello");
char* pc = &cctb[0];
*pc = 'J'; // now cctb is "Jello".

 


logical constness
注意:bitwise constness:不更改对象内的任何一个bit,但会出现上面的问题。
logical constness:一个const成员函数可以修改它所处理的对象的某些bits,但要保证在用户使用中侦测不出。
可使用mutable关键字解除bitwise constness:
class CTextBlock {
public:
    std::size_t length() const;
private:
    mutable std::size_t textLength;
    mutable bool lengthIsValid;
};
std::size_t CTextBlock::length() const
{
    if (!lengthIsValid) {
        textLength = std::strlen(pText);
        lengthIsValid = true;
    }
    return textLength;
}

展开阅读全文

没有更多推荐了,返回首页