来源: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 Hackclass 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;}