(以下代碼用gcc或g++編譯)
1.修飾普通變量
const int a;
int const a;
這兩種是一樣的,沒有差別,另外 int a const 是錯誤的。
其實上述兩種方式也是錯的,必須初始化才行!
如果不初始化,C++編譯器會提示錯誤,沒有initialize,而C編譯器正常,但是如果在下面在指派的話就錯了,不能對常量指派。
2.修飾指針變量
有很多種寫法,逐個分析。
const int * a;
這個const修飾的重點是int,也就是說,a并不是常量,a是可以變的,(*a)是不能變的,詳細見如下代碼。
#include<stdio.h>
int main()
{
const int * a;
int b;
a=&b;
b=5;
(*a)=5;
return 0;
}
test.cpp:8: 錯誤:assignment of read-only location
我們可以對b進行指派,但是不能用(*a)對其指派。明白了吧?
int const * a;
這個與 const int *a是一樣的,a可以指派,但是(*a)不能指派。
int * const a;
這個修飾的是a,a是什麼類型的?a是指針類型,是以說a必須初始化,a隻能指向一個位址,但是位址裡的内容是可以改的。
看如下代碼
int * const a;
test.cpp: In function ‘int main()’:
test.cpp:4: 錯誤:未初始化的常量 ‘a’
必須初始化。
然後再看
int b;
int c;
int * const a=&b;
(*a)=5;
a=&c;
test.cpp:8: 錯誤:assignment of read-only variable ‘a’
const int * const a;
這個就是定死了,a也不能修改,(*a)也不能修改,而且a必須初始化。
int const* const a=&b;
a=&c;
test.cpp:7: 錯誤:assignment of read-only location
還有其中差別方法:
沿着*号劃一條線,
如果const位于*的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;
如果const位于*的右側,const就是修飾指針本身,即指針本身是常量。
3.修飾函數參數
int fun (int const a) 或者 int fun (const int a);
傳遞過來的變量不能修改,也就是a不能在函數體内進行指派什麼的,但是這個意義不大,因為a是形參。
using namespace std;
int fun(const int a)
{
a=5;
return a;
}
int fun1(int const a)
a=2;
return a;
int main()
int b;
fun(b);
return 0;
test.cpp:5: error: assignment of read-only parameter ‘a’
test.cpp: In function ‘int fun1(int)’:
test.cpp:10: error: assignment of read-only parameter ‘a’
int fun ( const char * a) ;
a可以變,但是(*a)不可以變。但是我們可不可以通過另外一個指針變量給(*a)指派呢?
比如 int *c=a; (*c)=5,這不就實作對a所指向的地方的間接修改了嗎?
錯了,int *c=a是錯的,因為c與a不是一個類型。必須const int * c=a才行,那既然這樣,還是不能修改a指向的那個地方,是以,這個用法是很有用的,傳指針過去,但是你不能通過指針改我的值,主要的好處是節省了開銷。看下面的例子
#include<iostream>
int fun(const int* a)
int * c;
c=a;
(*a)=b;
a=&b;
(*c)=5;
return b;
fun(&b);
test.cpp: In function ‘int fun(const int*)’:
test.cpp:7: error: invalid conversion from ‘const int*’ to ‘int*’
test.cpp:8: error: assignment of read-only location
int fun (int * const a);
這個跟第一種差不多,沒多少意義,就是不能修改a,但是a也是形參,(*a)是可以改的。
修飾引用int fun (const int& a);
a不能被修改,這個也很常用。就着一種形式,int fun( int & const a)沒有這種形式。
#include<iostream>
int fun( const int& a)
b=a;
test.cpp: In function ‘int fun(const int&)’:
test.cpp:5: error: assignment of read-only reference ‘a’
4.修飾傳回值
const int fun (int a);
這個無意義,因為傳回的本身就是一個常量。
const int * fun (int a);
這個怎麼了解的,其實就可以把const int *看作一種類型,傳回值是const int *類型的,這個需要好幾個代碼
首先,下面代碼
const int* fun( int a)
return &a;
test.cpp: In function ‘const int* fun(int)’:
test.cpp:3: warning: address of local variable ‘a’ returned
局部變量的位址傳回是沒意義的,但是沒錯,說明在函數體内傳回不是const int *類型的沒關系。
然後
const int* fun( int& a)
int *c;
const int *d;
c=fun(b);
d=fun(b);
test.cpp: In function ‘int main()’:
test.cpp:13: error: invalid conversion from ‘const int*’ to ‘int*’
說明這個隻在指派的時候有影響,必須賦給const int *類型的才行。
int * const fun(int a);
這個的用法還沒搞清楚,不過一般沒有這麼用的。
int* const fun( int& a)
int *d;
int *e=fun(b);
int * const f=fun(b);
5.修飾成員對象/對象指針/對象引用
跟普通變量一樣,但是有一點要注意,被const修飾的對象不能調用内部沒有被const修飾過的成員函數,因為這樣的函數有修改内部成員變量的嫌疑。
本文轉自nxlhero 51CTO部落格,原文連結:http://blog.51cto.com/nxlhero/405863,如需轉載請自行聯系原作者