C++?常用關(guān)鍵字使用舉例
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;volatile:x可能被外部(如硬件)修改,每次訪問需從內(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問題:const和constexpr的區(qū)別?
const表示運行時常量(值可能運行時確定)constexpr表示編譯時常量(值必須編譯時確定)constexpr函數(shù)可在編譯期執(zhí)行
到此這篇關(guān)于C++ 常用關(guān)鍵字的文章就介紹到這了,更多相關(guān)C++ 常用關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
git修改和刪除功能_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了git修改和刪除功能,需要的朋友可以參考下2017-08-08
web壓力測試工具_動力節(jié)點Java 學(xué)院整理
本文給大家分享幾個web 壓力測試工具,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-08-08
GitLab?服務(wù)器宕機時的項目代碼恢復(fù)方法
當(dāng) GitLab 服務(wù)器意外宕機且沒有備份時,項目代碼的恢復(fù)變得尤為關(guān)鍵,這篇文章主要介紹了GitLab服務(wù)器宕機時的項目代碼恢復(fù)方法,需要的朋友可以參考下2025-04-04
TortoiseSVN忽略(Global?ignore)提交文件設(shè)定方式
文章介紹兩種SVN忽略雜碎文件的方法:本地配置忽略規(guī)則(修改config文件中的global-ignores參數(shù))和服務(wù)器端設(shè)置(通過svn:ignore屬性),方法一適合個人,方法二需管理員權(quán)限,均需注意空格格式避免報錯2025-08-08
Nodejs創(chuàng)建TCP服務(wù)器 - king0222
這篇文章主要介紹了Nodejs創(chuàng)建TCP服務(wù)器 - king0222的相關(guān)資料,需要的朋友可以參考下2015-09-09
在Linux下用軟件實現(xiàn)RAID功能的實現(xiàn)方法
安裝程式實現(xiàn)軟件RAID代替硬件RAID的方法,今天再進一步談?wù)勈謩觿?chuàng)建軟RAID和日常維護的方法。2011-04-04

