亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++?常用關(guān)鍵字使用舉例

 更新時間:2025年11月07日 16:48:27   作者:xclic  
本文總結(jié)C++常用關(guān)鍵字,如static控制作用域與生命周期,const聲明常量增強類型安全,volatile防止優(yōu)化,class與struct默認權(quán)限差異,enumclass強類型,typedef/using定義類型別名,以及virtual、override、final、explicit、noexcept、constexpr等作用,感興趣的朋友一起看看吧

1. static

控制作用域、生命周期或類成員歸屬

// 1. 全局/命名空間:僅當(dāng)前文件可見(避免跨文件重定義)
static int global_static = 10; // 其他文件無法通過 extern 訪問
// 2. 局部變量:生命周期延長至程序結(jié)束(僅初始化1次)
void counter() {
    static int cnt = 0; 
    cnt++; 
    cout << cnt << " "; // 調(diào)用3次輸出:1 2 3
}
// 3. 類成員:屬于類(所有對象共享),需類外初始化
class Car {
public:
    static int total; // 聲明
    static void printTotal() { cout << total << endl; } // 無 this 指針
};
int Car::total = 0; // 必須類外初始化(全局作用域)

注意:類 static 成員函數(shù)不能訪問非 static 成員(無 this 指針)。

問題static 關(guān)鍵字的三種用法及區(qū)別?

  • 全局 / 命名空間:限制符號僅當(dāng)前文件可見,解決 “重復(fù)定義” 問題。
  • 局部變量:生命周期為程序全程(僅初始化 1 次),作用域仍為函數(shù)內(nèi)(避免全局變量污染)。
  • 類成員:變量屬于類(所有對象共享),函數(shù)無 this 指針(僅訪問 static 成員),需類外初始化。

2. const

聲明 “不可修改的常量”,增強類型安全

// 1. 修飾變量:值不可改
const int MAX = 100; 
// MAX = 200; // 錯誤:const 變量禁止寫入
// 2. 修飾指針(兩種場景)
const int* p1;    // 指針指向的內(nèi)容不可改(*p1 = 5 錯誤)
int* const p2 = &MAX; // 指針本身不可改(p2 = &x 錯誤)
const int* const p3; // 指針和內(nèi)容均不可改
// 3. 修飾成員函數(shù):保證不修改非 static 成員(this 變?yōu)?const T*)
class A {
    int x = 5;
public:
    void print() const { 
        // x = 10; // 錯誤:const 函數(shù)禁止修改成員
        cout << x << endl; 
    }
};
// 4. 修飾函數(shù)參數(shù):防止函數(shù)內(nèi)部修改實參
void func(const string& s) { 
    // s = "new"; // 錯誤:禁止修改參數(shù)
}

問題const 與 #define 的區(qū)別?

維度const#define
類型檢查有(編譯器檢查類型安全)無(文本替換,易出錯)
作用域受局部 / 類 / 命名空間限制從定義到 #undef 全局
內(nèi)存分配內(nèi)存(可取地址)不分配內(nèi)存(僅替換)
調(diào)試可被調(diào)試器識別替換后無法調(diào)試

3. volatile

告知編譯器 “變量可能被意外修改”(如硬件、多線程),禁止優(yōu)化(每次從內(nèi)存讀?。?。

volatile int flag = 0; // 可能被其他線程/硬件修改
while (flag == 0) { 
    // 循環(huán)等待:每次從內(nèi)存讀 flag(而非寄存器緩存)
}

問題volatile 與 const 能否同時修飾一個變量?
可以。例如 const volatile int x; 表示:

  • const:當(dāng)前代碼不能修改 x;
  • volatilex 可能被外部(如硬件)修改,每次訪問需從內(nèi)存讀取。

4. mutable

允許在 const 成員函數(shù)中修改被修飾的成員變量(突破 const 限制)。

class Cache {
private:
    mutable int hit_count = 0; // 可在 const 函數(shù)中修改
public:
    int get_data() const {
        hit_count++; // 合法:hit_count 是 mutable
        return 42;
    }
};

5. extern

聲明 “外部符號”(定義在其他文件),或指定 C 語言編譯規(guī)則。

// 1. 聲明外部變量(file1.cpp 定義,file2.cpp 使用)
// file1.cpp: int global_val = 100;
extern int global_val; // file2.cpp 聲明(無需初始化)
// 2. 調(diào)用 C 語言函數(shù)(避免 C++ 名稱修飾)
extern "C" {
    #include "c_library.h" // C 頭文件(如 printf)
}

6. thread_local(C++11+)

定義 “線程局部變量”(每個線程有獨立副本,生命周期與線程一致)

#include <thread>
thread_local int thread_id = 0; // 每個線程有獨立的 thread_id
void worker(int id) {
    thread_id = id; 
    cout << "Thread " << thread_id << endl; // 每個線程輸出自己的 id
}
int main() {
    thread t1(worker, 1);
    thread t2(worker, 2);
    t1.join(); t2.join(); // 輸出:Thread 1 \n Thread 2
}

7. class vs struct

均用于定義類,核心區(qū)別是默認訪問權(quán)限繼承方式

class A { 
    int x; // 默認 private(僅類內(nèi)訪問)
};
struct B { 
    int y; // 默認 public(外部可直接訪問)
};
// 繼承權(quán)限區(qū)別
class C : A { ... }; // 繼承默認 private(A 的 public 成員變?yōu)?C 的 private)
struct D : B { ... }; // 繼承默認 public(B 的 public 成員仍為 D 的 public)

問題class 和 struct 的核心區(qū)別?

  • 默認成員權(quán)限:class 默認為 private,struct 默認為 public。
  • 默認繼承權(quán)限:class 繼承默認為 private,struct 繼承默認為 public
  • 語義習(xí)慣:struct 多用于 “數(shù)據(jù)聚合”(如 POD 類型,無復(fù)雜行為),class 多用于 “封裝對象”(含成員函數(shù)和狀態(tài)管理)。

8. enum vs enum class(C++11+)

定義枚舉類型,enum class 是 “強類型枚舉”(更安全)。

// 傳統(tǒng) enum:作用域全局,可隱式轉(zhuǎn)換為 int(易沖突)
enum Color { RED, GREEN, BLUE };
Color c = RED;
int x = RED; // 隱式轉(zhuǎn)換(不推薦)
// enum class(強類型):作用域受限,無隱式轉(zhuǎn)換(推薦)
enum class Direction { LEFT, RIGHT };
Direction d = Direction::LEFT; // 必須用 :: 訪問
// int y = Direction::LEFT; // 錯誤:無隱式轉(zhuǎn)換

9. typedef vs using(C++11+)

定義類型別名(簡化復(fù)雜類型),using 支持模板別名(更靈活)。

// typedef 定義別名
typedef std::vector<int> IntVec;
typedef int (*FuncPtr)(int, int); // 函數(shù)指針別名
// using 定義別名(C++11+,支持模板)
using IntVec = std::vector<int>;
template <typename T>
using Ptr = T*; // 模板別名(typedef 無法實現(xiàn))
Ptr<int> p = new int(10); // 等價于 int* p

10. typename

  • 在模板中聲明 “類型名”(區(qū)分類型與非類型成員);
  • 替代 class 作為模板參數(shù)關(guān)鍵字。
template <typename T> // 等價于 template <class T>
class MyClass {
    typename T::SubType* ptr; // 聲明 T::SubType 是類型(否則編譯器視為成員變量)
};

11. 基本數(shù)據(jù)類型關(guān)鍵字

包括 bool(布爾)、char(字符)、int(整數(shù))、float/double(浮點數(shù))、void(無類型)等,以及擴展類型 short/long(長度修飾)、signed/unsigned(符號修飾)、wchar_t/char8_t/char16_t/char32_t(字符編碼)。

bool flag = true;
char c = 'a';
int x = 10;
long long num = 1e18;
unsigned int cnt = 0;
wchar_t wstr[] = L"中文"; // 寬字符
char8_t u8str[] = u8"UTF-8"; // C++20 新增

12. virtual

聲明虛函數(shù)(實現(xiàn)多態(tài))或虛析構(gòu)函數(shù)(避免內(nèi)存泄漏)。

class Base {
public:
    virtual void run() { cout << "Base run"; } // 虛函數(shù)(可被重寫)
    virtual ~Base() { cout << "Base 析構(gòu)"; }   // 虛析構(gòu)(確保派生類析構(gòu)被調(diào)用)
};
class Derived : public Base {
public:
    void run() override { cout << "Derived run"; } // 重寫虛函數(shù)
    ~Derived() override { cout << "Derived 析構(gòu)"; }
};
Base* obj = new Derived();
obj->run(); // 輸出 "Derived run"(多態(tài):運行時綁定)
delete obj; // 先調(diào)用 Derived 析構(gòu),再 Base 析構(gòu)(無內(nèi)存泄漏)

13. override(C++11+)

顯式聲明 “重寫基類虛函數(shù)”,編譯器檢查簽名一致性(避免筆誤)。

class Base {
public:
    virtual void func(int x) {}
};
class Derived : public Base {
public:
    void func(int x) override {} // 正確:重寫 Base::func
    // void func(double x) override {} // 錯誤:參數(shù)類型不匹配(編譯器報錯)
};

14. final

禁止類被繼承或虛函數(shù)被重寫。

class FinalClass final {}; // 禁止被繼承
// class Sub : public FinalClass {}; // 錯誤
class Base {
public:
    virtual void stop() final {} // 禁止重寫
};
class Derived : public Base {
    // void stop() override {} // 錯誤:stop 是 final
};

15. explicit

禁止單參數(shù)構(gòu)造函數(shù)的 “隱式轉(zhuǎn)換”(避免意外類型轉(zhuǎn)換)。

class Point {
public:
    explicit Point(int x) : x(x) {} // 禁止隱式轉(zhuǎn)換
private:
    int x;
};
Point p1(10); // 正確:顯式構(gòu)造
// Point p2 = 10; // 錯誤:explicit 禁止 int→Point 的隱式轉(zhuǎn)換

16. noexcept(C++11+)

聲明函數(shù) “不會拋出異常”,幫助編譯器優(yōu)化,避免異常傳播。

void func() noexcept { // 聲明不拋異常
    // 若函數(shù)內(nèi)拋出異常,會調(diào)用 std::terminate()
}
void func2() noexcept(false) { // 聲明可能拋異常
    throw std::runtime_error("error");
}

17. constexpr(C++11+)

聲明 “編譯期常量” 或 “編譯期可執(zhí)行函數(shù)”(提升性能)。

constexpr int MAX = 100; // 編譯期常量
constexpr int add(int x, int y) { return x + y; }
constexpr int sum = add(3, 5); // 編譯期計算,sum=8

問題constconstexpr的區(qū)別?

  • const表示運行時常量(值可能運行時確定)
  • constexpr表示編譯時常量(值必須編譯時確定)
  • constexpr函數(shù)可在編譯期執(zhí)行

到此這篇關(guān)于C++ 常用關(guān)鍵字的文章就介紹到這了,更多相關(guān)C++ 常用關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論