【C++進階】函數:深度解析 C++ 函數的 12 大進化特性

目錄

一、函數基礎

1.1 函數定義與聲明

1.2 函數調用

1.3 引用參數

二、函數重載:同名函數的「多態魔法」(C++ 特有)

2.1 基礎實現

2.2 重載決議流程圖

2.3 與 C 語言的本質區別

2.4 實戰陷阱

三、默認參數:接口的「彈性設計」(C++ 特有)

3.1 語法規則

3.2 C 語言替代方案(笨拙且易錯)

四、內聯函數:性能與代碼的「平衡藝術」

4.1 C++ vs C 的內聯差異

4.2 現代 C++ 實踐(C++17)

4.3.?內聯函數示例

4.4?注意事項

五、constexpr 函數:編譯期計算的「常量革命」(C++11+)

5.1 基礎用法

5.2 與 C 宏的本質區別

5.3 實戰案例:編譯期斐波那契數列?

六、lambda 表達式:匿名函數的「編程解放」(C++11+)

6.1 基礎語法

6.2 捕獲方式對比

6.3 與 C 函數指針的對比

6.4 Lambda表達式示例?

七、函數模板:泛型編程的「基石」

7.1 基礎實現

7.2 模板特化(Partial Specialization)

八、成員函數:類的「行為封裝」(C++ 特有)

8.1 成員函數分類

8.2 虛函數:多態的核心?

8.3 const 成員函數:數據安全的保障

九、異常規范:錯誤處理的「契約式設計」

9.1 現代 C++ 實踐(noexcept)

9.2 與 C 語言的對比

十、尾隨返回類型:類型推導的「語法革命」(C++11+)

10.1 基礎用法

?10.2 復雜類型示例

十一、初始化捕獲:lambda 的「狀態封裝」(C++14+)

11.1 語法創新

11.2 與 C 語言的對比

十二、友元函數:打破封裝的「雙刃劍」(C++ 特有)

12.1 基礎用法

12.2 友元模板

十三、函數指針進化:從過程到對象的「尋址革命」

13.1 成員函數指針

13.2 與 C 語言函數指針的對比

十四、C++20 新特性:函數的「終極進化」

14.1 協同函數(Coroutine)

十五、最佳實踐與性能優化

15.1 重載決議優化

15.2 lambda 性能優化

15.3 成員函數設計原則

十六、總結:C++ 函數的「編程范式躍遷」

十七、參考資料


C 語言的函數是面向過程的「子程序」,而 C++ 的函數是面向對象和泛型編程的「一等公民」。本文將通過12 個核心特性,通過與C語言的對比分析,重點講解C++在函數設計上的改進與創新。

一、函數基礎

在C和C++中,函數都是實現代碼復用的重要手段。函數允許將一段代碼封裝起來,通過函數名進行調用,從而提高代碼的可讀性和可維護性。

1.1 函數定義與聲明

在C語言中,函數的定義和聲明通常如下所示:

// 函數聲明
int add(int a, int b);// 函數定義
int add(int a, int b) {return a + b;
}

在C++中,函數的定義和聲明與C語言非常相似,但C++允許函數具有更復雜的類型系統,例如返回類型和參數類型可以是用戶自定義的類型。

#include <iostream>// 用戶自定義類型:二維點
struct Point {int x;int y;// 成員函數示例void print() {std::cout << "(" << x << ", " << y << ")\n";}
};// 函數聲明(參數和返回類型均為自定義類型)
Point addPoints(const Point& a, const Point& b);int main() {// 創建自定義類型對象Point p1 = {1, 2};Point p2 = {3, 4};// 調用自定義類型參數的函數Point result = addPoints(p1, p2);// 使用自定義類型的成員函數result.print();  // 輸出:(4, 6)return 0;
}// 函數定義(實現細節)
Point addPoints(const Point& a, const Point& b) {Point sum;sum.x = a.x + b.x;sum.y = a.y + b.y;return sum;
}

1.2 函數調用

函數調用在C和C++中都是相同的,通過函數名和參數列表來調用函數。

// C語言中的函數調用
int result = add(3, 4);
// C++中的函數調用
int result = add(3, 4);

1.3 引用參數

C++引入引用類型作為更安全的指針替代方案:

#include <iostream>void swap(int& a, int& b) {int temp = a;a = b;b = temp;
}int main() {int x = 10, y = 20;std::cout << "Before: x=" << x << ", y=" << y << std::endl;swap(x, y);std::cout << "After:  x=" << x << ", y=" << y << std::endl;return 0;
}

引用 vs 指針:

特性引用指針
空值不能為NULL可以為NULL
重定義不可可以
地址操作自動解引用顯式操作
語法簡潔性

二、函數重載:同名函數的「多態魔法」(C++ 特有)

函數重載是C++相對于C語言的一個重要特性。它允許在同一作用域內定義多個同名函數,但這些函數的參數類型或參數個數必須不同。編譯器會根據函數調用時提供的參數類型和個數來確定調用哪個函數。

2.1 基礎實現

#include <iostream>// C++支持重載,C語言禁止
void print(int x) { std::cout << "int: " << x << '\n'; }
void print(double x) { std::cout << "double: " << x << '\n'; }
void print(const char* s) { std::cout << "string: " << s << '\n'; }int main() {print(42);       // int: 42print(3.14);     // double: 3.14print("Hello");  // string: Hello
}

2.2 重載決議流程圖

2.3 與 C 語言的本質區別

特性C++C 語言
同名函數支持(參數列表不同)禁止(鏈接錯誤)
編譯機制名稱改編(Name Mangling)直接使用函數名
錯誤檢查編譯期類型安全檢查僅檢查參數數量(弱類型)

2.4 實戰陷阱

void f(int x, int y = 0); // 聲明帶默認參數
void f(int x, int y);    // 定義不帶默認參數(C++允許,但調用時按聲明處理)

三、默認參數:接口的「彈性設計」(C++ 特有)

C++允許在函數定義或聲明時為參數指定默認值。當調用函數時,如果未提供具有默認值的參數,則使用默認值。

3.1 語法規則

#include <iostream>
using namespace std;// 定義函數,為參數b和c指定默認值
int add(int a, int b = 5, int c = 10) {return a + b + c;
}int main() {cout << "add(3) = " << add(3) << endl;       // 使用默認值:b=5, c=10cout << "add(3, 7) = " << add(3, 7) << endl;  // 使用默認值:c=10cout << "add(3, 7, 2) = " << add(3, 7, 2) << endl; // 不使用默認值return 0;
}

?

注意事項:

  • 默認參數只能在函數聲明或定義時指定一次:不能在函數聲明和定義時分別為同一個參數指定默認值。

  • 默認參數應從右往左連續指定:如果為某個參數指定了默認值,則它右邊的所有參數也必須具有默認值。

3.2 C 語言替代方案(笨拙且易錯)

// C語言通過宏模擬默認參數
#define SET_CONFIG(port, host) set_config((port) ? (port) : 8080, (host) ? (host) : "localhost")
void set_config(int port, const char* host); // 無默認參數

四、內聯函數:性能與代碼的「平衡藝術」

內聯函數是C++中用于提高函數調用效率的一種機制。通過將函數體在調用點展開(內聯展開),可以減少函數調用的開銷(如棧幀的創建和銷毀、參數傳遞等)。

4.1 C++ vs C 的內聯差異

特性C++C 語言(C99+)
關鍵字inlinestatic inline(文件作用域)
鏈接屬性可跨文件(需同名定義)靜態(文件內)
編譯器控制建議性(可能被忽略)強制展開(函數體必須簡單)

4.2 現代 C++ 實踐(C++17)

// 強制內聯(GCC/Clang擴展)
[[gnu::always_inline]] 
void fast_math(float& x) { x *= 1.618f; } // 高頻調用的數學函數

4.3.?內聯函數示例

#include <iostream>
using namespace std;// 使用inline關鍵字聲明內聯函數
inline int max(int a, int b) {return (a > b) ? a : b;
}int main() {cout << "max(3, 4) = " << max(3, 4) << endl;return 0;
}

inline關鍵字只是向編譯器提出一個請求,編譯器可以選擇忽略這個請求。因此,即使使用了inline關鍵字,也不能保證函數一定會被內聯展開。

4.4?注意事項

  • 內聯函數通常適用于短小且頻繁調用的函數:對于大型或復雜的函數,內聯展開可能會增加代碼體積并降低性能。

  • 內聯函數在類定義中自動成為內聯函數:在類定義中定義的成員函數(包括成員函數聲明和定義)自動成為內聯函數,無需使用inline關鍵字。

  • 編譯器可能會對內聯函數進行優化:即使函數被內聯展開,編譯器也可能會對生成的代碼進行優化以提高性能。

、constexpr 函數:編譯期計算的「常量革命」(C++11+)

5.1 基礎用法

constexpr int square(int x) { return x * x; } // 編譯期計算
constexpr auto arr = {square(2), square(3)}; // 編譯期初始化數組

5.2 與 C 宏的本質區別

特性constexpr 函數C 宏
類型安全嚴格類型檢查無類型(可能導致副作用)
調試信息保留函數名和行號宏展開后難以追蹤
遞歸支持支持編譯期遞歸不支持

5.3 實戰案例:編譯期斐波那契數列?

constexpr int fib(int n) {return n <= 1 ? n : fib(n-1) + fib(n-2); // 編譯期計算
}
constexpr int fib_42 = fib(42); // 編譯期完成計算

六、lambda 表達式:匿名函數的「編程解放」(C++11+)

C++11引入了Lambda表達式,允許在代碼中定義匿名函數對象。Lambda表達式提供了一種簡潔而強大的方式來定義和使用短小的函數對象。

6.1 基礎語法

// [捕獲列表](參數列表) mutable? exception? -> 返回類型 { 函數體 }
auto add = [](int a, int b) { return a + b; };
std::cout << add(3, 5); // 8

6.2 捕獲方式對比

捕獲方式說明示例
空捕獲不捕獲任何變量[]{}
值捕獲拷貝變量值(默認 const)[x]{ return x*2; }
引用捕獲引用變量(需確保生命周期)[&y]{ y++; }
混合捕獲部分值 / 部分引用[x, &y]{ return x + y; }
初始化捕獲C++14,任意表達式初始化[a=1, b=std::move(vec)]{}

6.3 與 C 函數指針的對比

// C語言:通過函數指針實現回調
void (*callback)(int);
callback = &handle_event;// C++:lambda直接捕獲上下文
std::vector<int> data = {1,2,3};
std::for_each(data.begin(), data.end(), [&](int x) {std::cout << x * data.size(); // 直接捕獲data
});

6.4 Lambda表達式示例?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {vector<int> vec = {1, 2, 3, 4, 5};// 使用Lambda表達式對vector中的元素進行排序(降序)sort(vec.begin(), vec.end(), [](int a, int b) {return a > b;});// 輸出排序后的vectorfor (int n : vec) {cout << n << " ";}cout << endl;return 0;
}

七、函數模板:泛型編程的「基石」

7.1 基礎實現

template <typename T>
T max(T a, T b) { return a > b ? a : b; }int main() {std::cout << max(5, 3);    // intstd::cout << max(3.14, 2.71); // double
}

7.2 模板特化(Partial Specialization)

// 特化指針版本
template <typename T>
T* max(T* a, T* b) { return *a > *b ? a : b; }// 特化字符串版本
template <>
const char* max(const char* a, const char* b) {return std::strcmp(a, b) > 0 ? a : b;
}

八、成員函數:類的「行為封裝」(C++ 特有)

8.1 成員函數分類

8.2 虛函數:多態的核心?

class Shape {
public:virtual double area() const = 0; // 純虛函數
};class Circle : public Shape {
public:double area() const override { return M_PI * r * r; }
};

8.3 const 成員函數:數據安全的保障

class Data {
private:int value;
public:int get() const { return value; } // 保證不修改成員void set(int v) { value = v; }
};

九、異常規范:錯誤處理的「契約式設計」

9.1 現代 C++ 實踐(noexcept)

// 聲明不拋異常(C++11)
void critical_operation() noexcept {// 若拋出異常,調用std::terminate()
}// 有條件不拋異常
void safe_operation() noexcept(std::is_integral_v<Param>) {// 僅當Param為整數類型時不拋異常
}

9.2 與 C 語言的對比

特性C++C 語言
錯誤處理異常機制(try/catch/throw)返回錯誤碼或全局錯誤變量(errno)
錯誤傳播棧展開(Stack Unwinding)依賴函數調用鏈檢查返回值
性能無異常時零開銷始終檢查返回值(潛在性能損失)

十、尾隨返回類型:類型推導的「語法革命」(C++11+)

10.1 基礎用法

// 傳統寫法(需前置聲明)
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {return t + u;
}// C++14簡化(自動推導)
template <typename T, typename U>
auto add(T t, U u) {return t + u;
}

?10.2 復雜類型示例

// 返回指向成員函數的指針
auto get_fun() -> int (Data::*)() const {return &Data::get;
}

十一、初始化捕獲:lambda 的「狀態封裝」(C++14+)

11.1 語法創新

int base = 10;
auto adder = [a = base + 10](int x) { return a + x; };
std::cout << adder(5); // 25(a=20)

11.2 與 C 語言的對比

// C語言需手動封裝狀態
typedef struct { int base; } Adder;
int add(Adder* self, int x) { return self->base + x; }
Adder adder = { .base = 20 };
add(&adder, 5); // 25(需顯式傳遞狀態)

十二、友元函數:打破封裝的「雙刃劍」(C++ 特有)

12.1 基礎用法

class Data {friend void print(const Data& d); // 友元聲明
private:int value;
};void print(const Data& d) { // 訪問私有成員std::cout << "Value: " << d.value << '\n';
}

12.2 友元模板

template <typename T>
class Container {friend T; // 授予整個類友元權限friend void debug(Container<T>& c); // 授予特定函數權限
};

十三、函數指針進化:從過程到對象的「尋址革命」

13.1 成員函數指針

class Data {
public:void print() const { std::cout << value << '\n'; }int value;
};int main() {Data d{42};void (Data::*mem_fn)() const = &Data::print;(d.*mem_fn)(); // 42(調用成員函數)
}

13.2 與 C 語言函數指針的對比

特性C++ 成員函數指針C 語言函數指針
綁定對象必須關聯類對象獨立于數據(面向過程)
語法&Class::member&function
調用方式obj.*mem_fn()?或?ptr->*mem_fn()fn()

十四、C++20 新特性:函數的「終極進化」

14.1 協同函數(Coroutine)

#include <coroutine>struct Generator {struct promise_type {int current_value = 0;Generator get_return_object() { return Generator{this}; }std::suspend_always yield_value(int value) {current_value = value;return {};}std::suspend_void return_void() { return {}; }};// ... 其他實現 ...
};Generator countdown(int n) {for (; n >= 0; --n) co_yield n;
}// 使用協同函數
for (int x : countdown(5)) {std::cout << x << ' '; // 5 4 3 2 1 0
}

十五、最佳實踐與性能優化

15.1 重載決議優化

// 優先匹配非模板函數
void print(int x) { /* 特化實現 */ }
template <typename T> void print(T x) { /* 通用實現 */ }

15.2 lambda 性能優化

// 避免不必要的捕獲
auto processor = [=](int x) mutable noexcept { /* 無堆分配的輕量級lambda */ };

15.3 成員函數設計原則

class Resource {
public:void use() const noexcept { /* 無修改的常量成員 */ }~Resource() = default; // 遵循Rule of Zero
};

十六、總結:C++ 函數的「編程范式躍遷」

特性C 語言C++價值定位
函數重載不支持支持(編譯期多態)接口統一化
默認參數不支持支持(接口彈性)減少重復代碼
lambda 表達式不支持支持(匿名函數 + 狀態捕獲)函數式編程支持
成員函數結構體 + 函數指針模擬原生支持(封裝 / 繼承 / 多態)面向對象基礎
函數模板不支持支持(泛型編程)類型安全的代碼復用
constexpr不支持支持(編譯期計算)性能與安全性的雙重提升

編程哲學:C++ 函數不僅是代碼塊,更是類型系統的延伸抽象機制的載體運行時與編譯時的橋梁。掌握這些特性,方能駕馭現代 C++ 的三大范式(面向對象、泛型、函數式)。

十七、參考資料

  • ?《C++ Primer(第 5 版)》這本書是 C++ 領域的經典之作,對 C++ 的基礎語法和高級特性都有深入講解。
  • 《Effective C++(第 3 版)》書中包含了很多 C++ 編程的實用建議和最佳實踐。
  • 《C++ Templates: The Complete Guide(第 2 版)》該書聚焦于 C++ 模板編程,而using聲明在模板編程中有著重要應用,如定義模板類型別名等。
  • C++ 官方標準文檔:C++ 標準文檔是最權威的參考資料,可以查閱最新的 C++ 標準(如 C++11、C++14、C++17、C++20 等)文檔。例如,ISO/IEC 14882:2020 是 C++20 標準的文檔,可從相關渠道獲取其詳細內容。
  • cppreference.com:這是一個非常全面的 C++ 在線參考網站,提供了詳細的 C++ 語言和標準庫文檔。
  • LearnCpp.com:該網站提供了系統的 C++ 教程,配有豐富的示例代碼和清晰的解釋,適合初學者學習和理解相關知識。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74746.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis的基礎,經典,高級問題解答篇

目錄 一&#xff0c;基礎 二&#xff0c;經典 緩存雪崩&#xff1a; 1. Redis事務的原子性 2. 與MySQL事務的區別 1. 主從復制原理 2. 哨兵模式故障轉移流程 3. 客戶端感知故障轉移 三&#xff0c;高級 一&#xff0c;基礎 Redis的5種基礎數據類型及使用場景&#xf…

【藍橋杯】好數

好數 問題描述代碼解釋代碼 好數 問題描述 一個整數如果按從低位到高位的順序&#xff0c;奇數位 (個位、百位、萬位 ? ) 上的數字是奇數&#xff0c;偶數位 (十位、千位、十萬位 ? ) 上的數字是偶數&#xff0c;我們就稱之為 “好數”。 給定一個正整數 N&#xff0c;請計算…

利用 Patroni + etcd + HAProxy 搭建高可用 PostgreSQL 集群

在生產環境中&#xff0c;數據庫的高可用性是系統穩定運行的關鍵。本文將詳細講解如何利用 Docker 部署一個由 etcd、Patroni 和 HAProxy 組成的 PostgreSQL 高可用集群&#xff0c;實現自動故障轉移和負載均衡。 架構概述 本架構主要包括三部分&#xff1a; etcd 集群 etcd …

bash 和 pip 是兩種完全不同用途的命令,分別用于[系統終端操作]和[Python 包管理]

bash 和 pip 是兩種完全不同用途的命令&#xff0c;分別用于 系統終端操作 和 Python 包管理。以下是它們的核心區別、用法及常見場景對比&#xff1a; 1. 本質區別 特性bashpip類型Shell 命令解釋器&#xff08;一種腳本語言&#xff09;Python 包管理工具作用執行系統命令、…

分布式系統的CAP理論、事務和鎖實現

分布式系統核心概念 1. CAP理論 CAP理論指出&#xff0c;分布式系統最多同時滿足以下三項中的兩項&#xff1a; 一致性&#xff08;CC&#xff09;&#xff1a;所有節點訪問同一份最新數據。可用性&#xff08;AA&#xff09;&#xff1a;每個請求都能在合理時間內獲得非錯誤…

鴻蒙UI開發

鴻蒙UI開發 本文旨在分享一些鴻蒙UI布局開發上的一些建議&#xff0c;特別是對屏幕寬高比發生變化時的應對思路和好的實踐。 折疊屏適配 一般情況&#xff08;自適應布局/響應式布局&#xff09; 1.自適應布局 1.1自適應拉伸 左右組件定寬 TypeScript //左右定寬 Row() { …

FreeRTOS 五種內存管理算法深度對比分析

FreeRTOS 提供了五種動態內存管理算法&#xff08;heap_1 至 heap_5&#xff09;&#xff0c;針對不同應用場景在實時性、內存效率、碎片控制等方面進行了差異化設計。以下從實現原理、性能指標及適用場景進行全面對比&#xff1a; 一、Heap_1&#xff1a;靜態分配優先 ?核心…

基于EFISH-SBC-RK3576的無人機智能飛控與數據存儲方案

一、方案背景 民用無人機在電力巡檢、農業植保、應急救援等領域快速普及&#xff0c;但傳統方案面臨?多協議設備兼容性差?、?野外環境數據易丟失?、?復雜電磁干擾?三大痛點。 電魚智能推出?EFISH-SBC-RK3576?&#xff0c;可集成雙冗余總線接口與工業級加固存儲&#x…

怎樣進行服務器的日常安全監控和審計?

服務器的日常安全監控和審計是保障服務器安全運行的重要措施&#xff0c;以下是一些常見的方法和工具&#xff1a; 系統日志監控 啟用日志功能&#xff1a;確保服務器操作系統、應用程序和數據庫等都啟用了詳細的日志記錄功能。例如&#xff0c;Linux 系統中的 syslog&#x…

數據庫----單表、多表

數據庫 create database 數據庫名稱;---創建數據庫create database 數據庫名稱 default charsetutf8mb4;---創建數據庫&#xff0c;同時指定編碼show databases;---查看當前數據庫管理下存在多少數據庫show databases like "db_%";---查詢以db_開頭的數據庫select d…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加行拖拽排序功能示例6,TableView16_06 分頁表格拖拽排序

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

遺傳算法優化支持向量機分類是一種將遺傳算法與支持向量機相結合的方法

遺傳算法優化支持向量機分類是一種將遺傳算法與支持向量機相結合的方法&#xff0c;旨在提高支持向量機的分類性能。以下是其相關內容的詳細介紹&#xff1a; 支持向量機&#xff08;SVM&#xff09; 原理&#xff1a;SVM是一種基于統計學習理論的機器學習方法&#xff0c;其…

Python中的Requests庫

什么是Python中的Requests模塊&#xff1f; requests模塊是Python中廣泛使用的庫&#xff0c;用于簡化HTTP請求的發送和響應處理。無論是調用API、下載文件、處理復雜會話管理&#xff0c;requests都能提供很好的解決方案。 一、基礎使用方法 1.GET請求 GET請求用于獲取服務…

復習MySQL20250327

第一章 基本操作 一、管理數據庫 難點&#xff1a;創建數據庫 輸入cmd的MySQL安裝路徑C:\Program Files\MySQL\MySQL Server 8.0\bin 1.查看所有數據庫 show databases; 2.創建數據庫 create database hsusers default charset utf8 collate utf8_general_ci;create data…

谷歌推出Gemini實時AI視頻功能,開啟智能交互新體驗

3月24日&#xff0c;谷歌發言人亞歷克斯約瑟夫向媒體證實&#xff0c;谷歌已開始向 Gemini Live 推出新的人工智能功能。這些功能使 Gemini 能夠“看到”用戶的屏幕內容&#xff0c;或通過智能手機攝像頭獲取畫面&#xff0c;并實時回答與之相關的問題。這一創新標志著人工智能…

Windows 新型零日漏洞:遠程攻擊可竊取 NTLM 憑證,非官方補丁已上線

近日&#xff0c;安全研究人員披露了一個新型 Windows 零日漏洞&#xff0c;影響從Windows 7和Server 2008 R2到最新Windows 11 v24H2及Server 2025的所有Windows操作系統版本。攻擊者只需誘使用戶在Windows資源管理器中查看惡意文件&#xff0c;即可利用該零日漏洞竊取NTLM&am…

一款超級好用且開源免費的數據可視化工具——Superset

認識Superset 數字經濟、數字化轉型、大數據等等依舊是如今火熱的領域&#xff0c;數據工作有一個重要的環節就是數據可視化。 看得見的數據才更有價值&#xff01; 現如今依舊有多數企業號稱有多少多少數據&#xff0c;然而如果這些數據只是呆在冷冰冰的數據庫或文件內則毫無…

作業14 (2023-05-22_const修飾指針)

第1題/共5題【單選題】 C程序常見的錯誤分類不包含:( ) A.編譯錯誤 B.鏈接錯誤 C.棧溢出 D.運行時錯誤 回答正確 答案解析: 棧溢出是運行時錯誤的一種,因此C程序不會將棧溢出錯誤單獨列出來,棧溢出包含在運行時錯誤中。 因此:選擇C 第2題/共5題【單選題】 以下關于…

《Tr0ll2 靶機滲透實戰:弱口令+SUID+兩種緩沖區溢出+ 提權完整+fcrackzip暴力破解+shellshock漏洞+臟牛三種root提權復盤》

Tr0ll2 1、主機發現 arp-scan -l 2、端口掃描 nmap -sS -sV 192.168.66.181 nmap -sS -A -T4 -p- 192.168.66.181 nmap --scriptvuln 192.168.66.181PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.4 (…

redis常用部署架構之redis分片集群。

redis 3.x版本后開始支持 作用&#xff1a; 1.提升數據讀寫速度 2..提升可用性 分片集群就是將業務服務器產生的數據儲存在不同的機器上。 redis分片集群的架構 如上圖所示&#xff0c;會將數據分散存儲到不同的服務器上&#xff0c;相比于之前來說&#xff0c;redis要處…