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

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

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

2020-01-26 14:38:45
字體:
來源:轉載
供稿:網友

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
亚洲午夜av久久乱码| 国产精品久久久久7777婷婷| 久久精品亚洲94久久精品| 亚洲成人动漫在线播放| 亚洲成人激情小说| 成人午夜激情免费视频| 国产精品一区久久久| 亚洲精品日韩在线| 懂色aⅴ精品一区二区三区蜜月| 欧美色视频日本版| 久久久www成人免费精品张筱雨| 91久久精品国产91久久| 夜夜嗨av一区二区三区免费区| 8x拔播拔播x8国产精品| 亚洲丁香婷深爱综合| 亚洲欧美在线第一页| 久久久视频精品| 欧美精品999| 国产丝袜一区二区三区| 精品视频中文字幕| 久久精彩免费视频| 亚洲国产精品视频在线观看| 亚洲免费精彩视频| 中文字幕一区二区精品| 欧美大成色www永久网站婷| 亚洲美女黄色片| 一本一本久久a久久精品牛牛影视| 欧美日韩国产成人在线观看| 亚洲激情自拍图| 日韩欧美在线视频观看| 亚州欧美日韩中文视频| 亚洲视频在线免费观看| 国产97在线观看| 亚洲福利在线播放| 日韩视频在线免费观看| 日韩精品免费在线播放| 少妇高潮 亚洲精品| 性欧美暴力猛交69hd| 亚洲男人的天堂网站| 91亚洲国产成人久久精品网站| 国产精品9999| 欧美在线www| 亚洲欧美另类人妖| 欧美电影在线观看网站| 大桥未久av一区二区三区| 日韩精品中文字幕在线播放| 亚洲国产精品电影| 欧美日韩亚洲精品内裤| 欧美丰满老妇厨房牲生活| 亚洲欧美日韩图片| 精品亚洲男同gayvideo网站| 欧美在线视频观看免费网站| 久久人91精品久久久久久不卡| 欧美日韩成人在线视频| 欧美视频在线视频| 日韩成人在线免费观看| 欧美日韩亚洲高清| 久久久久久久爱| 色综合久久久888| 精品中文字幕视频| 国产精品久久久久久久app| 日韩在线观看精品| 欧美怡红院视频一区二区三区| 日韩免费av片在线观看| 欧美视频在线看| 国产日韩欧美视频在线| 久久久噜噜噜久久中文字免| 国产日韩欧美日韩大片| 77777亚洲午夜久久多人| 欧美性色视频在线| 欧美在线视频在线播放完整版免费观看| 在线成人免费网站| 伊人久久五月天| 4438全国亚洲精品在线观看视频| 日韩亚洲国产中文字幕| 中文日韩电影网站| 亚洲最新中文字幕| 国产精品香蕉国产| 日韩欧美中文第一页| 欧美日韩999| 日本精品性网站在线观看| 国产精品视频大全| 日韩av在线免费观看| 亚洲色图25p| 久久久久免费视频| 国产福利精品av综合导导航| 蜜月aⅴ免费一区二区三区| 成人乱色短篇合集| 久久亚洲一区二区三区四区五区高| 久久夜精品香蕉| 91视频国产高清| 日韩美女在线观看一区| 欧美猛交ⅹxxx乱大交视频| 欧美成年人网站| 亚洲a∨日韩av高清在线观看| 日韩在线视频中文字幕| 色中色综合影院手机版在线观看| 国产精品一区二区久久久久| 色爱av美腿丝袜综合粉嫩av| 亚洲精品国产美女| 国产精品劲爆视频| 久久网福利资源网站| 欧美电影免费观看电视剧大全| 亚洲精品国产综合久久| 亚洲护士老师的毛茸茸最新章节| 国产精品xxx视频| 中文字幕在线亚洲| 隔壁老王国产在线精品| 亚洲欧美一区二区三区情侣bbw| 欧美日韩国产一中文字不卡| 午夜精品蜜臀一区二区三区免费| 色综合色综合久久综合频道88| 美日韩精品免费视频| 日本久久亚洲电影| 亚洲香蕉成视频在线观看| 久久久综合免费视频| 在线成人免费网站| 国产精品精品久久久久久| 亚洲精品一区二区网址| 另类少妇人与禽zozz0性伦| 91色在线观看| 欧美性jizz18性欧美| 亚洲高清色综合| 日韩av免费网站| 亚洲在线免费看| 国产免费一区二区三区在线观看| 日本欧美国产在线| 欧美精品电影免费在线观看| 岛国视频午夜一区免费在线观看| 黑人巨大精品欧美一区二区免费| 久久伊人91精品综合网站| 欧美日韩中文字幕| 久久人人爽亚洲精品天堂| 亚洲字幕在线观看| 欧美猛交免费看| 日韩欧美aⅴ综合网站发布| 欧美视频中文字幕在线| 北条麻妃99精品青青久久| 午夜精品www| 久久久91精品国产一区不卡| 久久久久久91| 欧美激情一区二区三级高清视频| 国产小视频国产精品| 欧美在线观看日本一区| 欧美日韩免费在线| 成人av在线网址| 国产精品高潮视频| 亚洲国产91精品在线观看| 国产精品18久久久久久首页狼| 亚州精品天堂中文字幕| 欧美日韩一区二区免费在线观看| 亚洲影视中文字幕| 欧美在线视频免费| 国产一区二区三区久久精品| 国产精品美女免费看| 久久99久久99精品中文字幕| 欧美日韩免费在线观看| 国产精品久久久久一区二区| 久操成人在线视频| 亚洲午夜小视频| 久久人人爽人人爽人人片av高清| 亚洲视频综合网| 日韩av不卡电影| 4438全国亚洲精品在线观看视频|