1. 程式人生 > >對C++中const的總結

對C++中const的總結

1、C++中const的實現機制
簡單的說,const在C語言中表示只讀變數,在C++中表示常量。

void CFun(){
const int num = 10;
int *ptr = (int *)(&num);
*ptr = 20;
printf("num = %d, *ptr = %d\n", num, *ptr);
}

輸出為 num = 20, *ptr = 20;

C語言中const表示只讀的變數,那麼記憶體中就有儲存它的記憶體空間,並且可以通過指標間接改變該記憶體空間的值。
當通過ptr改變該記憶體中的值後,再獲取num的值的時候會訪問該空間,得到的是被改變後的值。

const int num = 10;
int *ptr = const_cast<int *>(&num);
*ptr = 20;

cout << "num = " << num << ", *ptr = " << *ptr << endl;

輸出 num = 10, *ptr = 20
C++把const看做常量,編譯器會使用常數直接替換掉對num的引用,並不會去訪問num的記憶體地址去取資料
cout << num; 理解成 cout << 10;

struct Test {
int num;
char ch;
Test(){
num = 10;
ch = 'a';
}
};
const struct Test test;
int *ptr1 = (int *)(&test.num);
ptr1 = 20;

cout << "struct test.num = " << test.num << ", *ptr1 = " << *ptr1 << endl;

輸出:struct test.num = 20, *ptr1 = 20
C++中只是對內建資料型別做常量替換,對於結構體這種非內建型別則不會,因此必須要訪問記憶體去取資料,
而訪問記憶體取到的必然是被指標ptr1改變後的值,因此會造成和const int不一樣的結果。

2、const和#define區別
1>編譯器處理方式不同
#define巨集在預處理階段展開
const常量是編譯執行階段使用
2>型別和安全檢查不同
#define巨集沒有型別,不做型別檢查,僅僅是展開
const常量有具體的型別,在編譯階段執行型別檢查
3>儲存方式不同
#define巨集僅僅是展開,有多少地方使用就展開多少次,不會分配記憶體
const常量會在記憶體中分配
4>const節省空間,避免不必要的記憶體分配
#define PI 3.14159
const double Pi = 3.14159; 此時並未將Pi放入ROM中
double i = Pi; 此時為Pi分配記憶體,以後不再分配
double I = PI; 編譯期間進行替換,分配記憶體
double j = Pi; Pi不再分配記憶體
double J = PI; 再次進行替換,又一次分配記憶體
5>提高效率
編譯器通常不為普通const常量分配儲存空間,而是將他們儲存在符號表中,使它成為一個編譯期間的常量,沒有儲存和讀記憶體的操作,它的效率也很高


3、const的過載
Class A{
int fun();
int fun() const;
};
A類中fun()發生了過載。只有A類的const物件才能呼叫const版本的fun(),而非const物件可以呼叫任意一種,但通常非const物件呼叫非const版本。
分析:函式名相同而形參列表不同的函式稱為過載。在類中,由於隱含this指標,
const版本的fun()使得作為形參的this指標型別變成指向const物件的指標。
非const版本的fun()使得作為形參的this指標就是正常版本的指標。此處是發生過載的本質。
this指標是一個const指標,地址不能改,但能改變其指向的物件或者變數)

相關推薦

C++const總結

1、C++中const的實現機制 簡單的說,const在C語言中表示只讀變數,在C++中表示常量。 void CFun(){const int num = 10;int *ptr = (int *)(

c/c++const用法總結

沒有 pan 分配 值類型 變量初始化 _id 多少 部分 參數 1、修飾常量時:   const int temp1; //temp1為常量,不可變   int const temp2; //temp2為常量,不可變 2、修飾指針時:   主要看const在*的前後,

C++ const 應用總結

//test const 使用細則 class Game { public: int a; }; void function(const Game& obj) { //obj.a = 1; //×,內容不可變 } void function(const stri

C++CONST用法總結

1、修飾常量時: ? 1 2 const int temp1; //temp1為常量,不可變 int const temp2; //temp2為常量,不可變 2、修飾指標時:   主要看const在*的前後,

C++const與指標、引用的總結

C++中函式的引數相比C語言中的函式引數要複雜的多,其中主要的原因是C++中引入了引用以及const限定符。這兩個物件的引入,使得C++中的函式引數變得異常的複雜多變,每一種型別都具有比較適合的使用範圍。 一,引用 引用是物件的別名,必須在初始化的過程中與一個具體的物件繫

關於C++const的全面總結

 C++中的const關鍵字的用法非常靈活,而使用const將大大改善程式的健壯性,本人根據各方面查到的資料進行總結如下,期望對朋友們有所幫助。 Const 是C++中常用的型別修飾符,常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值是不能被更新的。

C++const的一些總結

1.const常量代替#define巨集定義 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤。(上面這段話出自《高質量C++程式設計指南》) 2.const

C++ const總結

const宣告一個只讀變數 與其他變數不同,除非特別說明,在全域性作用域宣告的const變數是定義該物件的檔案的區域性變數,非const變數預設為extern。要是const變數能夠在其他的檔案中訪問,必須顯示地指定它為extern。 const引用能指向co

C++const常量的用法總結

C++中const用法總結 思維方式:是什麼?為什麼?怎麼用? C++中有些什麼東西? const可以修飾些什麼? 什麼原理(誰變,誰不變)? 有什麼好處? C++中有些什麼? 資料:變數、常量(字面量) 函式(方法)、{程式碼塊} 常量: 1,0.1,’a’,”

c++函式同名情況的總結

c++中函式同名的情況有三種:過載(overload),覆蓋(override)和隱藏。 1.概念上的區別 過載:函式名相同,引數不同。過載函式處於同一個範圍,比如同一個類中。 覆蓋:函式名和引數都相同。函式處於基類和派生類中。它是針對虛擬函式的概念,指的是派生

[轉]C++const的使用

用法 non-const tint brush include 函數返回 .com pre oid 原文鏈接:http://www.cnblogs.com/xudong-bupt/p/3509567.html 平時在寫C++代碼的時候不怎麽註重const的使用,長久以來就把

C/C++const關鍵字的用法及其與宏定義的比較

類型安全 屬性 const關鍵字 code oid 程序 函數返回值 存儲空間 臨時對象 1.const關鍵字的性質 簡單來說:const關鍵字修飾的變量具有常屬性。 即它所修飾的變量不能被修改。 2.修飾局部變量 1 const int a = 10; 2 int co

預處理、const、static與sizeof-C++const有什麽作用(至少說出3個)

什麽 需要 char 修改 抽象 ons 時間 數據 amp 1:作用如下: (1)const用於定義常量:const定義的常量編譯器可以對其進行數據靜態類型安全檢查。 (2)const修飾函數形式的參數:當輸入參數為用戶自定義類型和抽象數據類型時,應該將“值傳遞”改為“c

【轉】C++const在函數名前面和函數後面的區別

const成員函數 調用 參數傳遞 成員 指向 int 區別 ... urn 一、概念   當const在函數名前面的時候修飾的是函數返回值,在函數名後面表示是常成員函數,該函數不能修改對象內的任何成員,只能發生讀操作,不能發生寫操作。 二、原理:   我們都知道在調用

C++const,static,inline的用途

ue4 dba pac use lzw fsm 強硬 oci jce G7U42mcs62卸ehttp://www.docin.com/app/user/userinfo?userid=180985862 閱惶0欠4r肝6置gw人http://docstore.docin

C#const用法詳解

htm 鏈接 服務器 span img body 用法詳解 -s 設計 本文實例講述了C#中const用法。分享給大家供大家參考。具體用法分析如下: const是一個c語言的關鍵字,它限定一個變量不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性,另外,

C++const和#define的利弊探索

C++學習 C++學習總結 C++靈感 const和#define的利弊,從而推導const的意義; const和#define都有類似的功能,那就是定義一個“常量”; 想用來替換#define定義常量這種方式。這是一種定義宏的方式。因為宏替換定義常量有一定的缺陷:不做類型檢查,沒有作用域限制(這

C++const的使用

section star str c++ 使用 nbsp input -s ron const T *** const var_name 用英文的原話理解,從右向左讀, * 為 pointer,每多一層加一次 to. 讀作: declare var_name

C++】CC++ const常量 - 修改時報錯

#include <stdio.h> #define PAUSE printf("Press Enter key to continue - By WangLei ..."); fgetc(stdin); int main() { const int n = 10; // &

C/C++const探討

學習const之前先來回顧三個概念,常量,變數,常變數 常量:常量是程式執行過程中其值不能改變的量,我們任意說一個數字,一個單詞都是一個常量,例如3就是常量,apple也是常量,常量就相當於數學上常數的概念,只不過計算機資料型別並不是只有數字,所以稱之為常量。根據資料型別的不同又分為數值常量,字