C+基礎知識篇:C+存儲類

2020-12-06 騰訊網

存儲類定義 C++ 程序中變量/函數的範圍(可見性)和生命周期。這些說明符放置在它們所修飾的類型之前。下面列出 C++ 程序中可用的存儲類:

auto

register

static

extern

mutable

thread_local (C++11)

從 C++ 17 開始,auto 關鍵字不再是 C++ 存儲類說明符,且 register 關鍵字被棄用。

auto 存儲類

自 C++ 11 以來,auto關鍵字用於兩種情況:聲明變量時根據初始化表達式自動推斷該變量的類型、聲明函數時函數返回值的佔位符。

C++98標準中auto關鍵字用於自動變量的聲明,但由於使用極少且多餘,在C++11中已刪除這一用法。

根據初始化表達式自動推斷被聲明的變量的類型,如:

auto f=3.14; //double

auto s("hello"); //const char*

auto z = new auto(9); // int*

auto x1 = 5, x2 = 5.0, x3='r';//錯誤,必須是初始化為同一類型

register 存儲類

register存儲類用於定義存儲在寄存器中而不是 RAM 中的局部變量。這意味著變量的最大尺寸等於寄存器的大小(通常是一個詞),且不能對它應用一元的 '&' 運算符(因為它沒有內存位置)。

{

register int miles;

}

寄存器只用於需要快速訪問的變量,比如計數器。還應注意的是,定義 'register' 並不意味著變量將被存儲在寄存器中,它意味著變量可能存儲在寄存器中,這取決於硬體和實現的限制。

static 存儲類

static存儲類指示編譯器在程序的生命周期內保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創建和銷毀。因此,使用 static 修飾局部變量可以在函數調用之間保持局部變量的值。

static 修飾符也可以應用於全局變量。當 static 修飾全局變量時,會使變量的作用域限制在聲明它的文件內。

在 C++ 中,當 static 用在類數據成員上時,會導致僅有一個該成員的副本被類的所有對象共享。

實例

#include

// 函數聲明

void func(void);

static int count = 10; /* 全局變量 */

int main()

{

while(count--)

{

func();

}

return 0;

}

// 函數定義

void func( void )

{

static int i = 5; // 局部靜態變量

i++;

std::cout

std::cout

}

當上面的代碼被編譯和執行時,它會產生下列結果:

變量 i 為 6 , 變量 count 為 9

變量 i 為 7 , 變量 count 為 8

變量 i 為 8 , 變量 count 為 7

變量 i 為 9 , 變量 count 為 6

變量 i 為 10 , 變量 count 為 5

變量 i 為 11 , 變量 count 為 4

變量 i 為 12 , 變量 count 為 3

變量 i 為 13 , 變量 count 為 2

變量 i 為 14 , 變量 count 為 1

變量 i 為 15 , 變量 count 為 0

extern 存儲類

extern存儲類用於提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當您使用 'extern' 時,對於無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。

當您有多個文件且定義了一個可以在其他文件中使用的全局變量或函數時,可以在其他文件中使用 extern 來得到已定義的變量或函數的引用。可以這麼理解,extern 是用來在另一個文件中聲明一個全局變量或函數。

extern 修飾符通常用於當有兩個或多個文件共享相同的全局變量或函數的時候,如下所示:

第一個文件:main.cpp

實例

#include

int count ;

extern void write_extern();

int main()

{

count = 5;

write_extern();

}

第二個文件:support.cpp

實例

#include

extern int count;

void write_extern(void)

{

std::cout

}

在這裡,第二個文件中的 extern 關鍵字用於聲明已經在第一個文件 main.cpp 中定義的 count。現在 ,編譯這兩個文件,如下所示:

$ g++ main.cpp support.cpp -o write

這會產生write可執行程序,嘗試執行write,它會產生下列結果:

$ ./write

Count is 5

mutable 存儲類

mutable說明符僅適用於類的對象,這將在本教程的最後進行講解。它允許對象的成員替代常量。也就是說,mutable 成員可以通過 const 成員函數修改。

thread_local 存儲類

使用 thread_local 說明符聲明的變量僅可在它在其上創建的線程上訪問。變量在創建線程時創建,並在銷毀線程時銷毀。每個線程都有其自己的變量副本。

thread_local 說明符可以與 static 或 extern 合併。

可以將 thread_local 僅應用於數據聲明和定義,thread_local 不能用於函數聲明或定義。

以下演示了可以被聲明為 thread_local 的變量:

thread_local int x; // 命名空間下的全局變量

class X

{

static thread_local std::string s; // 類的static成員變量

};

static thread_local std::string X::s; // X::s 是需要定義的

void foo()

{

thread_local std::vector v; // 本地變量

相關焦點

  • C語言相關文件的基本知識
    用過計算機的人,對文件都不陌生,大多數人都接觸過,今天我們來講講關於C語言相關文件的基本知識。首先,我們先來了解了解什麼是文件。文件有不同的類型,在程序的設計中,主要有兩種文件; 1.程序文件;包括源程序文件(後綴為.c),目標文件(後綴為.obj),可執行文件(後綴為.exe)等,這類文件的內容是程序代碼。
  • C語言基礎知識學習(一)
    C程序基礎1. 標識符在程序中使用的變量名、函數名、數組名、指針名、標號等稱為標識符.這類標識符可以另做他用,但將會失去原意,所以一般不另他用。c) 用戶標識符根據需要定義的標識符。一般用來給變量、函數、數組、文件等命名。用戶標誌符如果與C語言的關鍵字重名,系統報錯;若與標準庫函數重名,系統不報錯,但預定義標識符將會失去原意,代之以用戶新定義的含義。
  • C+基礎知識篇:C+常量
    如果常量以 L(僅當大寫時)開頭,則表示它是一個寬字符常量(例如 L'x'),此時它必須存儲在 wchar_t 類型的變量中。否則,它就是一個窄字符常量(例如 'x'),此時它可以存儲在 char 類型的簡單變量中。 字符常量可以是一個普通的字符(例如 'x')、一個轉義序列(例如 '\t'),或一個通用的字符(例如 '\u02C0')。
  • 最全的C語言基礎知識都在這了
    我們用一個簡單的c程序例子,介紹c語言的基本構成、格式、以及良好的書寫風格,加深小夥伴們對C語言的認識。2、main()----在c語言中稱之為「主函數」,一個c程序有且僅有一個main函數,任何一個c程序總是從main函數開始執行,main函數後面的一對圓括號不能省略。3、被大括號{ }括起來的內容稱為main函數的函數體,這部分內容就是計算機要執行的內容。
  • 什麼是c位?c位是什麼意思?c位的含義
    c位這個詞想必大家一定耳熟能詳,哪怕不知道具體的含義,也多多少少聽過身邊的人說上那麼幾句。c位所以說,c位到底是什麼意思呢?但是不管怎麼樣,c所代表的就是最中心最重要的的意思。在最早期,「C位」一般指舞臺中央或藝人在宣傳海報的中間位置,一般來說,娛樂圈登臺時,只有資歷最老、本事最強的人才能站在c位。C位不僅是身份和本領的表現,更是讓觀眾第一眼就能看到與留意的最佳位置。後來隨著意識的拓展,這個詞也逐步被引申為——處在各種場合中最重要、最受關注的位置。
  • 第二天:C基礎習題
    #include #include int main() { double a, b, c,
  • C+基礎知識篇:C+循環
  • 智能攝像機玩出新花樣,和目 C13c震撼發布
    而在材質方面和目C13c 採用具備抗衝擊性、耐熱性、耐低溫性的 ABS塑料使用起來更為安全,使用周期也更長。和目C13c的高精度運動檢測和自適應噪聲檢測系統,能對關注的區域進行實時的畫面對比和聲音檢測,如有異常,會在3秒內向手機APP推送警報。在發出警報的同時,C13c能實時地記錄視頻並上傳到雲端伺服器保存,不漏過任何重要畫面,即使遭遇偷竊、搶劫、打架鬥毆,也能夠快速查證取證視頻。
  • 「C語言從入門到入土」必備C語言基礎筆記整理
    編輯:首先是編輯,就是在編譯器中輸入原始碼,後綴名是.c||編譯:然後是對目標程序進行編譯,如果源程序沒有錯誤,得到目標程序,後綴.obj(VS編譯快捷鍵方式是Ctrl+F7)|表示問號)printf("輸出三個數 :\n%d\n%d\n%d\n",a,b,c); //變量要先定義,後使用。 在這裡使用換行時應注意 寫成格式 「%d\n」//三個數則要書寫三次。它們相連之間不用分號,也不用逗號。
  • 第一篇:C語言編程基礎語法
    本專欄系列分六篇,總結了C語言基礎知識的核心要點。教學視頻已上線,讀者可根據自身情況有選擇性地學習。01編程基礎C語言——貝爾實驗室、Dennis Ritchie
  • 第15p,計算機的進位與存儲單位,計算機底層理論知識(了解)
    大家好,我是楊數Tos,這是《從零基礎到大神》系列課程的第15篇文章,第二階段的課程:Python基礎知識:進位與存儲單位,詳解計算機底層理論知識。學習本課程,建議先看一遍:【計算機基礎知識】課程。一、計算機中的進位1、什麼是進位?
  • 傳熱基礎篇《一》
    熱量傳遞的三種基本方式:導熱(熱傳導)、對流(熱對流)和熱輻射①導熱(熱傳導)定義:依靠微觀粒子的熱運動而產生的熱量傳遞特點:a  必須有溫差;b  物體直接接觸;c  特點:當流體流過一個物體表面時的熱量傳遞過程,它與單純的對流不同,具有如下特點:   a  導熱與熱對流同時存在的複雜熱傳遞過程   b  必須有直接接觸(流體與壁面)和宏觀運動;也必須有溫差   c  壁面處會形成速度梯度很大的邊界層公式:
  • C語言之const和volatile"究極"學習
    關於const的用法,現在大概前前後後應該寫了有兩篇文章,以前學習的時候,用法體會不是那麼深刻,為啥這麼說呢,因為在學習c++的時候,會發現const關鍵字有新的玩法,關於這個新的玩法,大家可以去看最近學習總結寫的c++文章專輯。
  • 初中數學 二次函數y=ax+bx+c(a≠0)中係數a,b,c的幾何意義 - 周...
    老師今天分享這方面的知識,掌握了一定會解決你的困惑。那麼在解這種題目時,需要弄清楚係數a,b,c與二次函數的關係,以及拋物線在直角坐標系中的幾何意義。二次函數y=ax'+bx+c(a≠0)中係數的幾何意義:(1)a的符號確定拋物線的開口方向。
  • Swift和Objective-C混編
    但是,只能是計算屬性;擴展不能給類,結構體,枚舉類型添加存儲屬性。Swift變量存儲屬性轉為Objective-C的read-write。Swift的類型屬性(type properties)轉為class屬性(譯者註:參考Xcode8添加一個屬性class)。Swif類型方法轉為Objective-C的類方法(靜態方法)。
  • 可能是手感最好的小米手機:小米4c上手評測
    北京時間9月22日,小米公司在北京召開了小米4c媒體溝通會。作為小米4及小米4i的升級版本,小米4c的外觀與此前小米在印度發布的小米4i一致,但硬體配置和軟體方面均有更明顯升級。
  • 快速上手系列-C語言之基礎篇(一)
    按照之前的計劃,這篇文章本該寫C語言簡介,包括一些歷史背景,發展狀況, 語言特點什麼的,這些東西著實比較囉嗦。枚舉的用法以及結構體和共用體的區別以後單獨再寫;(2)控制語句關鍵字(12個)if,else,for,do,while,break,case,continue,default,return,switch,goto(儘量別使用);(3)存儲類關鍵字
  • 在C語言中,核心是指針,靈魂是算法,本篇用源碼解析十大基礎算法原理!
    算法是一個程序和軟體的靈魂,作為一名優秀的程式設計師,只有對一些基礎的算法有著全面的掌握本文是近百個C語言算法系列的第二篇,包括了經典的Fibonacci數列、簡易計算器、回文檢查、質數檢查等算法。也許他們能在你的畢業設計或者面試中派上用場。
  • C Primer Plus 中文版 PDF
    首先基礎內容非常詳實,c語言的語法規則是比較精煉短小的,而這本書除了精講語法內容,還配有大量的代碼示例和代碼講解,這對於小白來說,是非常重要的。如果一上來就講內容,沒有多少代碼,小白可能根本就不知道怎麼寫代碼。代碼這種東西我覺得跟寫文章類似,剛開始要去模仿,熟練之後自然而言就可以自己創作了。還有一點,這本書除了告訴你正確的代碼該怎麼寫,還講述了一些錯誤代碼的寫法。
  • 單片機的C語言中數組的用法
    引入數組的目的,是使用一塊連續的內存空間存儲多個類型相同的數據,以解決一批相關數據的存儲問題。數組與普通變量一樣,也必須先定義,後使用。數組在C51語言的地位舉足輕重,因此深入地了解數組是很有必要的。下面就對數組進行詳細的介紹。