const主要是為了程序的健壯型,減少程序出錯(cuò).
最基本的用法:
const int a=100; b
的內(nèi)容不變,b只能是100也就是聲明一個(gè)int類型的常量(#define b =100)
int const b=100; //
和上面作用一樣 

const
指針和引用一般用在函數(shù)的參數(shù)中
int* m = &a; //
出錯(cuò),常量只能用常指針
int c= 1;const int*pc = &c;//
常指針可指向常量 

const int* pa = &a; //
指針指向的內(nèi)容為常量(就是b的值不變)
int const *a = &b; //
指針指向的內(nèi)容為常量(就是b的值不變)*p=3//error
int* const a = &b; //
指針為常量,不能更改指針了如 a++但可以改值*p=3; 

從這可以看出const放在*左側(cè)修飾的是指針的內(nèi)容,const放在*右側(cè)修飾的是指針
本身

const
引用的用法和指針一樣
int const & a=b;
和指針一樣
const int& a=b;
和指針一樣
但沒有 int& const a=b 的用法因?yàn)橐貌荒茏鲆莆贿\(yùn)算,但只是出個(gè)warning 

const int* const a = &b; //
綜合應(yīng)用,一般用來傳遞多維的數(shù)組
類如:char* init[] = {"Paris","in the","Spring"};
void fun(const int* const a){}
fun(init)//
保護(hù)參數(shù)不被修改 

int A(int)const; //
是常函數(shù),只能用在類中,調(diào)用它的對(duì)象不能改改變成員值
const int A(); //
返回的是常量,所以必須這么調(diào)用 cosnt int a=A();
int A(const int); //
參數(shù)不能改值,可用在任意函數(shù)
int A(const int*);
....
int height() const;//
常函數(shù)只能由常函數(shù)調(diào)用
int max(int,int) const;
int Max = max(height(),height()); 

const int* pHeap = new int;
delete pHeap;
p = NULL;//
出錯(cuò)
我的解決辦法是強(qiáng)制類型轉(zhuǎn)換
const int* pHeap = new int(1);
delete (int*)pHeap;
pHeap = NULL; 

一、const 和引用聯(lián)合使用的時(shí)候要注意 

const int a = 1; 
const int& ref1 = a;
const int& ref2 = 1; 

ref1
ref2 都是正確的,但是他們引用的內(nèi)容和一般的引用不同
對(duì) const int& ref1 = a; 而言,其實(shí)這個(gè) ref1 已經(jīng)和 a 沒有任何關(guān)系了
ref1
實(shí)際上是對(duì)一個(gè)臨時(shí)量的引用。同理 const int& ref2 = 1; 也是對(duì)
一個(gè)臨時(shí)量做的引用。當(dāng)引用臨時(shí)量是 C++ 的隱式類型轉(zhuǎn)換可以起作用。
臨時(shí)量的生存期和引用量的生存期相同。 

二、強(qiáng)傳const對(duì)象可能導(dǎo)致無定義行為 

對(duì)于優(yōu)化做的比較好的編譯器,代碼 const int i = 1;
當(dāng)后面用到變量 i 的時(shí)候,編譯器會(huì)優(yōu)化掉對(duì) i 的存取,而直接使用立即數(shù)

const int i = 1; 

*(const_cast<int*>(&i)) = 2;
cout << *(int*)&i << endl;
cout << i << endl; 

所以,對(duì) const 對(duì)象做 const_cast 可能導(dǎo)致無定義行為
目前我就遇到這些問題,那位還有補(bǔ)充的嗎 





能不能把自己的經(jīng)驗(yàn)也談?wù)劇4蠹医涣鹘涣?span lang="EN-US">
這個(gè)就是我在調(diào)錯(cuò)時(shí)發(fā)現(xiàn)的
int height() const;//
常函數(shù)只能由常函數(shù)調(diào)用
int max(int,int) const;
int Max = max(height(),height()); 





Thinking again in C++
(一)常量性原理 cphj(原作) 
有些地方很受啟發(fā) 


1.
不能將const修飾的任何對(duì)象、引用和指針作為賦值表達(dá)式的左值。
const int cx=100;
const int & rcx=cx;
const int * pcx=&cx;
cx=200; //error
rcx=200; //error
*pcx=200; //error 

2.const
類型的對(duì)象不能直接被non-const類型的別名所引用。
(1)
不能將const類型的對(duì)象傳遞給non-const類型的引用。
const int cx=100;
int & rx=cx; //error
(2)
不能將const類型的實(shí)參傳遞給形參為non-const類型引用的函數(shù)。
void f(int a)
{
}
void g(int & ra)
{
}
const int cx=100;
f(cx); //ok
g(cx); //error
(3)
不能將const類型的對(duì)象作為non-const類型引用的函數(shù)返回值。
int & f(const int & rca)
{
return rca; //error
}
int x=100;
f(x); 

3.
可以使用const類型別名引用non-const對(duì)象。此時(shí)通過const引用不能修改對(duì)象,但對(duì)象可以通過non-const引用被修改。
int x=100;
int & rx=x;
const int & rcx=x; //ok
x=200;
rx=200;
rcx=200; //error 

4.
指針的屬性有兩個(gè):指針的類型和指針本身的常量性。其中,指向const對(duì)象與指向non-const對(duì)象,是不同的指針類型。
int x=100;
const int * pcx=&x; //[1]
int * px=&x; //[2]
int y=100;
int * const cpy=&y; //[3]
int * py=&y; //[4]
[1][2]
兩個(gè)指針的類型不同;[3][4]兩個(gè)指針的常量性不同。
對(duì)象與指向?qū)ο蟮闹羔樀囊?guī)則類似于對(duì)象與引用。即,const類型的對(duì)象不能直接被non-const類型的指針?biāo)甘荆ㄍ?span lang="EN-US">2);可以使用const類型的指針指向non-const對(duì)象(同3)。 

5.
可以將相同類型(包括常量性)的const指針值賦給non-const指針。
int x=100;
int * px;
const int * pcx=&x;
px=pcx; //error
int * const cpx=&x;
px=cpx; //ok 

6.
若函數(shù)的返回值為內(nèi)建類型或是指針,則該返回值自動(dòng)成為const性質(zhì)。但自定義類型則為non-const性質(zhì)。
int f() //
相當(dāng)于返回const int
{
return 100;
}
int * g(int & ra) //
相當(dāng)于返回int * const
{
return &ra;
}
class CTest
{
int n;
public:
CTest(int n){this->n=n;}
};
CTest h() //
返回的就是CTest
{
return CTest(200);


f()=200; //error 

int x=100;
int y=200;
int * px=&x;
g(y)=px; //error
*g(y)=x; //ok
,從這點(diǎn)可以看出g()返回的不是const int * 

CTest t(100);
h()=t; //ok
,但卻是完全錯(cuò)誤的、危險(xiǎn)的做法
//
所以h()的正確寫法是返回const CTest





const int b=100; b
的內(nèi)容不變,b只能是100
int const b=100; b
必須為int,不能為其他類型?
2句話的意思應(yīng)該是一樣的吧 , THINKING IN C++是這樣說的





const int a=100; a
的內(nèi)容不變,a只能是100(同樣不能類型轉(zhuǎn)換)。
int const b=100; b
必須為int,不能為其他類型?(同樣在使用中不能修改)。
所以ab是一樣的,稱為整型常數(shù),在使用中不能被修改,當(dāng)然都不能轉(zhuǎn)為其他類型了。 
#include <iostream> 

using namespace std; 

int main()
{
  const int a = 100;
  int const b = 100; 

  a = 100; //這四條語句編譯時(shí)都會(huì)出現(xiàn)“Cannot modify a const object 
b = 100; //in function main()
”的錯(cuò)誤提示,也就是說,任何企圖修改   a = 100.0; //ab(其實(shí)是一樣的)的行為都會(huì)出現(xiàn)“災(zāi)難”,在語法上講就  b = 100.0; //ab都不能出現(xiàn)在賦值語句的左邊! 

  cout<<'\n'<<a<<'\n'<<b<<endl; 

  return 0;
}





常函數(shù)的調(diào)用是這樣的:常量對(duì)象只能調(diào)用常成員函數(shù),非常量對(duì)象即可以調(diào)常成員函數(shù),也可以調(diào)一般成員函數(shù),但當(dāng)某個(gè)函數(shù)有const和非const兩個(gè)版本時(shí),const對(duì)象調(diào)const版本,非const對(duì)象調(diào)非const版本
例:
class A
{
public:
int & GetData(){return data;}
const int & GetData()const {return data;}
private:
int data;

A a;
a.GetData();//
調(diào)用int & GetData(){return data;}
//
但如果沒有這個(gè)函數(shù),也可以調(diào)用const int & GetData()const 
const A const_a;
const_a.GetData();//
調(diào)用const int & GetData()const {return data;}
常函數(shù)只能調(diào)常函數(shù),也是由于這個(gè)原因





算你狠!加兩點(diǎn)

一、const 和引用聯(lián)合使用的時(shí)候要注意 

const int a = 1; 
const int& ref1 = a;
const int& ref2 = 1; 

ref1
ref2 都是正確的,但是他們引用的內(nèi)容和一般的引用不同
對(duì) const int& ref1 = a; 而言,其實(shí)這個(gè) ref1 已經(jīng)和 a 沒有任何關(guān)系了
ref1
實(shí)際上是對(duì)一個(gè)臨時(shí)量的引用。同理 const int& ref2 = 1; 也是對(duì)
一個(gè)臨時(shí)量做的引用。當(dāng)引用臨時(shí)量是 C++ 的隱式類型轉(zhuǎn)換可以起作用。
臨時(shí)量的生存期和引用量的生存期相同。 

二、強(qiáng)傳const對(duì)象可能導(dǎo)致無定義行為 

對(duì)于優(yōu)化做的比較好的編譯器,代碼 const int i = 1;
當(dāng)后面用到變量 i 的時(shí)候,編譯器會(huì)優(yōu)化掉對(duì) i 的存取,而直接使用立即數(shù)

const int i = 1; 

*(const_cast<int*>(&i)) = 2;
cout << *(int*)&i << endl;
cout << i << endl; 

所以,對(duì) const 對(duì)象做 const_cast 可能導(dǎo)致無定義行為





#include <iostream.h>
void fun(char b){cout <<"void"<<endl;}
int fun(int const b){cout <<"int"<<endl;} 
int main()
{
fun(1.0);//
詳細(xì)看看重載函數(shù)吧 
fun(4); //
想一想調(diào)用哪一個(gè) 

return 0;
}
我試了一下,會(huì)出錯(cuò)? vc說:'fun':ambiguous call to overloaded function 





補(bǔ)充的好啊,這個(gè)一般不會(huì)注意的
const int i = 1;
*(const_cast<int*>(&i)) = 2;
cout << *(int*)&i << endl;
cout << i << endl;
這個(gè)可真有意思,調(diào)試時(shí)兩個(gè)都是2,可編譯就是21
const
的永遠(yuǎn)都是const,這樣能更改就不錯(cuò)了,不然就自相矛盾了
奇怪的是 pi &i地址一樣啊,就像樓上說的這是編譯時(shí)的優(yōu)化
處理
const int i = 1;
int* pi=const_cast<int*>(&i);
*pi=2;
cout << *pi << endl;
cout << i << endl; 





那個(gè)主要是隱式轉(zhuǎn)換
你可依次把兩個(gè)函數(shù)注掉看看調(diào)用
#include <iostream.h>
//void fun(char b){cout <<"void"<<endl;}
void fun(int b){cout <<"int"<<endl;}
int main()
{
fun('a');
fun(4); 
return 0;
}