最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++編程中const的使用詳解

 更新時間:2022年03月31日 13:16:13   作者:zou_albert  
這篇文章主要為大家詳細(xì)介紹了C/C++編程中const的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1 概述:const和define的區(qū)別

先看一個典型的程序:

#include<iostream>
using namespace std;
int main()
{
	int num = 1;
	#define t1 num + num
	#define t2 t1 % t1
	cout << "t2 is " << t2 << endl; // t2 is 2
	const int s1 = num + num;
	const int s2 = s1 % s1;
	cout << "s2 is " << s2 << endl; // s2 is 0
    return 0;
}

運行結(jié)果如注釋所示,分別得到“t2 is 2”、“s2 is 0”???
分析原因:const定義的常量s1、s2,則s1的值是num+num,s2的值是s1%s1,所以最后結(jié)果為“s2 is 0”;而define定義的變量作替換后,C++把cout<<"t2 is "<<t2<<endl;語句譯成了:cout<<"t2 is "<<num+num%num+num<<endl;所以結(jié)果為“t2 is 2”(1+0+1=2)

注意:define定義的內(nèi)容,建議增加使用括號()

	#define t1 (num + num)
	#define t2 (t1 % t1)

具體分析define與const的區(qū)別,如下定義:

const float PI = 3.14;
#define PI (3.14)
  • 類型的安全性檢查:const常量有數(shù)據(jù)類型,而define定義宏常量沒有數(shù)據(jù)類型。則編譯器可以對前者進行類型安全檢查,而對后者只進行字符替換,沒有類型安全檢查(字符替換時可能會產(chǎn)生意料不到的錯誤,如上面的程序所示);
  • 調(diào)試:部分調(diào)度工具可以對const常量進行調(diào)度,但不能對宏常量進行調(diào)度;
  • 編譯器的處理方式不同:define宏是在預(yù)處理階段展開,const常量則是編譯運行階段使用;
  • 存儲方式不同:define宏僅僅是展開,有幾個地方使用則展開幾次,不分配內(nèi)存;const常量會在內(nèi)存中分配地址(可以是堆中也可以是棧中);
  • 效率:define定義的常量在內(nèi)存中有若干個拷貝;const定義的常量在程序運行過程中只有一份拷貝,甚至不為普通const常量分配存儲空間,而是將它們保存在符號表中,相當(dāng)于沒有了讀內(nèi)存的操作,使得效率也很高。

2. 修飾局部變量

const約束對象的訪問性質(zhì):使得對象只能讀,不能寫:不允許修改對象的值.

const 是constant 的縮寫,“恒定不變”的意思。被const 修飾的東西都受到強制保護,可以預(yù)防意外的變動,能提高程序的健壯性。所以很多C++程序設(shè)計書籍建議:“Use const whenever you need”。

const int n=5;
int const n=5;

這兩種寫法是一樣的,都是表示變量n的值不能被改變了,需要注意的是,用const修飾變量時,一定要給變臉初始化,否則之后就不能再進行賦值了。

// C     
const int num = 100;
(int *)&num = 4;   //可以間接修改

C的const表示修飾只讀變量,但是我們可以惡意強制操作const對象。

接下來看看const用于修飾常量靜態(tài)字符串,例如:

const char* str="fdsafdsa";

如果沒有const的修飾,我們可能會在后面有意無意的寫str[4]=’x’這樣的語句,這樣會導(dǎo)致對只讀內(nèi)存區(qū)域的賦值,然后程序會立刻異常終止。有了const,這個錯誤就能在程序被編譯的時候就立即檢查出來,這就是const的好處。讓邏輯錯誤在編譯期被發(fā)現(xiàn)。

如下修改都是不允許的。

 // c++
 const int i = 0;   //是一個右值,有內(nèi)存實體
 i = 11;          //錯誤:向只讀變量‘i'賦值
 const int a{1.1}; //錯誤:從“double”轉(zhuǎn)換到“int”需要收縮轉(zhuǎn)換,請初始化成相同類型的常量

3. 常量指針與指針常量

常量指針是指針指向的內(nèi)容是常量,可以有一下兩種定義方式。

const int * n;
int const * n;

需要注意的是一下兩點:

1、常量指針說的是不能通過這個指針改變變量的值,但是還是可以通過其他的引用來改變變量的值的。

int a=5;
const int* n=&a;
a=6;

指針常量是指指針本身是個常量,不能在指向其他的地址,寫法如下:

int *const n;

需要注意的是,指針常量指向的地址不能改變,但是地址中保存的數(shù)值是可以改變的,可以通過其他指向改地址的指針來修改。

int a=5;
int *p=&a;
int* const n=&a;
*p=8;

注意:區(qū)分常量指針和指針常量的關(guān)鍵就在于星號的位置,我們以星號為分界線,如果const在星號的左邊,則為常量指針,如果const在星號的右邊則為指針常量。如果我們將星號讀作‘指針’,將const讀作‘常量’的話,內(nèi)容正好符合。int const * n;是常量指針,int *const n;是指針常量。

指向常量的常指針

是以上兩種的結(jié)合,指針指向的位置不能改變并且也不能通過這個指針改變變量的值,但是依然可以通過其他的普通指針改變變量的值。

const int* const p;

4. 修飾函數(shù)的參數(shù)

根據(jù)常量指針與指針常量,const修飾函數(shù)的參數(shù)也是分為三種情況。

1、防止修改指針指向的內(nèi)容

void StringCopy(char *strDestination, const char *strSource);

其中 strSource 是輸入?yún)?shù),strDestination 是輸出參數(shù)。給 strSource 加上 const 修飾后,如果函數(shù)體內(nèi)的語句試圖改動 strSource 的內(nèi)容,編譯器將指出錯誤。

2、防止修改指針指向的地址

void swap ( int * const p1 , int * const p2 )

指針p1和指針p2指向的地址都不能修改。

3、以上兩種的結(jié)合。

5. 修飾函數(shù)的返回值

如果給以“指針傳遞”方式的函數(shù)返回值加 const 修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返回值只能被賦給加const 修飾的同類型指針。

例如函數(shù):

const char * GetString(void);

如下語句將出現(xiàn)編譯錯誤:

char *str = GetString();

正確的用法是

const char *str = GetString();

6. 修飾全局變量

全局變量的作用域是整個文件,我們應(yīng)該盡量避免使用全局變量,因為一旦有一個函數(shù)改變了全局變量的值,它也會影響到其他引用這個變量的函數(shù),導(dǎo)致除了bug后很難發(fā)現(xiàn),如果一定要用全局變量,我們應(yīng)該盡量的使用const修飾符進行修飾,這樣防止不必要的人為修改,使用的方法與局部變量是相同的。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 使用C++實現(xiàn)簡單的文章生成器

    使用C++實現(xiàn)簡單的文章生成器

    這篇文章主要為大家詳細(xì)介紹了鵝湖使用C++實現(xiàn)簡單的狗屁不通文章生成器,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以了解下
    2024-03-03
  • C++中Socket網(wǎng)絡(luò)編程實例詳解

    C++中Socket網(wǎng)絡(luò)編程實例詳解

    這篇文章主要介紹了C++中Socket網(wǎng)絡(luò)編程實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C++執(zhí)行Linux Bash命令的方法

    C++執(zhí)行Linux Bash命令的方法

    今天小編就為大家分享一篇C++執(zhí)行Linux Bash命令的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • C++順序表的基本操作實現(xiàn)

    C++順序表的基本操作實現(xiàn)

    大家好,本篇文章主要講的是C++順序表的基本操作實現(xiàn),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 全排列算法的原理和實現(xiàn)代碼

    全排列算法的原理和實現(xiàn)代碼

    這篇文章主要介紹了全排列算法的原理和實現(xiàn)代碼,全排列是將一組數(shù)按一定順序進行排列,如果這組數(shù)有n個,那么全排列數(shù)為n!個,需要的朋友可以參考下
    2014-08-08
  • 封裝常用正則表達(dá)式的用法

    封裝常用正則表達(dá)式的用法

    這篇文章主要介紹了使用C++封裝常用正則表達(dá)式的用法,方便以后直接使用,最后還給出了測試代碼,大家可運行測試使用
    2014-03-03
  • C語言實現(xiàn)自動給QQ好友發(fā)窗口抖動

    C語言實現(xiàn)自動給QQ好友發(fā)窗口抖動

    這篇文章主要介紹了C語言實現(xiàn)自動給QQ好友發(fā)窗口抖動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 一文帶你了解C++中deque的使用

    一文帶你了解C++中deque的使用

    C++中的deque是一種雙端隊列,可以在隊列的前端和后端進行插入元素和刪除操作,同時可以視作一個長度不定的數(shù)組,支持高效的插入和刪除操作。本篇文章將深入探討C++中的deque的使用,感興趣的可以了解一下
    2023-05-05
  • vs2019+win10配置boost庫的詳細(xì)教程

    vs2019+win10配置boost庫的詳細(xì)教程

    這篇文章主要介紹了vs2019+win10配置boost庫,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • C++、python和go語言實現(xiàn)的簡單客戶端服務(wù)器代碼示例

    C++、python和go語言實現(xiàn)的簡單客戶端服務(wù)器代碼示例

    這篇文章主要介紹了C++、python和go語言實現(xiàn)的簡單客戶端服務(wù)器代碼示例,本文分別給出了3種語言的客戶端服務(wù)器通信代碼實例,需要的朋友可以參考下
    2015-03-03

最新評論

江都市| 从化市| 尉氏县| 河北区| 卫辉市| 洛阳市| 迭部县| 吉隆县| 铅山县| 邯郸市| 内黄县| 巴青县| 青浦区| 大竹县| 横峰县| 阜城县| 宁陕县| 宁安市| 南乐县| 井研县| 金川县| 肥乡县| 怀仁县| 金乡县| 吴江市| 东莞市| 桂阳县| 古丈县| 定南县| 沐川县| 全南县| 闵行区| 广宗县| 和平区| 临泉县| 新巴尔虎右旗| 龙门县| 同江市| 日土县| 仁寿县| 马边|