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