- 作用:在該成員函數內無法修改數據成員,且不能調用非const成員函數。
- const 成員函數的基本定義格式
- 類內定義
- 類型 函數名(參數列表)const
{
函數體
}
- 類內聲明,類外定義
- 類內聲明:返回類型 函數名(參數列表)const
-
- 返回類型 類名::函數名(參數列表)const
{
函數體
}
*注意:內類聲明和類外定義都需要加上const,否則編譯器會認為不是同一個函數;
- 例子:
#include<iostream> using namespace std; class point { public: point(double x_val=0,double y_val=0); void print()const { //x = 5;這里會報錯:試圖修改數據成員x cout << "x:" << x << ",y:" << y; } ~point(); private: double x; double y; }; point::point(double x_val,double y_val):x(x_val),y(y_val) //參數不需要在使得x_val=0,y_val=0,否則會報錯 { } point::~point() { } int main() { point p(20, 8); p.print(); return 0; }
擴展:const的用法
- const修飾基本數據類型
- const在函數種的應用
- const在類中的應用
- const修飾類對象,定義常量對象
一、const修飾基本數據類型
- 修飾一般變量和數組
- const int ==int const
- const int a=5 == int const a=5
- const int arr[3]={1,2,4} == int const arr[3]={1,2,4}
- 與指針相結合
- const int* ptr1= arr[3] == int const * ptr1=arr[3];
- 很好理解的讀法(從右往左讀):ptr1是一個指針,指向const int 類型或者 int const 類型,倆者都表示指針指向的變量的內容不能被改變。
- int* const ptr2=arr[3] ;
- 從右往左讀:ptr2是一個const指針,指向int類型,表示指針指向不能被改變,但是指向的變量內容可以被改變。
- const int* const ptr3=test;
- 表示指針和指針指向的變量的內容都不能被改變,即ptr3只能指向變量test,且test的值不能改變。
- 與引用相結合
- int const &a=x ==const int &a=x;
- 和指針一樣表示a是x的引用且a的值和x的值都是常量,不能被更新。
二、const應用到函數中
- 作為參數的const修飾符
- 作為函數返回值的const修飾符
- 作為中的成員函數,最前面說的那種
三、const在類中的用法(類中定義常量)
- 使用枚舉類型定義常量
class test { enum{LEN1=10,LEN2=30}; int arr1[LEN1]; int arr2[LEN2]; };
- 使用const或static(*注意:c++11不允許在類聲明中初始化static非const變量)
class test { public: test(int x_val=1,int y_val=1); int a = 5; const int b = 6; static const int c = 7; static int d=8; //error ~test(); private: int x; int y; }; int test::d = 8;//放在類定義之后 test::test(int x_val,int y_val):x(x_val),y(y_val) { } test::~test() { }
四、const修飾類對象(常量對象只能調用常量函數成員,別的函數不能調用)
class test { public: test():x(1) { y=2; } ~test() {} void set(int yy) { y=yy; } int getx() const { return x; } //protected: const int x; int y; }; void main() { const test t; t.set(33);//error t.getx(); } ———————————————— 版權聲明:本文為CSDN博主「逝水-無痕」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/wangkai_123456/article/details/76598917
*注:不能再類聲明中初始化static的原因:
因為靜態成員屬於整個類,而不是屬於某個對象,如果再類內初始化,會導致每個對象都包含該靜態成員,這是矛盾的。《c++ primer》里面說再類外定義和初始化時保證static成員變量只被定義一次的好方法。
五、使用const的建議
- const在函數/成員函數中的三種用法(參數,返回值,函數)要很好的使用;
- 不要輕易的將函數的返回值類型定義為const;
- 除了重載操作符外一般不要將返回值類型定義為某個對象的const引用(ostream& oprator<<(ostream& os,T& other))
int test::d = 8;//放在類定義之后