首页 > 代码库 > 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);}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。