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 function
const 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 function
class 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 function
extern 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 function
extern void ConstMemFunctionChangeClassMember();

//4 const object can only call const member function
//  const object can not call non const member function
extern 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);
}

  

       

 

       

effective c++ 条款3 use const whereever you can,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。