Python到C++:函數與面向對象編程(OOP)
1.函數與返回值
在 C++ 中,函數是程序中的基本單位。每個函數都擁有返回類型、函數名和參數列表,函數執行后返回相應的結果。
1.1 C++ 函數定義與返回值
示例:
#include <iostream>
using namespace std;
// 定義一個簡單的函數,返回兩個數的和
int add(int a, int b) {
return a + b; // 返回兩數之和
}
int main() {
int result = add(10, 20); // 調用 add 函數
cout << "Sum: " << result << endl;
return 0;
}解析:
? 返回類型:int 表示該函數返回一個整數。
? 函數定義:add 函數接收兩個整數參數,計算它們的和并返回結果。
? 函數調用:在 main() 函數中調用 add,并將結果存儲到 result 變量中。
1.2 函數傳參方式
C++ 支持三種傳遞參數的方式:按值傳遞、按引用傳遞和按指針傳遞。
1.2.1 按值傳遞(傳遞副本)
函數接收參數的副本,修改副本不會影響原始數據。
#include <iostream>
using namespace std;
void addValue(int x) {
x += 10; // 修改副本
}
int main() {
int a = 5;
addValue(a); // 傳遞 a 的副本
cout << "a = " << a << endl; // a 不變,仍然是 5
return 0;
}1.2.2 按引用傳遞(傳遞地址)
通過引用傳遞參數,函數直接修改原始數據。
#include <iostream>
using namespace std;
void addReference(int& x) {
x += 10; // 修改原數據
}
int main() {
int a = 5;
addReference(a); // 傳遞 a 的引用
cout << "a = " << a << endl; // a 被修改,結果為 15
return 0;
}1.2.3 按指針傳遞(通過指針傳遞地址)
使用指針傳遞參數,函數通過指針修改數據。
#include <iostream>
using namespace std;
void addPointer(int* x) {
*x += 10; // 通過指針修改數據
}
int main() {
int a = 5;
addPointer(&a); // 傳遞 a 的地址
cout << "a = " << a << endl; // a 被修改,結果為 15
return 0;
}2. 面向對象編程(OOP)
C++ 是一種支持面向對象編程(OOP)的語言,它通過封裝、繼承和多態來提供強大的結構化設計能力。
2.1 類與構造函數
C++ 中的類與 Python 類似,類成員包含數據和方法。構造函數用于初始化對象。
C++ 類與構造函數示例:
#include <iostream>
using namespace std;
class Person {
public:
string name;
int age;
// 構造函數
Person(string n, int a) {
name = n;
age = a;
cout << "Constructor called!" << endl;
}
void introduce() {
cout << "My name is " << name << " and I am " << age << " years old." << endl;
}
~Person() { // 析構函數
cout << "Destructor called!" << endl;
}
};
int main() {
// 創建對象時自動調用構造函數
Person p1("John", 25);
p1.introduce(); // 調用成員函數
return 0; // 程序結束時自動調用析構函數
}// 輸出
Constructor called!
My name is John and I am 25 years old.
Destructor called!解析:
? 構造函數:Person(string n, int a) 初始化 name 和 age 成員。
? 析構函數:~Person() 是析構函數,當對象生命周期結束時自動調用,用于清理資源。
? 成員函數:introduce 輸出對象的屬性。
2.2 繼承
繼承是 OOP 的核心概念之一,它允許子類繼承父類的成員函數和數據成員,從而實現代碼復用。
C++ 繼承示例:
#include <iostream>
using namespace std;
// 基類
class Animal {
public:
void speak() {
cout << "Animal speaks!" << endl;
}
};
// 派生類
class Dog : public Animal {
public:
void speak() {
cout << "Dog barks!" << endl;
}
};
int main() {
Animal a;
Dog d;
a.speak(); // 調用基類的函數
d.speak(); // 調用派生類的函數
return 0;
}// 輸出
Animal speaks!
Dog barks!解析:
? 基類 Animal:提供了 speak() 函數。
? 派生類 Dog:繼承了 Animal 類并重寫了 speak() 函數。
? 多態性:C++ 允許我們通過基類指針或引用調用派生類的方法,具體調用哪個版本的函數取決于對象的實際類型。
2.3 多態
多態是 C++ 中的一項強大特性,它允許同一個接口以不同的方式進行操作。
C++ 多態示例:
#include <iostream>
using namespace std;
class Animal {
public:
virtual void speak() { // 使用 virtual 關鍵字聲明虛函數
cout << "Animal speaks!" << endl;
}
};
class Dog : public Animal {
public:
void speak() override {
cout << "Dog barks!" << endl;
}
};
int main() {
Animal * animalPtr;
Dog dog;
animalPtr = &dog;
animalPtr->speak(); // 動態綁定,調用 Dog 類的 speak
return 0;
}// 輸出
Dog barks!解析:
? 虛函數:基類中的 speak() 被聲明為 virtual,這使得 C++ 能夠根據對象的實際類型決定調用哪個函數。
? 動態綁定:通過基類指針 animalPtr 指向 Dog 對象時,調用 speak() 會調用 Dog 類中的 speak() 函數。
注意
如果運行彈出警告如下:
tem.cpp:13:18: warning: 'override' keyword is a C++11 extension [-Wc++11-extensions]
13 | void speak() override {
| ^
1 warning generated.修復
What is a C++11 extension [-Wc++11-extensions]https://stackoverflow.com/questions/45291142/what-is-a-c11-extension-wc11-extensions
如果使用Code Runner,添加配置如下:
圖片
如果是命令行運行,添加參數 -std=c++17
g++ -std=c++17 tem.cpp -o tem3. 總結
在這篇文章中,我們探討了 C++ 中函數的定義與返回值、參數傳遞方式、構造函數、析構函數、繼承和多態等重要概念。C++ 提供了更高效和靈活的內存控制,使得它在性能要求較高的場合比 Python 更具優勢。
C++ 的優勢:
? 性能:C++ 提供直接的內存訪問,適合對性能要求高的系統(如操作系統、游戲引擎等)。
? 底層控制:C++ 對內存管理有更細粒度的控制,允許開發者優化內存使用。
? 多態與繼承:C++ 通過虛函數和繼承提供強大的面向對象能力。



























