1、在說明const之前首先提出乙個問題:const有什麼用途?
(2023年某公司面試題)
解析:在c程式中,const的用法主要有定義常量、修飾函式引數、修飾函式返回值
在c++程式中,它還可以修飾函式的定義體,定義類中某個函式為恆態函式,即不改變類中的資料成員。
答案:(1)可以定義常量
(2)const可以修飾函式的引數和返回值,甚至函式的定義體。被const修飾的東西受到強制保護,可以預防意外的變動,能提高程式的健壯性。
這是乙個面試題,那我們以面試題為切入點,來展開,在c/c++中const到底是怎麼用的?
在書中引入const限定符的時候是這麼介紹的:
以乙個迴圈語句為例:
for(int index = 0;index != 512;++index)
在這個迴圈語句中要比較index與512的大小。假設這個程式非常龐大,512出現了100次,另外這100次中有80次表示某一特殊緩衝區的大小,剩餘20次用於其他目的。現在我們要把這個緩衝區的大小增大到1024。那就給**的維護帶來很大的麻煩,我們需要一次次的檢查512出現的位置,以便確定哪些512表示緩衝區的大小,哪些不是。
為了解決這個問題,我們來修改這個**:
我們可以使用乙個初始化為512的物件:
int bufsize = 512;
for(int index = 0;index != 512;++index)
這樣解決起來似乎就解決了這個問題,工作量也明顯表少。但是此時還有個問題,就是bufsize是可以被修改的,bufsize可能被有意或者無意的修改。
那如何解決呢?
此時就有了const限定符來解決這個問題,它把乙個物件轉換成乙個常量。
const int bufsize = 512;//此時的bufsize是不可以修改的。
/*******************此時就回答了乙個問題就是:const可以定義常量***************/
2、const的全域性訪問與區域性訪問的問題?
與其他的變數不同,除非特殊說明,在全域性作用域宣告的const變數是定義該物件檔案的區域性變數,簡單的說只存在於那個檔案中,不能被其他檔案訪問。那如何處理這個區域性全域性化的問題呢?
解決:可以通過指定const變數為extern,就可以再整個程式中訪問const物件:
案列://file_1.cc
extern const int bufsize = fcn();
//通過fcn的返回值來定義和初始化bufsize,定義為extern意味著可以被其他檔案使用
//file_2.cc
extern const int bufsize;
//同樣的是乙個extern的宣告,但是沒有初始化。
for(int index = 0;index != bufsize;++index)
/****這地方就是解釋了const的第二個作用:可以修飾函式的返回值和引數,在c++程式中,它還可以修飾函式的定義體****/
3、const與#define相比有什麼不同?
分析:在回答這個問題的時候,我們先要了解下巨集定義這個問題,巨集定義是c提供的預處理功能的一種,巨集定義主要是用乙個指定的識別符號(即名字)來代表乙個字串。如#define pi 3.14
const也是限定了乙個變數來表示常量,且這個變數不能夠修改。
說白了共同點:二者都可以定義常量。
(1)const常量具有資料型別,比如int char啊之類的,而#define沒有資料型別。編譯器可以對前者進行安全型別檢查,而對後者只進行字元替換,這樣運用#define可能會產生意想不到的錯誤(邊際效應)
(2)有些整合化的除錯工具可以對const常量進行除錯,但是不能對巨集常量進行除錯。在c++程式中只使用const常量而不使用巨集常量,即const常量完全取代巨集常量。
c c學習筆記 (6)
關於運算子過載 不可過載的運算子 賦值 下標 呼叫 成員訪問箭頭 運算子 相對的解引用 也應該是成員函式 必須是成員函式,復合賦值運算子一般來說也應該是成員。改變物件狀態的運算子如自增 自減 解引用等通常也應該是成員,對於這些成員運算子函式應該返回所屬類的乙個物件。具有對稱性的運算子可能轉換任意一端...
c c 學習筆記 6
今天主要學習到的是靜態變數 static 暫存器變數 register 初始化 遞迴 預處理器。比較容易混淆的是關於靜態變數的,而靜態變數分為 靜態區域性變數和靜態全域性變數。靜態區域性變數 1 靜態區域性變數在函式內定義 它的生存期為整個源程式,但是其作用域仍與自動變數相同,只能在定義該變數的函式...
c c 學習筆記1
2019.7.8 1 c資料型別有哪些 int,float double,char,int 指標,指向不同型別前面的修飾不同 void 無型別 struct 結構 union 聯合 c型別修飾符 long 8位16進製制 short 4位16進製制 un signed有無符號,陣列 int 變數名 ...