天天看點

const用法詳解

(以下代碼用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,如需轉載請自行聯系原作者

繼續閱讀