青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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

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

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

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

const
引用的用法和指針一樣
int const & a=b;
和指針一樣
const int& a=b;
和指針一樣
但沒有 int& const a=b 的用法因為引用不能做移位運算,但只是出個warning 

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

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

const int* pHeap = new int;
delete pHeap;
p = NULL;//
出錯
我的解決辦法是強制類型轉換
const int* pHeap = new int(1);
delete (int*)pHeap;
pHeap = NULL; 

一、const 和引用聯合使用的時候要注意 

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

ref1
ref2 都是正確的,但是他們引用的內容和一般的引用不同
const int& ref1 = a; 而言,其實這個 ref1 已經和 a 沒有任何關系了
ref1
實際上是對一個臨時量的引用。同理 const int& ref2 = 1; 也是對
一個臨時量做的引用。當引用臨時量是 C++ 的隱式類型轉換可以起作用。
臨時量的生存期和引用量的生存期相同。 

二、強傳const對象可能導致無定義行為 

對于優化做的比較好的編譯器,代碼 const int i = 1;
當后面用到變量 i 的時候,編譯器會優化掉對 i 的存取,而直接使用立即數

const int i = 1; 

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

所以,對 const 對象做 const_cast 可能導致無定義行為
目前我就遇到這些問題,那位還有補充的嗎 





能不能把自己的經驗也談談。大家交流交流
這個就是我在調錯時發現的
int height() const;//
常函數只能由常函數調用
int max(int,int) const;
int Max = max(height(),height()); 





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


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

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

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

4.
指針的屬性有兩個:指針的類型和指針本身的常量性。其中,指向const對象與指向non-const對象,是不同的指針類型。
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]
兩個指針的類型不同;[3][4]兩個指針的常量性不同。
對象與指向對象的指針的規則類似于對象與引用。即,const類型的對象不能直接被non-const類型的指針所指示(同2);可以使用const類型的指針指向non-const對象(同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.
若函數的返回值為內建類型或是指針,則該返回值自動成為const性質。但自定義類型則為non-const性質。
int f() //
相當于返回const int
{
return 100;
}
int * g(int & ra) //
相當于返回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
,從這點可以看出g()返回的不是const int * 

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





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





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

using namespace std; 

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

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

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

  return 0;
}





常函數的調用是這樣的:常量對象只能調用常成員函數,非常量對象即可以調常成員函數,也可以調一般成員函數,但當某個函數有const和非const兩個版本時,const對象調const版本,非const對象調非const版本
例:
class A
{
public:
int & GetData(){return data;}
const int & GetData()const {return data;}
private:
int data;

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





算你狠!加兩點

一、const 和引用聯合使用的時候要注意 

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

ref1
ref2 都是正確的,但是他們引用的內容和一般的引用不同
const int& ref1 = a; 而言,其實這個 ref1 已經和 a 沒有任何關系了
ref1
實際上是對一個臨時量的引用。同理 const int& ref2 = 1; 也是對
一個臨時量做的引用。當引用臨時量是 C++ 的隱式類型轉換可以起作用。
臨時量的生存期和引用量的生存期相同。 

二、強傳const對象可能導致無定義行為 

對于優化做的比較好的編譯器,代碼 const int i = 1;
當后面用到變量 i 的時候,編譯器會優化掉對 i 的存取,而直接使用立即數

const int i = 1; 

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

所以,對 const 對象做 const_cast 可能導致無定義行為





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

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





補充的好啊,這個一般不會注意的
const int i = 1;
*(const_cast<int*>(&i)) = 2;
cout << *(int*)&i << endl;
cout << i << endl;
這個可真有意思,調試時兩個都是2,可編譯就是21
const
的永遠都是const,這樣能更改就不錯了,不然就自相矛盾了
奇怪的是 pi &i地址一樣啊,就像樓上說的這是編譯時的優化
處理
const int i = 1;
int* pi=const_cast<int*>(&i);
*pi=2;
cout << *pi << endl;
cout << i << endl; 





那個主要是隱式轉換
你可依次把兩個函數注掉看看調用
#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;
}
Posted on 2005-12-09 10:54 艾凡赫 閱讀(48027) 評論(13)  編輯 收藏 引用 所屬分類: 基礎知識

Feedback

# re: const用法  回復  更多評論   

2007-10-05 22:25 by 金鵬
前輩啊,我初學者,看不懂你們在說什么啊.怎么辦啊!

# re: const用法  回復  更多評論   

2007-10-09 09:01 by ivenher
多多嘗試,有了手感就好了

# re: const用法  回復  更多評論   

2007-12-27 21:48 by 張飛
@金鵬
蠢豬!

# re: const用法  回復  更多評論   

2008-01-17 14:57 by harer
很好,收藏了。
謝謝。

# re: const用法  回復  更多評論   

2008-02-08 20:22 by 敖馬
不得不說博客主人談的很細致,看得出來經驗豐富啊~
作為一個初學C++的小毛孩,我對C++還沒"感覺",不過編程就是這樣,入門容易,精通難,本身的多讀多練很重要.當然了,能看到前輩這樣的經驗之談也很有幫助,作為晚輩的我們說不定哪天遇到了問題就可以少走一點彎路~

謝了哈~~^_^

# re: const用法[未登錄]  回復  更多評論   

2008-03-20 00:21 by me
發現其中有不少錯誤

# re: const用法  回復  更多評論   

2008-04-29 16:15 by 程誠成
今天又復習了一遍,收藏了,很全面。

# re: const用法  回復  更多評論   

2008-07-26 16:04 by 啊啊
說的太深奧了

# re: const用法  回復  更多評論   

2009-01-09 15:24 by bigcoder
貌似其中有錯誤

# re: const用法  回復  更多評論   

2009-03-31 12:31 by akxxx
錯誤很多。。。。

# re: const用法  回復  更多評論   

2009-10-22 14:59 by kakayunmu
很好很詳細

# re: const用法  回復  更多評論   

2009-11-21 14:40 by alan
錯誤很多 COPY的吧。。。

# re: const用法[未登錄]  回復  更多評論   

2010-05-07 17:50 by a
const int A(); //返回的是常量,所以必須這么調用 cosnt int a=A();
這里錯了!
直接這樣調用就行
int a = A();
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一级视频免费在线观看| 欧美大片va欧美在线播放| 一本色道久久综合亚洲精品高清| 国产精品视频精品| 国产精品免费aⅴ片在线观看| 欧美精品1区2区3区| 久久精彩免费视频| 久久精品国产久精国产思思 | 欧美日韩一区二区在线观看| 久久久噜噜噜久久中文字幕色伊伊| 亚洲一区二区免费| 欧美性色综合| 另类人畜视频在线| 在线一区二区日韩| 亚洲欧美日韩国产综合| 亚洲国产日韩欧美在线99| 亚洲性色视频| 久久色中文字幕| 欧美激情第10页| 亚洲国产黄色片| 国产欧美日韩不卡| 中文精品视频一区二区在线观看| 亚洲香蕉网站| 免费看成人av| 国产精品www色诱视频| 国产欧美视频一区二区| 亚洲国产一区二区三区a毛片| 99亚洲一区二区| 久久免费观看视频| 日韩一区二区久久| 久久一区二区三区国产精品 | 99国产精品久久久久久久| 亚洲欧美国产日韩天堂区| 免费成人av在线看| 一色屋精品视频在线观看网站| 亚洲免费在线| 亚洲午夜久久久久久久久电影院| 美国成人毛片| 91久久精品国产91性色| 亚洲国产日韩美| 免费精品99久久国产综合精品| 狠狠色2019综合网| 久久综合电影| 免费观看成人网| 日韩亚洲一区二区| 一本久久综合亚洲鲁鲁五月天| 欧美激情片在线观看| 中文欧美在线视频| 亚洲一区中文字幕在线观看| 国产乱码精品一区二区三| 久久久久免费| 欧美精品二区| 久久成人在线| 欧美激情黄色片| 久久都是精品| 欧美精品在欧美一区二区少妇| 久久久一区二区三区| 永久免费视频成人| 夜夜爽夜夜爽精品视频| 国产精品性做久久久久久| 久久这里只有| 欧美日韩国产一区| 欧美不卡激情三级在线观看| 欧美日韩一区二区在线观看视频| 久久精品国产亚洲aⅴ| 欧美电影在线观看| 午夜精品久久久久久久蜜桃app | 国产精品久久久久久久久果冻传媒 | 在线电影欧美日韩一区二区私密| 久久国产加勒比精品无码| 欧美日韩爆操| 国产欧美va欧美va香蕉在| 国产精品美女999| 国产精品一区二区三区乱码 | 亚洲欧美日韩国产一区| 国产精品久久九九| 一本久道综合久久精品| 欧美肥婆在线| 美腿丝袜亚洲色图| 欧美一区二区国产| 国产拍揄自揄精品视频麻豆| 久热re这里精品视频在线6| 亚洲激情偷拍| 亚洲精品一区二区三| 在线电影国产精品| 久久婷婷国产麻豆91天堂| 久久国产精品高清| 在线观看视频一区二区| 久久综合给合久久狠狠狠97色69| 香蕉亚洲视频| 亚洲激情视频网| 亚洲一区二区四区| 开心色5月久久精品| 狠狠色伊人亚洲综合成人| 国产精品久久波多野结衣| 亚洲第一久久影院| 亚洲电影免费| 欧美日韩中字| 欧美在线视频一区二区| 亚洲电影欧美电影有声小说| 欧美啪啪成人vr| 欧美在线观看网站| 亚洲精品国精品久久99热一| 亚洲无吗在线| 一区二区不卡在线视频 午夜欧美不卡在| 国产精品久久久久免费a∨大胸| 久久蜜桃香蕉精品一区二区三区| 欧美激情女人20p| 香蕉免费一区二区三区在线观看 | 一本色道久久| 欧美国产亚洲另类动漫| 欧美亚洲三区| 亚洲欧美中文另类| 亚洲免费电影在线| 亚洲日本欧美| 亚洲日本aⅴ片在线观看香蕉| 亚洲人成精品久久久久| 欧美一区=区| 久久久精品动漫| 欧美成人在线影院| 欧美成人精品一区二区| 久久亚洲私人国产精品va媚药| 久久久久久久精| 麻豆精品一区二区综合av | 这里只有精品在线播放| 亚洲人成亚洲人成在线观看 | 欧美日本高清| 国产精品久久久久9999高清| 国产精品美女久久久久av超清| 国产精品久久久对白| 伊人久久久大香线蕉综合直播| 午夜欧美不卡精品aaaaa| 99在线观看免费视频精品观看| 亚洲精品影视在线观看| 亚洲欧美成aⅴ人在线观看| 亚洲视频自拍偷拍| 欧美在线国产| 国产精品久久久久久久久久三级| 国产日韩精品久久| aa级大片欧美| 亚洲国产老妈| 久久精品一区二区三区四区| 欧美精品一区二区在线观看 | 亚洲激精日韩激精欧美精品| 亚洲在线视频观看| 欧美日韩精品在线播放| 在线看成人片| 鲁鲁狠狠狠7777一区二区| 欧美亚洲综合网| 欧美三级资源在线| 一区二区欧美在线| 亚洲精品资源| 欧美日韩亚洲一区在线观看| 亚洲免费观看高清完整版在线观看| 国产精品二区影院| 1769国内精品视频在线播放| 国产精品亚洲综合| 欧美伊人久久久久久午夜久久久久 | 国产日韩欧美高清| 国产乱码精品| 亚洲精品免费一区二区三区| 久久精品av麻豆的观看方式| 日韩一级精品视频在线观看| 国产日产欧产精品推荐色| 国产精品中文字幕在线观看| 国产亚洲高清视频| 经典三级久久| 一区二区日韩| 亚洲午夜小视频| 欧美高清在线| 一本色道久久综合精品竹菊| 久久国产日韩欧美| 欧美午夜无遮挡| 中日韩美女免费视频网站在线观看| 亚洲卡通欧美制服中文| 免费日韩成人| 中日韩在线视频| 午夜精品久久久久| 狠狠色2019综合网| 欧美日韩你懂的| 久久在线91| 久久亚裔精品欧美| a91a精品视频在线观看| 欧美一区午夜精品| 亚洲一区网站| 久久福利毛片| 亚洲欧美中文另类| 欧美激情视频在线播放| 性欧美办公室18xxxxhd| 久久久久国产精品一区三寸| 一区二区三区精品国产| 欧美一区二区三区四区夜夜大片 | 久久久精品一品道一区| 欧美一区国产一区| 亚洲三级影院| 国产日韩在线一区| 亚洲免费人成在线视频观看| 另类综合日韩欧美亚洲| 国产精品久久999| 欧美一区激情视频在线观看|