前言:
本篇博客建議搭配:(Python)類和類的方法(基礎教程介紹)(Python基礎教程)-CSDN博客
一起學習使用;?
源代碼:
#include <iostream>
#include <string>using namespace std;class Student{protected:string name;int age;string sex;int credit;public:static string stats;Student(string n,int a,string s,int c):name(n),age(a),sex(s),credit(c){}virtual string tell(){return name+"說:你好";}string getName()const{return name;}int getAge()const{return age;}string getSex()const{return sex;}int getCredit()const{return credit;}
};string Student::stats="大學";class Teacher:public Student{private:int pay;public:static string stats;Teacher(string n,int a,string s,int p):Student(name,age,sex,0),pay(p){}string tell() override{return name+"說:我不好";}int getPay() const {return pay; }
};string Teacher::stats="教師";int main(){Student student("大炮", 21, "男", 10);cout << student.tell() <<endl;cout << Student::stats <<endl;cout << student.getCredit() <<endl;Teacher teacher("富貴", 55, "男", 10000);cout << teacher.tell() << endl;cout << Teacher::stats << endl;cout << teacher.getPay() << endl; cout << teacher.getName() << endl;cout << teacher.getCredit() << endl;return 0;
}
代碼解析:
下面是完整的 C++ 實現,包含詳細注釋和與 Python 代碼的對比說明:
#include <iostream>
#include <string>// 學生類 (基類)
class Students {
protected: // protected 允許派生類訪問成員std::string name;int age;std::string sex;int credit;public:// 類屬性(靜態成員變量)static std::string stats; // 相當于 Python 的類屬性// 構造函數(類似 Python 的 __init__)Students(std::string n, int a, std::string s, int c) : name(n), age(a), sex(s), credit(c) {}// 成員函數(方法)virtual std::string tell() { // virtual 允許派生類重寫return name + "說:你好";}// 訪問器方法std::string getName() const { return name; }int getAge() const { return age; }std::string getSex() const { return sex; }int getCredit() const { return credit; }
};// 初始化靜態成員變量(類屬性)
std::string Students::stats = "大學";// 教師類(派生類)
class Teachers : public Students {
private:int pay; // 教師特有屬性public:// 類屬性(重新定義)static std::string stats; // 覆蓋基類的類屬性// 構造函數Teachers(std::string n, int a, std::string s, int p) : Students(n, a, s, 0), pay(p) {} // 調用基類構造函數// 重寫基類方法std::string tell() override {return name + "說:我不好";}// 訪問器方法int getPay() const { return pay; }
};// 初始化派生類的靜態成員變量
std::string Teachers::stats = "教師";int main() {// 創建學生對象(類似 Python 的實例化)Students student("大炮", 21, "男", 10);// 調用方法和訪問屬性std::cout << student.tell() << std::endl; // 輸出:大炮說:你好std::cout << Students::stats << std::endl; // 輸出:大學(類屬性)std::cout << student.getCredit() << std::endl; // 輸出:10// 創建教師對象Teachers teacher("富貴", 55, "男", 10000);// 調用方法和訪問屬性std::cout << teacher.tell() << std::endl; // 輸出:富貴說:我不好std::cout << Teachers::stats << std::endl; // 輸出:教師(派生類類屬性)std::cout << teacher.getPay() << std::endl; // 輸出:10000// 訪問繼承的屬性std::cout << teacher.getName() << std::endl; // 輸出:富貴std::cout << teacher.getCredit() << std::endl; // 輸出:0(從基類繼承)return 0;
}
關鍵概念解釋
1. 類屬性(靜態成員變量)
// Python 等效代碼
// class Students:
// stats = "大學"// C++ 實現
class Students {
public:static std::string stats; // 聲明
};// 類外初始化
std::string Students::stats = "大學";
-
static
?關鍵字創建類級別的變量(所有對象共享) -
必須在類外單獨初始化
-
通過?
類名::變量名
?訪問(如?Students::stats
)
2. 構造函數
// Python 等效
// def __init__(self, name, age, sex, credit):
// self.name = name
// ...// C++ 實現
Students(std::string n, int a, std::string s, int c) : name(n), age(a), sex(s), credit(c) {} // 初始化列表
-
初始化列表?
: name(n), ...
?類似 Python 的屬性賦值 -
最后的?
{}
?是必須的空函數體 -
更高效(直接初始化而非先默認構造再賦值)
3. 繼承與重寫
// Python 繼承
// class Teachers(Students):// C++ 繼承
class Teachers : public Students { // 公有繼承
public:// 重寫方法std::string tell() override { ... }
};
-
: public Students
?表示公有繼承 -
override
?關鍵字明確表示重寫基類方法 -
派生類可以添加新成員(如?
pay
)
4. 訪問控制
訪問修飾符 | 類內 | 派生類 | 類外 | Python 等效 |
---|---|---|---|---|
private | ? | ? | ? | __ ?開頭 |
protected | ? | ? | ? | _ ?開頭 |
public | ? | ? | ? | 無修飾符 |
5. 方法調用
// Python 方法調用
// student.tell()// C++ 方法調用
student.tell();
-
使用點運算符?
.
?調用方法 -
對象在棧上創建(自動內存管理)
-
不需要 Python 的顯式?
self
?參數
輸出結果
大炮說:你好
大學
10
富貴說:我不好
教師
10000
富貴
0
C++ 與 Python 類實現對比表
特性 | Python | C++ |
---|---|---|
類定義 | class ClassName: | class ClassName { ... }; |
構造函數 | __init__(self, ...) | ClassName(...) { ... } |
繼承 | class Child(Parent): | class Child : public Parent { ... } |
方法重寫 | 直接定義同名方法 | 使用?virtual ?和?override |
類屬性 | 類內直接定義 | static ?成員 + 類外初始化 |
訪問控制 | 命名約定 (_ ,?__ ) | 關鍵字 (public ,?private ) |
對象創建 | obj = ClassName() | ClassName obj(...) |
內存管理 | 自動垃圾回收 | 手動管理或智能指針 |
self /this | 顯式?self ?參數 | 隱式?this ?指針 |
多文件 | 單文件 | 頭文件(.h) + 實現文件(.cpp) |
多說一句:
構造函數語法解析:為什么要用花括號?
Person(std::string n, int a) : name(n), age(a) {}
結構分解
-
構造函數聲明:
Person(std::string n, int a)
-
方法名與類名相同(
Person
) -
接收兩個參數:字符串?
n
?和整數?a
-
-
成員初始化列表:
: name(n), age(a)
-
在構造函數體執行前初始化成員變量
-
name(n)
:將參數?n
?的值賦給成員變量?name
-
age(a)
:將參數?a
?的值賦給成員變量?age
-
-
空函數體:
{}
-
表示構造函數沒有額外操作
-
即使為空也必須保留花括號?
{}
-
為什么需要空花括號?{}
?
-
語法要求:C++ 所有函數(包括構造函數)必須有大括號包裹的函數體
-
執行空間:即使沒有代碼,也需要保留執行上下文
-
可擴展性:方便未來添加初始化代碼
完整工作流程?
注:該代碼是本人自己所寫,可能不夠好,不夠簡便,歡迎大家指出我的不足之處。如果遇見看不懂的地方,可以在評論區打出來,進行討論,或者聯系我。上述內容全是我自己理解的,如果你有別的想法,或者認為我的理解不對,歡迎指出!!!如果可以,可以點一個免費的贊支持一下嗎?謝謝各位彥祖亦菲!!!!