文章稍長,但是舉例都很易懂。
1. 常量
c++用const將對象i定義爲一個常量。定義之後,i的值就不可以再變了,所以i必須在定義時候被初始化。
所以 const int i; //錯誤的,i 必須被初始化 (在C中這種寫法可以,但是這裏只說C++的環境下)
#include<iostream>
int main()
{
const int i = 10; //正確,i被初始化
}
2. 代替#define的值替換功能
舉例:
#define NUMBER 100
上面這行代碼是C中典型的值替換手段。
但是C++中這樣寫:
const NUMBER = 100;
//或者
const int NUMBER = 100;
這樣寫的好處:
①.明顯的減少代碼量
②.const可以附帶數據類型(int),但是#define(宏常量)沒有該功能,只是簡單的字符替換,沒類型檢查,所以在字符替換的時候會出意想不到的錯誤。
3.指針和const
在指針的聲明中,指向const對象的指針和const指針是不一樣的。
舉例:
//注意!!p可以不初始化,它可以指向任何東西。p這個指針指向一個int類型的數,但是這個數是const屬性。
const int* p;
//等價於
int const *p;
//下面的p是個const修飾的指針,所以p必須被初始化。 但是這個p指向的值可以被改變。
int a = 1;
int* const p = &a;
*p = 2; //改變p所指向的值,正確。
4.修飾函數參數及函數返回值
①const修飾成員函數
class A{
void fun1();
void fun2() const;
};
const改變的是this指針。this指針原類型爲: A* const(this爲類A的指針,我理解爲A* const this),被const修飾後變爲:const A* const,(第一個const修飾的就是this指向的對象,我理解爲 const A* const this)。
const修飾的成員函數不能調用或者修改該類的對象。當然mutable成員可以。
再記最重要的一點:const修飾的成員函數的應用場景。
const對象,指向const對象的指針都且只能調用const成員函數。調用非const成員函數則會出錯。反過來,非const對象或者指針,都可以調用const成員函數和非const成員函數。所以,如果一個類中沒有const成員函數,當你使用const對象時,這個對象誰都調用不了。
舉例:
class A {
void fun1() const;
void fun2();
}
const A a1; //a1對象只可以調用fun1成員函數。
const A* a2 = new A; //a2指針的調用規則也是只可以調用fun1函數。
class B {
void bfun1();
void bfun2();
}
B b1; //b1可以調用bfun1和bfun2
const B b2; //b2調用不了任何成員函數
B* b3 = b2; //b3是指向const對象b2的指針,也調用不了任何成員函數
B& b4 = b2; //b4是const修飾的b2對象的引用,也調用不了任何成員函數。
//總結:無論是const對象(b2),還是指向b2的指針b3,還是b2的引用b4,都無法調用非const成員函數。
class C {
void cfun1();
void cfun2() const;
}
C c;
c.cfun1(); //正確
c.cfun2(); //正確
//總結:非const修飾的對象,可以調用const成員函數和非const成員函數。
②const修飾數據成員
const修飾數據成員,記住一點:必須在構造中初始化成員變量。
#include<iostream>
class A{
public:
int m_a;
const int m_b;
}
A a; //此處想要構造一個對象a,但是程序不會執行。
//因爲const修飾的成員變量m_b必須在構造的初始化列表中進行初始化
//修改如下:
class A{
public:
A()
: m_b(100)
{} //初始化時,初始化const修飾的成員變量,這樣就可以了。
int m_a;
const int m_b;
}
待續…