c++ const語法詳解

我們在實際開發中都用過const,但大部分開發者可能瞭解的還不夠透徹下面我們就來簡單聊聊。

c++允許你指定一個語義約束,也就是指定一個不該被改動的對象,而編譯器會強制實施這項約束。如果在編程中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。

const修飾誰?即怎麼確定const約束的是誰?下面我們上代碼,幫助大家一目瞭然的看下。

(一)const修飾指針,簡單總結下如下:

(1)只有一個const,如果const位於*左側,表示指針所指數據是常量,不能通過解引用修改該數據

指針本身是變量,可以指向其他的內存單元。

(2)只有一個const,如果const位於*右側,表示指針本身是常量,不能指向其他內存地址,指針所指的

數據是可以通過解引用修改的。

(3)兩個const,*左側右側各一個時,表示指針和指針所指向的數據都是不能修改的。


<code>#include <iostream>
using namespace std;
int main()
{
\tint num1 = 3; //non-const data
\tconst int num2 = num1; //const data
\tint* p1 = &num1; //non-const data non-const pointer
\tconst int* p2 = &num1; //const data non-const pointer
\tint* const p3 = &num1; //non-const data const pointer
\tconst int* const p4 = &num1;//const data const pointer
\treturn 0;
}/<iostream>/<code>


(二)const修飾函數參數

傳遞過來的參數在函數內是不可以被改表的,如果修改編譯器會編譯不過。

<code>void f(const int x)
{
\tx = 1; //這裡是編譯不過的
}/<code>

(三)const修飾成員函數

(1)const修飾的成員函數不能夠修改任何的成員變量,mutable修飾的變量是可以修改的

這是個特例。

(2)const修飾的成員函數不能調用非const成員函數,因為非const成員函數可能修改成員變量。


<code>#include <iostream>
using namespace std;
class T
{
public:
\tT(int _t) :t(_t) {}
\tvoid test2(int t1)
\t{
\t\tt = t1;
\t}

\tvoid test1(int _x) const
\t{
\t\tt = _x; //這裡會編譯不過
\t\ttest2(_x); //這裡也會編譯不過
\t}
private:
\tint t;
};/<iostream>/<code>

(四)const修飾函數返回值

(1)指針傳遞,如果返回 const data, 則接受返回值的變量也必須是const的,因為指針指向的數據是常量不能修改。


<code>const int* f()
{
\tint* a = new int(1);
\treturn a;
}

int main()

{
\tint* p = f(); //這裡編譯器會報錯
\tconst int* p1 = f();//這是正確的做法
\treturn 0;
}/<code>

(2)值傳遞,如果函數返回值是值傳遞,因為返回值是一份拷貝,加const已經沒有了意義。


c++ const語法詳解


分享到:


相關文章: