首页 > 代码库 > effective c++ 条款3 use const whereever you can

effective c++ 条款3 use const whereever you can

 1 const 传达的意思应该是这个变量是常量不能更改

 2 const 在 * 左边表示数据是const,在右边表示指针是const

   //   char greeting[] = "hello";   char* p = greeting;   //const *: const data   //* const: const pointer   char const *p1 = greeting;    // const data   char * const p2 = greeting;   // const pointer   const char * const p3 = greeting; // const data and pointer   //not correct p1 is const data   //(*p1)++;   //correct p1 is const data   p1++;   //correct p2 is const pointer   (*p2)++;   //not correct p2 is const pointer   //p2++;   //not correct p3 is  const data and pointer   //(*p3)++;   //not correct p3 is  const data and pointer   //p3++;

  3 

//1 const return value avoid the error like this// if( a+b = c) {...}//2 const parameter// it can avoid unintentioned change of parameter inside the functionconst Rational operator+ (const Rational& lhs, const Rational& rhs){   Rational tmp;   tmp.real = lhs.real + rhs.real;   tmp.img = lhs.img + rhs.img;   return tmp;}class Rational{   public:      float real;      float img;      Rational():real(0),img(0){};};

  4 const 成员函数

        声明方式

       作用

 

       ConstMemberFunc.h

//---------------------------------------------------------------------------#ifndef ConstMemberFuncH#define ConstMemberFuncH//---------------------------------------------------------------------------#include <cstddef>    //for std::size_t//1 const member function is used to operate const object// eg. we have a class Textblock and it has a operator[] which is const// when we have a const Textblock, the operator[] const will be used//2// a  const member function can change static class member// b  const member function can not change non-static class member// c  use mutable decleared variable can be changed in const member function//3 const member function can only call const member function//                        can not call non-const member function//4 const object can only call const member function//  const object can not call non const member functionclass TextBlock{   public:     static int TextBlockStaticNum;      char* text;       //1 const member function is used to operate const object       //  eg. we have a class Textblock and it has a operator[] which is const       //  when we have a const Textblock, the operator[] const will be used      const char& operator[](std::size_t position) const      {         return text[position];        //validate 3        //not correct        //3 const member function can only call const function        //                        can not call non-const  function       // print(); is the non-const function of vector      };      char& operator[](std::size_t position)      {         //return text[position];        //call const operator[] and remove constness for return        //not recommended         return const_cast<char&>(                                      // remove the const from the return of const []                                   static_cast<const TextBlock&>(*this) // add const to *this                                                             [position] // call const []                                   );      };      //2      // a  const member function can change static class member      // b  const member function can not change non-static class member      // c  use mutable decleared variable can be changed in const member function      int nonStaticOrMutable;      mutable int textLen;      const void constMemberFunctionTest(int Num) const      {         //a change static member         TextBlockStaticNum = 1;         //b         //not correct         //can not change non-static class member         //nonStaticOrMutable = 1;         //c  use mutable decleared variable can be changed in const member function         textLen = 2;      };      //3 const member function can only call const member function      //                        can not call non-const member function       void print()       {         ;       }      TextBlock( char charArray[])      {          text = charArray;          TextBlockStaticNum = 0;          textLen = 0;          nonStaticOrMutable=0;      };} ;//1 const member function is used to operate const object// eg. we have a class Textblock and it has a operator[] which is const// when we have a const Textblock, the operator[] const will be used//Test functionextern void ConstAndNonConstObjCallConstMemberFunction();//2// a  const member function can change static class member// b  const member function can not change non-static class member// c  use mutable decleared variable can be changed in const member functionextern void ConstMemFunctionChangeClassMember();//4 const object can only call const member function//  const object can not call non const member functionextern void ConstObjCanNotCallNonConstMember(const TextBlock & ctb){    //not correct    //print is not a const member function    //ctb.print();    //correct    const char t = ctb[0];};#endif

 ConstMemberFunc.cpp 

//---------------------------------------------------------------------------#pragma hdrstop#include "ConstMemberFunc.h"//---------------------------------------------------------------------------#pragma package(smart_init)#include "ConstMemberFunc.h"void ConstAndNonConstObjCallConstMemberFunction(){   TextBlock tb("test");   const TextBlock ctb("test");   //call non const operator[]   //correct   tb[0] = ‘1‘;   //call const operator[]   //not correct, since ctb is const operator   //ctb[0] = ‘1‘;   //normally this is used as a function call   //e.g. void print(const TextBlock ctb) //we do not change ctb in this function}void ConstMemFunctionChangeClassMember(){   TextBlock tb("test");   tb.constMemberFunctionTest(5);   const TextBlock ctb("test");   ctb.constMemberFunctionTest(2);}