91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

const方法怎么在C++中使用

發布時間:2021-01-14 16:24:07 來源:億速云 閱讀:199 作者:Leah 欄目:編程語言

const方法怎么在C++中使用?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

const的基本使用

const的用法我覺得對于一個以后想著做一個優秀的程序員來說,這是必須熟練掌握的技能。因為網上有好多的文章介紹它的寫的非常好,有的我就直接拿過來了~,現在我們來看看他的用法。

const 要求他所修飾的對象為常量,不可被改變,不可被賦值,不可作為左值.

1、函數體內修飾局部變量

例:

void func(){
const int a=0;
}

const作為一個類型限定詞,和int有相同的地位。

const int a; int const a;

是等價的。于是此處我們一定要清晰的明白,const修飾的對象是誰,是a還是int
const要求他所修飾的對象為常量,不可被改變,不可被賦值,不可作為左值(l-value)。所以很明顯它修飾的是a。這是一個很常見的使用方式:

const double pi=3.14;

在程序的后面如果企圖對pi再次賦值或者修改就會出錯。然后看一個稍微復雜的例子。

const int* p;

因為int* p;和 int *p;是等價的。
所以const int (*p)和int const (*p)是等價的。現在一目了然const 修飾的是誰? 是*p.所以p+=1;是合法的

*p+=1;是非法的因為const修飾了你。

int* const p;那這個什么意思?

看const修飾的是什么? 它修飾的p。但是p是一個int型的指針,所以這個指針的地址沒有辦法修改。

p+=1; //這就是非法的
*p+=1; //這個是合法的

再看一個更復雜的例子,它是上面二者的綜合

const int* const p;說明p自己是常量,且p指向的變量也是常量。
于是

p+=1; //非法
*p+=1; //非法

const 還有一個作用就是用于修飾常量靜態字符串。例如:

const char* name=David;

如果沒有const,我們可能會在后面有意無意的寫name[4]='x'這樣的語句,這樣會導致對只讀內存區域的賦值,然后程序會立刻異常終止。有了 const,這個錯誤就能在程序被編譯的時候就立即檢查出來,這就是const的好處。讓邏輯錯誤在編譯期被發現。

2、在函數聲明時修飾參數
舉個例子void * myMemMove(void *dst,constvoid *src,intcount )這是我寫的memmove函數的聲明,這個函數的意思就是(任意類型)把*src的內容復制給*dst,我們現在很明顯的看到*src它只讓你復制,你不能修改它的值,所以怕你在以后的函數的定義里出現問題現在在聲明里限制你。

3、全局變量
我們的原則依然是,盡可能少的使用全局變量。我們的第二條規則 則是,盡可能多的使用const。如果一個全局變量只在本文件中使用,那么用法和前面所說的函數局部變量沒有什么區別。如果它要在多個文件間共享,那么就牽扯到一個存儲類型的問題。

有兩種方式。

1.使用extern
例如
/* test.h */
extern const double pi;
/* test.c */
const double pi=3.14;

然后其他需要使用pi這個變量的,包含test.h

#include test.h

或者,自己把那句聲明復制一遍就好。

這樣做的結果是,整個程序鏈接完后,所有需要使用pi這個變量的共享一個存儲區域。

2.使用static,靜態外部存儲類

/* constant.h */
static const pi=3.14;

需要使用這個變量的*.c文件中,必須包含這個頭文件。

前面的static一定不能少。否則鏈接的時候會報告說該變量被多次定義。這樣做的結果是,每個包含了constant.h的*.c文件,都有一份該變量自己的copy,該變量實際上還是被定義了多次,占用了多個存儲空間,不過在加了static關鍵字后,解決了文件間重定義的沖突。壞處是浪費了存儲空間,導致鏈接完后的可執行文件變大。但是通常,這個,小小幾字節的變化,不是問題。好處是,你不用關心這個變量是在哪個文件中被初始化的。
其實const我覺得更多是程序員自己限制自己,自己告訴自己后面哪里不能出現錯誤

舉個例子吧。

#include<stdio.h>
#include<Windows.h>
int main()
{
	int *p;
	const int a = 0;
	p = &a;
	*p = 3;
	printf("a= %d \n", a);
	system("pause");
	return 0;
}

現在看看運行結果

const方法怎么在C++中使用

現在我要說一個const操作里面比較騷的一些做法,

舉個例子我們以前寫過的一個類,我們會使用operator[]來返回一個reference的指向,這個一般情況我們都會寫一個

const的也會寫一個非const的opeartor[].這是我們最常見的一個代碼:

T& operator[](int position) 
{ 
 return xxx[position]; 
} 
const T& operator[](int position) const 
{ 
 return xxx[position]; 
}

這是我們平時寫的初級的代碼,但是現在當我們要寫一個TextBlock內的opeartor[]不單只返回一個referencr了,也可能執行邊界檢查,日志訪問信息,還有什么數據完善性檢驗等等一大堆繁瑣的代碼,這個時候當你實現operator[] const和operator[]() const,的時候兩份代碼大部分都一樣,這里伴隨的是代碼重復,編譯時間變長,維護代碼膨脹等等頭疼的問題. 當然啦,你可以讓上述那些繁瑣的函數全部封裝的別的函數中,然后分別在operator[]()和operator[]()const當中調用但是你還說重復了一些代碼比如兩次return語句,函數調用.真正該做的是實現operator[]的機能一次并使用它兩次。也就是你只需要寫一個函數,令另外一個調用這個,這促使我們將常量性轉移. 接下來 見證奇跡我們來看看下面這個代碼是怎么實現的上述的操作的:

class TextBlock 
{ 
public: 
 ... 
 const char& operator[](std::size_t position) const 
 { 
 ... 
 ... 
 ... 
 return text[position]; 
 } 
 
 char& operator[](std::size_t position) 
 { 
 return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]); 
 } 
};

來仔細看這個操作;return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);
首先把*this強制轉換為const TextBlock,再然后調用const的operator[],最后再把const的operator[]的返回值的const常量性取消,然后返回一個非const的值. 這里的調用實在是太妙了,我們可以思考一下,好好想想這里的深意.
但是會有人說,為什么不用const operator[]調用operator[]呢,這樣強制兩個都可以行的通啊.這樣想是錯的!

令const版本調用調用no-const版本以避免重復并不是你該做的事情. 記住const所修飾函數的承諾就是我絕對不會修改你,no-const函數可沒有這種承諾,所以你讓一個const函數去調用一個no-const函數是不現實的. over其實const有很多可以玩的屬性,只要我們想到就可以去實現,這里就說這么一個就ok. 接下來我們來瞧瞧另外兩個關鍵字.

 C++中的const的使用詳解

const在c/c++中還是會經常出現的,并且如果不理解const會在編程出現的錯誤而不知所措,無法理解。下面從幾個角度簡要理解const的內容,應該還是蠻有用的。

const與指針類型

const int*p = NULL; 和int const*p = NULL;是等價的。因為const都在“ * ”的前面,其實是以*為標志的。

1. int x = 3; const int *p = &x; 


// p = &y;正確 , //*p = 4;錯誤

指針其實一般是4個字節長度。p的內容是存儲0x….,就是其他數據的地址。因此這里的const修飾*p就是說:*p的內容是不可直接被賦值改變的。

而p本身存儲的地址是可變的,可以變成其他的0x…..當p指向其他的數據地址時,*p也就隨之變成新的數據。

int x = 3; int *const p = &x; //p = &y是錯誤的

總結:其實是看這個const是在的前面還是后面,如果在的前面,則表示修飾的是整個“ p ”,而在后面,則表示修飾的是只有p。

顯然有:在前面,則表示整個*p是const的,因此p可以指向其他的地址,而*p則是const的,無法改變。同理,int *const p = &x;則表示指針p是固定的,就是說p指針存儲的地址是固定的,其內容是const,因此無法修改為其他值(即指向其他地址)。

const與引用

int x = 3; const int &y = x; 
//x = 10;正確 //y = 20; 錯誤

引用前面有const,所以不能通過y來修改x的值。

本人的理解:const int &y就是相當于const int *y1 = &x;然后y = 20就相當于*y1 = 20;這顯然時不允許的(就如前面所說的,*p時const,無法直接賦值給*p)。因為引用就相當于給x取了一個別名y,此時y不就是y1指針所指的內容嗎?也就是說上面的例子:y = 20;就是相當于 *y1 = 20.

錯誤的const使用

其他:const int x = 3; int *y = &x; 不能通過編譯。因為可能通過*p修改本應該是const的x;
int x = 3; const int *y = &x; 這是可以的,這里的x是可變的,通過由于*y是const的,因此*y就是只能是讀取x的值,而不具有寫入x的權利。

總結:可以說是只能把一個東西權限縮小,而不能使其原始的權限增大。

const在函數中的應用

主要是防止函數的誤操作,對值進行更改

void fun(const int&a, const int&b) 
{ 
//這里就不能對a或b進行更改,否則會編譯出錯 
}

看完上述內容,你們掌握const方法怎么在C++中使用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武川县| 藁城市| 遂平县| 和龙市| 西充县| 肥城市| 灵台县| 望奎县| 峡江县| 济宁市| 桃园市| 平利县| 新乡县| 鄂托克旗| 承德市| 长汀县| 广河县| 北安市| 福建省| 武汉市| 廉江市| 罗江县| 邵阳市| 定远县| 昭平县| 白银市| 河西区| 平罗县| 乌鲁木齐县| 涪陵区| 临澧县| 道真| 西峡县| 长岭县| 吉木萨尔县| 红河县| 汉寿县| 康乐县| 盖州市| 蒲城县| 鹿泉市|