C++中const關鍵字的使用總結

?const是不變的意思,在C++程序中,經常用const來限制對一個對象的操作:

?

1.1 const變量

例如:?const?int?n=3;???則這個變量的值不能改變,即不能對變量賦值。

?

1.2??const參數

出現在函數參數中的const表示在函數體中不能對這個參數做修改。比如strcmp()函數用來比較兩個字符串的大小,在函數體中不應該改變兩個的參數的值,所以將它定義為是const的。const通常用來限制函數的指針參數、引用和數組參數,而一般形式的參數因為形式參數和實參本來就不在同一個內存空間,所以對形式參數的修改不影響實在參數,因此也沒有必要限制函數不能對參數進行修改。

下面是一些使用函數const參數的例子:

(1)函數strcpy()src字符串的內容復制到targ字符串中,為保證src字符串不被修改,將它定義問const參數:

void?strcpy(const?char*?src,char?*?targ);

?(2)函數max()?從數組array中找出具有最大值的數組元素并返回這個最大元素的值,為保證數組元素不會再函數中被修改,將它定義為const參數:

int?max(const?int?array[]?,int?size);

??? ?(3)函數outputOjbect()將類MyClass的對象obj的內容輸出。對象定義為const引用,即可以保證對象不會在函數體中所改變,又可以節省對象傳遞的開銷,如:

void?outputObject(const?MyClass?&?obj);

?

1.3 const?返回值

函數返回值為const只有用在函數返回為引用的情況。函數返回值引用常量表示不能將函數調用表達式作為左值使用。

例如:

int?&min(int?&i,int?&j); 可以對函數調用進行賦值,因為它返回的是左值: min(a,b)=4;

但是,如果對函數的返回值限定為const的:

const?int?&min(int?&i?,?int?&j); 那么,就不能對min(a,b)調用進行賦值了。

?

1.4 const?函數

在學到類時,將會看到可以為類的成員函數進行如下形式的定義:

calss?classname{

public?:

int?getMember()?const;

private?:

int?member;

};

這里,在函數定義頭后面加上的const表示這個函數是一個“只讀函數”,函數不能改變類對象的狀態,不能改變對象的成員變量的值。如在函數體中不能這么寫:

classname::getMember()

{

member=4; //錯誤!不能修改成員變量的值

return?member;

}

?

1.5 用const?來限制指針

1).指向常量的指針:

const出現在指針定義的最開始時,表示定義了一個指向常量的指針。比如:

??int?i;????const?int?ci=20;

?const?int?*?ip1=&ci;????const?int?*?ip2=&i;

??這里定義了兩個指向常量的指針,ip1ip2。并且ip1初始化為指向一個常量ciip2初始化為指向一個變量i

??????? 指向常量的指針的含義是:不能用過指針來間接修改指針所指向內存空間的值。比如上面的例子就不能通過*ip1來修改常量ci的值,也不能通過*ip2來修改變i的值,所以下面的語句不正確:

?????? ?*ip1=34 //錯誤!?ip1是指向常量的指針

????? ??*ip2=54;????????//錯誤!?ip12是指向常量的指針

在使用指向常量的指針時,應該注意以下幾點:

a).指向常量的指針只限制指針的間接訪問操作,而不會限制指針變量本身的操作。所以,可以改變指針本身的值。比如可以修改ip1ip2的值:ip1=&i;??ip2=&ci;

b).指向常量的指針只限制指針的間接訪問的操作,但不會限制所指向的空間的操作。比如指針ip指向一個變量i:

??????? ?int?i;???const?int?*??ip=&i;

???????? *ip=34;????//錯誤!?ip是指向常量的指針

?????? i=56;??????//正確,i是一個變量

? ??c).如果要給一個指針賦一個常量的地址,則這個地址必須定義成指向常量的指針。這樣可以保證不會通過指針來間接修改常量的值。比如:

?????????? const?int?ci=30; //正確!

?????????? const?int*?ip1=&ci; //錯誤!?必須將ip2定義成指向常量的指針

?????? ci是一個常量,如果要將它的地址賦值給一個指針,這個指針必須是一個指向常量的指針。所以不能將一個不指向常量的指針ip2指向常量ci.

?

2). 指針常量

在定義指針的時候,可以通過在指針名的前面加上const來將指針定義成常量,稱為指針常量。和一般的常量一樣,我們不能修改指針常量的值。即我們只能在定義指針時將它初始化為指向某個地方,不能再對指針賦值。下面是對指針常量的定義:

int?i,j;

int?*?const?ip=&i; //正確!定義指針常量ip,初始化為指向變量i

ip=&j; //錯誤!不能改變指向常量的值

注意,對指針變量的const限制并不影響對它所指向空間的操作。可以通過間接引用來操作符‘*’來修改指針所指向的空間值。例如上面定義的指針常量ip指向變i,可以通過*ip來改變i?的值:?*ip=32 //正確!

3).?指向常量的指針常量

如果將上面兩個結合起啦,就可以定義指向常量的指針常量。下面定義了這么一個指針:

const?int?ci=93;

const?int?*?const?pi=&ci;

指向常量的指針常量必須在定義時初始化,它的使用也非常受限制,我們不能改變指針本身的值,也不能通過指針來間接改變指針,只能在程序中使用它們的值。

?

上面介紹了利用const來限定指針的三種情況。需要記住的是,指針本身和指針所指向的空間是兩個不同的內存空間,所以需要對兩者分別限定。

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374000.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php封裝redis負載均衡類

$array array( master > array( "redis://127.0.0.1:6379?timeout1", ), slave > array( "redis://127.0.0.1:6479?timeout1", "redis://127.0.0.1:6579?timeout1", ) ); $redis R…

我今天對JavaFX的了解

如果您沒有聽說過,JavaFX 2是Java的新Desktop / web / client框架。 自JavaFX 1以來,它已經進行了相當大的改動(坦率地說,效果并不那么令人印象深刻)。 自定義腳本語言已經淘汰了,您可以使用標準Java和基于…

怎么解決xp系統不能安裝NET Framework4.0?

.net 4.0安裝不上解決方法: 引用 9 樓 MoreQuestion 的回復: 全部都不行!就是用360軟件管家安裝那個就可以了。用了樓主的方法,果然可行啊 1.先安裝wic。 2.用360安裝.net40 本帖最后由 不懂 于 2014-6-6 00:56 編輯Windows Server 2003 如何…

C++內聯(inline)函數

內聯函數 內聯函數是一種特殊類型的函數,內聯函數在定義或聲明時前面加上“inline”關鍵字。比如: inline int max(int a,int b) { return (a>b)?a:b; } 內聯(inline)是內聯擴展(inline expansion)的簡…

我的python學習筆記全集_記錄我的Python學習筆記

不想再像以前那樣,什么都從頭開始學習語法、總結語法,這樣反而會過分糾結于語法,耽誤了開發,畢竟語言的主要屬性是工具,次要的屬性是語言本身。所以還是先熟練使用語言去進行開發,等足夠熟悉了,…

HDU 5794:A Simple Chess(Lucas + DP)

題目鏈接:http://acm.split.hdu.edu.cn/showproblem.php?pid5794 題意:讓一個棋子從(1,1)走到(n,m),要求像馬一樣走日字型并只能往右下角走。里面還有r個障礙點不能經過或者到達&am…

php源碼分析之PHPAPI宏的作用

在PHP源碼中,我們經常會看到很多函數前面有個PHPAPI,但這是什么呢? 于是我在php源碼/main/php.h中找到了它的定義 #ifdef PHP_WIN32 # include "tsrm_win32.h" # include "win95nt.h" # ifdef PHP_EXPORTS # …

15分鐘內開始使用Amazon Web Services和全自動資源調配

在等待一個新項目時,我想學習一些有用的東西。 而且由于在許多項目中我們需要評估和測試正在開發的應用程序的性能,而很少有足夠的硬件來生成實際負載,因此我決定學習更多有關按需在云中按需配置虛擬機的知識,即Amazon Web Servic…

解析JVM內存區域組成

在方法(代碼塊)中定義一個變量時,java就在棧中為這個變量分配JVM內存空間,當超過變量的作用域后,java會自動釋放掉為該變量所分配的JVM內存空間;而在堆中分配的JVM內存由java虛擬機的自動垃圾回收器來管理。…

python打開瀏覽器后帶cookie_Python爬蟲使用瀏覽器的cookies:browsercookie

很多用Python的人可能都寫過網絡爬蟲,自動化獲取網絡數據確實是一件令人愉悅的事情,而Python很好的幫助我們達到這種愉悅。然而,爬蟲經常要碰到各種登錄、驗證的阻撓,讓人灰心喪氣(網站:天天碰到各種各樣的爬蟲抓我們網…

VS插件開發

參考資料: VS插件開發 - 個性化VS IDE編輯器 自己動手編寫一個VS插件(一) VS Addin插件基本開發入門 VS Addin插件配置、部署 轉載于:https://www.cnblogs.com/wangwangfei/p/5830081.html

使用AspectJ,Javassist和Java Proxy進行代碼注入的實用介紹

靜態地或在運行時將代碼片段注入已編譯的類和方法中的功能可能會很有幫助。 這尤其適用于在沒有源代碼的第三方庫中或在無法使用調試器或探查器的環境中對問題進行故障排除。 代碼注入對于處理涉及整個應用程序的問題(例如性能監視)也很有用。 以這種方式…

Java中的變量

java類的成員變量有兩種:一種是被static關鍵字修飾的變量,叫類變量或者靜態變量;另一種沒有static修飾,為實例變量。 在語法定義上的區別:靜態變量前要加static關鍵字,而實例變量前則不加。 在程序運行時的…

無限漫游

一、FAT AP架構下,AP設備不做認證時: (1) AP1,AP2正常工作,發送Beacon幀,向STA通告支持的無線服務; (2) STA搜索到AP1的信號,向AP1發Probe Request,請求獲取AP1所提供的無線服務;AP…

uni-app內置地圖軌跡_MIUI11 新增親情守護,支持安全圍欄、運動軌跡功能

點擊右上角關注我們,每天給您帶來最新最潮的科技資訊,讓您足不出戶也知道科技圈大事!日前,小米 MIUI 體驗總負責人 MIUI小凡 在微博上為大家預告了 MIUI11 的新特性「親情守護」,并表示「在親情守護中,我們…

:before與:after偽類的應用

1.小三角樣式 .tip{ position:relative; display:inline-block; width:100px; margin:100px; padding:30px 20px; color:#fff; border:1px solid #666; border-radius:5px; background-color:rgba(0,153,51,1);}.tip:before{ content:; posit…

小心重載API方法

重載方法是API設計中的重要概念,尤其是當您的API是流利的API或DSL( 特定于域的語言 )時。 對于jOOQ就是這種情況,在這種情況下,您經常想使用與完全相同的方法名稱來與庫進行各種交互。 示例:jOOQ條件 pac…

phpcms 下載模型列表頁直接點擊下載

下載模型設置本地下載 列表頁模板直接調用 <article class"prjDown"><p class"prjDownTitle">方案下載</p><nav class"prjDownNav"><ul>{pc:content action"lists" catid"$catid" num"3…

為什么Java中類方法不能訪問實例方法

我們已經知道類體中的方法分為實例方法和類方法兩種&#xff0c;用static修飾的是類方法。二者有什么區別呢&#xff1f;當一個類創建了一個對象后&#xff0c;這個對象就可以調用該類的方法。 當類的字節碼文件被加載到內存時&#xff0c;類的實例方法不會被分配入口地址&…

python展開 c函數中的宏預處理_C中的預處理宏

C中的預處理宏宏定義就屬于預處理命令的一種。那么&#xff0c;什么是宏呢&#xff1f;宏&#xff1a;c語言標準允許在程序中用一個標識符來表示一個字符串。標識符就是宏名。宏替換&#xff1a;宏替換就是宏定義。在編譯預處理中&#xff0c;將程序中所有的宏名用相應的字符串…