C++之const修饰符
- Use const whenever possible。——《Effective C++》
- const普通变量:
1 const int bufSize = 512 //缓冲区大小 2 const double pi; //错误: 未初始化的常量
- const指针:
1 char greeting[] = "Hello"; 2 char* p = greeting;//non-const pointer,non-const data 3 const char* p = greeting;//non-const pointer,const data 4 char* const p = greeting;//const pointer,non-const data 5 const char* const p = greeting;//const pointer,const data
- const函数形参:
- 对const 指针传递和const引用传递,防止函数内部修改传递数据。const修饰值传递无意义。
1 void StringCopy(char *strDestination, const char *strSource); 2 void Func(const A &a);//其中,A为用户自定义的数据类型。
- 对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递” ,目的是提高效率。例如将 void Func(A a) 改为 void Func(const A &a)。
- 对const 指针传递和const引用传递,防止函数内部修改传递数据。const修饰值传递无意义。
- const函数返回值:
- 类似函数形参。
- const类成员函数:
- 改善C++程序效率的一个根本办法是使用const引用传递,但是此方法可行的前提是,我们有const成员函数处理取得的const对象(未经修饰的)。
1 class A 2 { 3 public: 4 int Get() const {return m_n;}; 5 private: 6 int m_n; 7 }; 8 9 void f(const A& a) 10 { 11 int tmp = a.Get();//Get若为非const函数,则无法处理const引用对象! 12 }
- 任何不会修改数据成员的函数都应该声明为 const 类型。
1 class Stack 2 { 3 public: 4 void Push(int elem); 5 int Pop(void); 6 int GetCount(void) const; //const 成员函数 7 private: 8 int m_num; 9 int m_data[100]; 10 }; 11 12 int Stack::GetCount(void) const 13 { 14 ++ m_num; //编译错误,企图修改数据成员 m_num 15 Pop(); //编译错误,企图调用非 const 函数 16 return m_num; 17 }
- 改善C++程序效率的一个根本办法是使用const引用传递,但是此方法可行的前提是,我们有const成员函数处理取得的const对象(未经修饰的)。
- 参考:《Effective C++》、《高质量C/C++编程》