1. 程式人生 > >C++關鍵字

C++關鍵字

asm

auto

bad_cast

bad_typeid

bool

break

case

catch

char

class

const

const_cast

continue

default

delete

do

double

dynamic_cast

else

enum

except

explicit

extern

false

finally

float

for

friend

goto

if

inline

int

long

mutable

namespace

new

operator

private

protected

public

register

reinterpret_cast

return

short

signed

sizeof

static

static_cast

struct

switch

template

this

throw

true

try

type_info

typedef

typeid

typename

union

unsigned

using

virtual

void

volatile

while

(1)auto

  這個這個關鍵字用於宣告變數的生存期為自動,即將不在任何類、結構、列舉、聯合和函式中定義的變數視為全域性變數,而在函式中定義的變數視為區域性變數。這個關鍵字不怎麼多寫,因為所有的變數預設就是auto的。

(2)register

這個關鍵字命令編譯器儘可能
的將變數存在CPU內部暫存器中而不是通過記憶體定址訪問以提高效率。

(3)static

常見的兩種用途: 
    1>統計函式被呼叫的次數; 
    2>減少區域性陣列建立和賦值的開銷.變數的建立和賦值是需要一定的處理器開銷的,特別是陣列等含有較多元素的儲存型別。在一些含有較多的變數並且被經常呼叫的函式中,可以將一些陣列宣告為static型別,以減少建立或者初始化這些變數的開銷.

  詳細說明: 
    1>、變數會被放在程式的全域性儲存區中,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是它與堆疊變數和堆變數的區別。 
    2>、變數用static告知編譯器,自己僅僅在變數的作用範圍內可見。這一點是它與全域性變數的區別。 
    3>當static用來修飾全域性變數時,它就改變了全域性變數的作用域,使其不能被別的程式extern,限制在了當前檔案裡,但是沒有改變其存放位置,還是在全域性靜態儲存區。

  使用注意: 
    1>若全域性變數僅在單個C檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度; 
    2>若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度; 
    3>設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題(只要輸入資料相同就應產生相同的輸出)。

(4)const

被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。它可以修飾函式的引數、返回值,甚至函式的定義體。

  作用: 
    1>修飾輸入引數 
      a.對於非內部資料型別的輸入引數,應該將“值傳遞”的方式改為“const引用傳遞”,目的是提高效率。例如將void Func(A a) 改為void Func(const A &a)。 
      b.對於內部資料型別的輸入引數,不要將“值傳遞”的方式改為“const引用傳遞”。否則既達不到提高效率的目的,又降低了函式的可理解性。例如void Func(int x) 不應該改為void Func(const int &x)。 
    2>用const修飾函式的返回值 
      a.如果給以“指標傳遞”方式的函式返回值加const修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const修飾的同類型指標。 
       如對於: const char * GetString(void); 
       如下語句將出現編譯錯誤: 
        char *str = GetString();//cannot convert from 'const char *' to 'char *'; 
       正確的用法是: 
       const char *str = GetString(); 
      b.如果函式返回值採用“值傳遞方式”,由於函式會把返回值複製到外部臨時的儲存單元中,加const修飾沒有任何價值。 如不要把函式int GetInt(void) 寫成const int GetInt(void)。 
    3>const成員函式的宣告中,const關鍵字只能放在函式宣告的尾部,表示該類成員不修改物件.

   說明: 
    const type m; //修飾m為不可改變 
   示例: 
    typedef char * pStr; //新的型別pStr; 
    char string[4] = "abc"; 
    const char *p1 = string; 
    p1++; //正確,上邊修飾的是*p1,p1可變 
    const pStr p2 = string; 
    p2++; //錯誤,上邊修飾的是p2,p2不可變,*p2可變 
   同理,const修飾指標時用此原則判斷就不會混淆了。 
    const int *value; //*value不可變,value可變 
    int* const value; //value不可變,*value可變 
    const (int *) value; //(int *)是一種type,value不可變,*value可變 
              //邏輯上這樣理解,編譯不能通過,需要tydef int* NewType; 
    const int* const value;//*value,value都不可變

(5)volatile

表明某個變數的值可能在外部被改變,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。它可以適用於基礎型別如:int,char,long......也適用於C的結構和C++的類。當對結構或者類物件使用volatile修飾的時候,結構或者類的所有成員都會被視為volatile. 
  該關鍵字在多執行緒環境下經常使用,因為在編寫多執行緒的程式時,同一個變數可能被多個執行緒修改,而程式通過該變數同步各個執行緒。 
  簡單示例: 
   DWORD __stdcall threadFunc(LPVOID signal) 
   { 
     int* intSignal=reinterpret_cast(signal); 
     *intSignal=2; 
     while(*intSignal!=1) 
     sleep(1000); 
     return 0; 
   } 
  該執行緒啟動時將intSignal 置為2,然後迴圈等待直到intSignal 為1 時退出。顯然intSignal的值必須在外部被改變,否則該執行緒不會退出。但是實際執行的時候該執行緒卻不會退出,即使在外部將它的值改為1,看一下對應的偽彙編程式碼就明白了: 
     mov ax,signal 
     label: 
     if(ax!=1) 
     goto label 
  對於C編譯器來說,它並不知道這個值會被其他執行緒修改。自然就把它cache在暫存器裡面。C 編譯器是沒有執行緒概念的,這時候就需要用到volatile。volatile 的本意是指:這個值可能會在當前執行緒外部被改變。也就是說,我們要在threadFunc中的intSignal前面加上volatile關鍵字,這時候,編譯器知道該變數的值會在外部改變,因此每次訪問該變數時會重新讀取,所作的迴圈變為如下面偽碼所示: 
     label: 
     mov ax,signal 
     if(ax!=1) 
     goto label

  注意:一個引數既可以是const同時是volatile,是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。

(6)extern

  extern 意為“外來的”···它的作用在於告訴編譯器:有這個變數,它可能不存在當前的檔案中,但它肯定要存在於工程中的某一個原始檔中或者一個Dll的輸出中。

相關推薦

C# 關鍵字explicit(顯示),implicit(隱式),類型的隱式和顯式轉換

tar oid bsp color col 必須 code 類型 顯示 class Program { static void Main(string[] args) { Adaptee ada = ne

C# 關鍵字extern用法

rop bst 服務 abstract 單個 c++ 方法 oid enc   修飾符用於聲明在外部實現的方法。extern 修飾符的常見用法是在使用 Interop 服務調入非托管代碼時與 DllImport 屬性一起使用;在這種情況下,該方法還必須聲明為 static,

C# 關鍵字out

函數調用 medium 函數 初始 過程 type str lis size 在循環中使用時需要註意 如果不賦初值創建基礎數據類型被某函數調用通過out關鍵字標識調用時,如果處於循環之中,則該變量將不再定義時歸初值。 案例: foreach (TestUnit testUn

C/C++關鍵字extern有關的原理

為什麽 拒絕 方式 明顯 想要 概念 編譯 純c 嚴重 關鍵字有一定的語義,但是用法不唯一。 對於C/C++語言的預編譯、編譯、匯編、鏈接。我相信大家在接觸C++一年不到就背的滾瓜爛熟,但是其中的細節,是後來才慢慢想明白的。為什麽我不講extern關鍵字呢?extern關鍵

C#關鍵字—方法參數

函數的調用 允許 object cif 多個 定義 argument doc 數組參數 Printed From Microsoft.docs; 使用 params 關鍵字可以指定采用數目可變的參數的方法參數。 可以發送參數聲明中所指定類型的逗號分隔的參數列表或指定類型的

C#關鍵字

bsp png bubuko mage 標識 不能 字符 img 字母 用來定義C#語言的字符串記號 關鍵字不能被用來做變量名或者其他形式的標識符,除非以 @ 字符開始所有C#關鍵字全部由小寫字母組成C#關鍵字

C++關鍵字、名稱空間、函式過載、預設引數、行內函數、引用

一 .C++入門 1.C++關鍵字 2.名稱空間 3.C++輸入&輸出 4.預設引數 5.函式過載 6.引用 7.行內函數 8.auto關鍵字 9.基於範圍的for迴圈 10.指標空值nullptr&nullptr_t 二. 正文 1.C++關鍵字(C++98)   

C++複習筆記——C++ 關鍵字

文章目錄 關鍵詞總覽索引 關鍵詞詳解 關鍵詞總覽索引 關鍵詞 關鍵詞 關鍵詞 關鍵詞 asm else

C#關鍵字、面向對象特點、訪問修飾符、數據類型等

bst 裝箱 一個 傳遞 抽象類 作用 引用類型 來看 不同的 new關鍵字 一、創建對象 (一)在堆中開辟控件,引用類型在堆中 (二)在開辟的堆控件中,創建對象 (三)調用對象的構造函數 二、隱藏父類的成員 this (一)代表當前類的對象 (二)顯示調用自己的構造函數

C#關鍵字、面向物件特點、訪問修飾符、資料型別等

new關鍵字 一、建立物件 (一)在堆中開闢控制元件,引用型別在堆中 (二)在開闢的堆控制元件中,建立物件 (三)呼叫物件的建構函式 二、隱藏父類的成員 this (一)代表當前類的物件 (二)顯示呼叫自己的建構函式 base (一)顯示呼叫父類的建構函式 (二)呼叫父類的成員 &nb

C#關鍵字using的幾種用法

     一、作為語句,強制物件清理         用於定義一個範圍,在此範圍的末尾將釋放物件         C# 通過 .NET Framework 公共語言執行庫 (CLR) 自動釋放

C++ 關鍵字:static 、const

目錄 1.const 1.1const最重要的一條:隱藏。(作用域限制在單個原始檔) (static函式,static變數均可) 當同時編譯多個檔案時,所有未加static字首的全域性變數和函

網際網路面試經典 -C/C++關鍵字

register:register關鍵字的作用:請求CPU儘可能讓變數的值儲存在CPU內部的暫存器中,減去CPU從記憶體中抓取資料的時間,提高程式執行效率。register作用的實現原理:擴充套件:CP

C#關鍵字之Partial詳解

Partial是區域性型別的標誌。區域性型別可以實現將一個類、結構或介面分成幾個部分,分別放在在幾個不同的.cs檔案中(當然也可以放在同一個.cs檔案中)。在程式進行編譯之後,將會合併成一個完整的類。因此區域性型別並沒有看起來那麼難以理解,使用partial只是

C#關鍵字partial在asp.net mvc中的應用

一、概念 一個產品級別的類很容易達到成百上千行程式碼。一個類定義在一個*.CS檔案中,這就將導致程式碼檔案非常長。在建立類時,大多數程式碼在確立之後基本上就不再改變了。例如:欄位資料、屬性和建構函式在生產過程中很少變動,而方法卻需要經常改變。這時,你可以將一個類分佈到多個C

C# 關鍵字集合,IDictionary

可以通過繼承DictionaryBase類實現通過關鍵字進行索引 例項: public class A : DictionaryBase { public void Add(string newId, A classA) {

C++關鍵字

asm auto bad_cast bad_typeid bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum e

C++關鍵字:mutable

       一個物件的狀態由其非靜態資料成員的值構成,因此,修改一個數據成員將會改變整個物件的狀態。將一個成員函式宣告為 const 能夠保證它不會改變物件的狀態。Mutable 資料成員的使用看上去像是騙術,因為它能夠使 const 函式修改物件的資料成員。然而,明智

C++關鍵字的詳解 ---- volatile關鍵字

1.volatile的定義 volatile關鍵字是一種型別修飾符,用它宣告的型別變量表示可以被某些編譯器未知的因素更改,比如:作業系統、硬體或者其它執行緒等。由於訪問暫存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優化。遇到這個關鍵字宣告的

C#關鍵字-where(泛型型別約束)

在定義泛型類時,可以對客戶端程式碼能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端程式碼嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定