亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++中的const關鍵字及與C語言中const的區別

2020-05-23 14:05:34
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++中的const關鍵字及與C語言中const的區別,const將所修飾的變量對象轉化為常量,需要的朋友可以參考下
 

const對象默認為文件的局部變量,與其他變量不同,除非特別說明,在全局作用域的const變量時定義該對象的文件局部變量。此變量只存在于那個文件中中,不能別其他文件訪問。要是const變量能在其他文件中訪問,必須顯示的指定extern(c中也是)
 
當你只在定義該const常量的文件中使用該常量時,c++不給你的const常量分配空間--這也是c++的一種優化措施,沒有必要浪費內存空間來存儲一個常量,此時const int c = 0;相當于#define c 0;  
 
當在當前文件之外使用時,c++會給你的const分配空間(它是迫不得已)。因為若此時如果不分配空間,則obj中根本就不會有該常量的信息。連接的時候就找不到該常量。同樣如果你在程序中取了常量的地址,也回迫使c++給你的常量分配空間。
 
C++編譯器在通常情況下不為常量分配空間,而是將其值存放在符號表內.但當使用extern修飾常量時,則必須立即為此常量分配空間(與之類似的情況還有取常量的地址等等).只所以必須分配空間,是因為extern表示"使用外部鏈接",這表明還會有其他的編譯單元將會使用尋址的方法來引用它,因此它現在就必須擁有自己的地址.
 
所以如果想在當前文件使用其他文件的const變量時,這個變量就必須定義成:(m.cpp) extern const int aaa = 9999;使用時需要:(main.cpp) extern const int aaa;在c中就不必再定義是加extern,因為始終為const變量分配空間。

const的形參重載:

#include <iostream> using namespace std; void f(int& a){    cout << "void f(int& a)" << endl;} void f(const int& a){    cout << "void f(const int& a)" << endl;} int main(){    int a = 6;    int &b = a;    const int c = 8;     f(a);    f(b);    f(c);    f(3);     return 0;}

 
運行結果:

void f(int& a)void f(int& a)void f(const int& a)void f(const int& a)

C與C++中const的區別

1.C++中的const正常情況下是看成編譯期的常量,編譯器并不為const分配空間,只是在編譯的時候將期值保存在名字表中,并在適當的時候折合在代碼中.所以,以下代碼:

#include <iostream>using namespace std;int main(){ const int a = 1; const int b = 2; int array[ a + b ] = {0}; for (int i = 0; i < sizeof array / sizeof *array; i++) {    cout << array[i] << endl; }}

在可以通過編譯,并且正常運行.但稍加修改后,放在C編譯器中,便會出現錯誤:

#include <stdio.h>int main(){ int i; const int a = 1; const int b = 2; int array[ a + b ] = {0}; for (i = 0; i < sizeof array / sizeof *array; i++) {    printf("%d",array[i]); }}

錯誤消息:

c:/test1/te.c(8): error C2057: 應輸入常數表達式c:/test1/te.c(8): error C2466: 不能分配常數大小為 0 的數組

出現這種情況的原因是:
(1)在C中,const是一個不能被改變的普通變量,既然是變量,就要占用存儲空間,所以編譯器不知道編譯時的值.而且,數組定義時的下標必須為常量.
(2)在C語言中:

const int size;

這個語句是正確的,因為它被C編譯器看作一個聲明,指明在別的地方分配存儲空間.但在C++中這樣寫是不正確的.C++中const默認是內部連接,如果想在C++中達到以上的效果,必須要用extern關鍵字.

2.C++中,const默認使用內部連接.而C中使用外部連接.
內連接:編譯器只對正被編譯的文件創建存儲空間,別的文件可以使用相同的表示符
      或全局變量.C/C++中內連接使用static關鍵字指定.
外連接:所有被編譯過的文件創建一片單獨存儲空間.一旦空間被創建,連接器必須解決對這片存儲空間的引用.全局變量和函數使用外部連接.通過extern關鍵字聲明,可以從其他文件訪問相應的變量和函數.

header.hconst int test = 1;test1.cpp#include <iostream>#include "header.h"using namespace std;int main(){ cout << "in test1 :" << test << endl;}test2.cpp#include <iostream>#include "header.h"using namespace std;void print(){ cout << "in test2:" << test << endl;  }

以上代碼編譯連接完全不會出問題,但如果把header.h改為:

extern const int test = 1;

在連接的時候,便會出現以下錯誤信息:

test2 error LNK2005: "int const test" (?test@@3HB) 已經在 test1.obj 中定義

因為extern關鍵字告訴C++編譯器test會在其他地方引用,所以,C++編譯器就會為test創建存儲空間,不再是簡單的存儲在名字表里面.所以,當兩個文件同時包含header.h的時候,會發生名字上的沖突.
此種情況和C中const含義相似:

header.hconst int test = 1;test1.c#include <stdio.h>#include "header.h"int main(){ printf("in test1:%d/n",test);}test2.c#include <stdio.h>#include "header.h"void print(){ printf("in test2:%d/n",test);  }

 

錯誤消息:

test3 fatal error LNK1169: 找到一個或多個多重定義的符號test3 error LNK2005: _test 已經在 test1.obj 中定義

C++中,是否為const分配空間要看具體情況.
如果加上關鍵字extern或者取const變量地址,則編譯器就要為const分配存儲空間.
C++中定義常量的時候不再采用define,因為define只做簡單的宏替換,并不提供類型檢查



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品91久久久久久| 91成人福利在线| 热久久免费国产视频| 亚洲春色另类小说| 黑人巨大精品欧美一区免费视频| 国产精品免费久久久| 日韩资源在线观看| 日本在线精品视频| 日韩一区二区三区在线播放| 亚洲人a成www在线影院| 欧美中文在线视频| 亚洲国产成人久久| 久久天天躁狠狠躁夜夜躁2014| 国产97人人超碰caoprom| 久久国产精品首页| 国产一区二区三区丝袜| 国产精品一区电影| 国产精品尤物福利片在线观看| 亚洲国产小视频在线观看| 91精品成人久久| 久久天堂电影网| 日韩一区av在线| 中文字幕欧美视频在线| 精品中文字幕在线观看| 欧美精品一区三区| 最近2019好看的中文字幕免费| 亚洲国产精品悠悠久久琪琪| 欧美性jizz18性欧美| 亚洲深夜福利在线| 一本色道久久综合狠狠躁篇怎么玩| 青青久久av北条麻妃海外网| 日韩av在线免费观看| 中文在线资源观看视频网站免费不卡| 国产一区二区色| 欧美成人精品一区二区| 国产99在线|中文| 国产午夜精品理论片a级探花| 国产一区二区色| 亚洲福利视频免费观看| 日韩欧美国产中文字幕| 尤物yw午夜国产精品视频| 亚洲自拍av在线| 2023亚洲男人天堂| 精品久久久久久亚洲国产300| 亚洲无线码在线一区观看| 日韩美女中文字幕| 亚洲少妇激情视频| 亚洲精品天天看| 国产一区二区美女视频| 亚洲成年人在线播放| 欧美在线视频导航| 国产精品激情av电影在线观看| 欧美性高潮在线| 久久久久久久久久久91| 日韩欧美在线中文字幕| 亚洲国产成人久久综合| 亚洲电影免费观看高清完整版在线观看| 精品久久久久久亚洲国产300| 午夜精品福利电影| 亚洲天堂av在线播放| 亚洲精美色品网站| 国产精品男人的天堂| 国产91色在线播放| 色一情一乱一区二区| 国产精品视频yy9099| 久久久免费精品视频| 久久全球大尺度高清视频| 狠狠躁夜夜躁人人爽天天天天97| 欧美视频免费在线| 亚洲国产一区二区三区在线观看| 国产欧美日韩精品在线观看| 九九精品视频在线观看| 色综合91久久精品中文字幕| 亚洲欧美国产精品va在线观看| 成人免费在线视频网站| 国产精品久久91| 精品亚洲男同gayvideo网站| 91夜夜未满十八勿入爽爽影院| 一区二区三区四区视频| 国产91网红主播在线观看| 一区二区三区视频观看| 国产视频在线一区二区| 色综合天天综合网国产成人网| 91影院在线免费观看视频| 欧美在线视频免费| 欧美性xxxx极品hd欧美风情| 亚洲第一中文字幕在线观看| 一区二区三区四区精品| 亚洲欧洲美洲在线综合| 欧美影院久久久| 亚洲欧美另类中文字幕| 国产一区二区视频在线观看| 欧美一级视频免费在线观看| 欧美在线观看视频| 日韩激情视频在线| 在线播放日韩欧美| 在线观看日韩视频| 欧美专区国产专区| 91天堂在线视频| 日本成人激情视频| 亚洲一区二区三区乱码aⅴ| 久久天天躁狠狠躁夜夜爽蜜月| 久久精品色欧美aⅴ一区二区| 国产精品第一第二| 国产精品自在线| 久久久久北条麻妃免费看| 亚洲男女性事视频| 精品国产网站地址| 韩国视频理论视频久久| 欧美最猛性xxxxx免费| 日韩av在线不卡| 亚洲电影中文字幕| 欧美激情图片区| 影音先锋日韩有码| 91精品国产综合久久久久久久久| 亚洲天堂网站在线观看视频| 亚洲性夜色噜噜噜7777| 成人av在线天堂| 欧美日韩一区二区在线播放| 久久香蕉国产线看观看网| 欧美高清视频免费观看| 91九色精品视频| 国产丝袜一区二区| 亚洲人线精品午夜| yw.139尤物在线精品视频| 亚洲人高潮女人毛茸茸| 国产一区二区在线免费| 九色精品免费永久在线| 久热精品视频在线免费观看| 国产精品精品久久久久久| 国语自产精品视频在线看| 国产精品私拍pans大尺度在线| 久久香蕉频线观| 国产美女扒开尿口久久久| 精品在线小视频| 国产精品成人一区| 国色天香2019中文字幕在线观看| 97色伦亚洲国产| 久久久精品免费视频| 午夜欧美不卡精品aaaaa| 亚洲第一精品福利| 国产91ⅴ在线精品免费观看| 久久精品在线播放| 欧美午夜宅男影院在线观看| 韩国福利视频一区| 精品一区二区三区四区在线| 精品亚洲男同gayvideo网站| 国产精品久久久久久久午夜| 国产免费观看久久黄| 国产成人精品久久亚洲高清不卡| 日韩欧美国产中文字幕| 国产精品麻豆va在线播放| 亚洲永久免费观看| 国产精品视频最多的网站| 91sa在线看| 日韩av在线免费观看一区| 国产精品视频播放| 国产一区二区三区视频| 久久久久久久国产| 日韩小视频在线| 欧美xxxx综合视频| 亚洲视频免费一区| 亚洲第一福利在线观看| 亚洲欧美视频在线|