1. 程式人生 > >c++ 間接方式改變const變數

c++ 間接方式改變const變數

indirect change const variable

使用const_cast<>可以將指向const變數的指標(或引用),轉換為非const指標(或引用)。那麼,通過使用轉換後的指標或引用可以改變const變數的值嗎?

c++ 標準裡說,通過這種方式改變變數的值,將會產生undefined的結果。

所以,對於不同的編譯器,往往有不同的實現方法。

本文分析的是gcc的實現,其實,大多數編譯器都是以這種方式實現的。

how do?

我們知道,const變數的初始化可能發生在兩個階段,編譯時刻,執行時刻。

    const int X;

如果是在編譯時刻(或者在編譯時刻,即可確定const變數的值的時候),在編譯時,將所有使用X值的地方,替換為X的常量值;所有,使用X地址的地方,按普通常量處理。

如果是在執行時刻決定,所有用到X的地方,編譯出來的指令,與正常變數沒有區別。

能不能執行?

至於能不能執行,要看,這個變數存在什麼地方,如果存在.rodata段,那麼,改變這個變數,會報錯(執行時錯誤)。但是,如果不是在.rodata段,就不會報錯。

什麼情況下,變數會存在.rodata段:

靜態儲存期變數,編譯時刻,即能初始化的。

相關推薦

c++ 間接方式改變const變數

indirect change const variable 使用const_cast<>可以將指向const變數的指標(或引用),轉換為非const指標(或引用)。那麼,通過使用轉換後的指標或引用可以改變const變數的值嗎? c++ 標準裡說,通過這種方式

C++中如何修改const變數

一、結論 宣告:不同於C語言的const變數修改問題(可以通過指標間接修改const變數的值),這裡只討論C++ 裡的const。 C++ const 修飾符,表示常量,即如果以後保證不會修改則宣告為const,否則若要修改,那一開始為什麼還要宣告為const呢? 根據C+

c/c++筆試題——const型別的成員函式內部如何改變成員變數

      在C++中,由const修飾的成員函式的函式體內部,是不能夠對成員變數進行修改的。這個特性被用來保證某些成員函式在實現過程中,避免由於程式設計師大意而對資料進行了錯誤的修改;同時也說明此成員函式是非修改性的。如只需要返回成員變數的成員函式就被宣告為const型別(

c++基礎:const,變數的作用域和生存期,儲存型別

一:const的使用: const常量型別表示“常值變數”,cosnt型變數代表的常值只在其作用域內有效; const與define相比:const會在編譯時進行型別檢查,而define只做文字替換;define後面不需要分號。 1.宣告變數:例如 const int size = 20; 2.限定

C++ :四種強制型別轉換方式 以及const常量摺疊

  遇到的幾個問題: (1)reinterept_cast:Int和float不能轉換  :傳引用 (2)cons_cast:去掉const屬性,在編譯階段  const int num = 12;    *c++裡

C++進階--const變數

//############################################################# // const // - 編譯時的限制:一個物件不能被修改 // int i = 1; const int *p1 = &i; // 資料不能被修改,指標可以被

C++中類中常規變數const、static、static const(const static)成員變數的宣告和初始化

C++類有幾種型別的資料成員:普通型別、常量(const)、靜態(static)、靜態常量(static const)。這裡分別探討以下他們在C++11之前和之後的初始化方式。 c++11之前版本的初始化 在C++11之前常規的資料成員變數只能在建構函式

C語言中,如何通過函式來改變一個變數的值

最近看面試題,遇到一些關於通過函式改變一個變數的值得問題,現在終結一下: 先看下面一段程式碼: #include <stdio.h>#include <stdlib.h> void GetMemory(char *p) { p=(char

C語言易錯點(函式裡修改傳入變數的值不會改變傳入變數的指標)

函式裡修改傳入變數的值不會改變傳入變數的指標    相關語句如下: uint8_t a,b,c;     a=4;     b=6;     c=0;     oled_printf(0,0,"a:%d b:%d c:%d",a,b,c);     c=Max_Commo

C++編程中const和#define的區別

程序 存在 pan best color 普通 分配 一次 def (1) 編譯器處理方式不同  define宏是在預處理階段展開。  const常量是編譯運行階段使用。(2) 類型和安全檢查不同  define宏沒有類型,不做任何類型檢查,僅僅是展開。  const常量有

3.2 C++繼承方式

pan 基類 price ble tla python const contain 訪問權限 參考: http://www.weixueyuan.net/view/6359.html 總結:   子類繼承父類,繼承方式將限制父類的成員屬性在子類中的訪問權限,子類訪問父類的

3.5 C++間接繼承

統一 pub () right 通過 span bsp 屬性 code 參考:http://www.weixueyuan.net/view/6362.html 總結:   假設類C繼承自類B,類B繼承自類A。那麽類C中的除了能夠繼承B類的成員函數和成員變量外,同樣也能繼承B

特別沒前途的C++ - explicit和volatile/const的內容

color .exe 編程 tar 通過 code 程序 col func 第一眼見到explicit和volatile可能會一楞一楞的覺得可能是c11或者c14新加的標識符。 其實不是這樣,volatile和const兩個關鍵字在C語言的第二個版本KR C的時候就被加入

Linux終端程序用c語言實現改變輸出的字的顏色

光標位置 高亮 AI 藍色 屬性 用c語言實現 TE c語言 說明 顏色代碼: 格式: echo "\033[字背景顏色;字體顏色m字符串\033[0m" 例如: echo "\033[41;36m something here \033[0m" 其中41的位置代表

C++之Static與Const

iostream http cout 出錯 共享 return share block this 指針 目錄 C++之Static與Const 一、Static定義 1.1、Static變量 1.2、static靜態成員小結 1.2、Static函數 1.3、static

C# Base64方式的編碼與解碼

編碼與解碼方法: ///編碼 public static string EncodeBase64(string code_type, string code) { string encode = ""; b

C++的靈活的區域性變數宣告(C++學習筆記 5)

C語言中根據變數的作用域可以把變數分為兩種:區域性變數和全域性變數。 區域性變數:在一個函式內部定義的變數是內部變數,它只在本函式範圍內有效,即只有在本函式內才能使用它們,在此函式外是不能使用這些變數的,這樣的變數成為區域性變數。 區域性變數的特點: (1)主函式main中定義的變數也是

C# 定義了 7 種變數類別:靜態變數、例項變數、陣列元素、值引數、引用引數、輸出引數和區域性變數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C語言小節篇1:關於C語言結構體引用變數的問題

這個問題以前沒注意過,今天和同事討論後,查詢相關資料,想搞懂一個問題: 關於結構體引用變數的符號  .   和   ->   的區別。 目前得到的結論是: 變數引用   . 直針引用&n

C語言指標——對普通變數的指標操作和對陣列(常量)的指標操作

       我們知道,每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。        我們喜歡在程式中使用指標代替陣列,因為變數指標可