关注泷羽Sec-静安 公众号,后台回复 找书+ C++Primer 获取C++相关电子书
-
类:类是一个抽象的模板,用于定义对象的属性和行为。 -
对象:对象是类的具体实例,通过类创建。
面向对象三大特性:
-
封装 (Encapsulation):通过将数据成员设为私有(private),并提供公共(public)方法来控制对数据的访问,保护数据不被外部直接修改。 -
继承 (Inheritance):通过继承基类的属性和方法,派生类可以复用基类的代码,并可以添加新的属性和方法。 -
多态 (Polymorphism):通过基类指针或引用调用派生类的重写方法,实现同一接口的不同实现。
#include<iostream>#include<string>usingnamespacestd;/*----------- 类和对象基础 -----------*/// 类:抽象模板 | 对象:具体实例classDog {// 类声明public:string name; // 属性voidbark(){ // 方法cout << name << ": Wang Wang!" << endl; }};// 使用示例:intmain(){ Dog myDog; // 创建对象 myDog.name = "Buddy"; myDog.bark(); // 输出:Buddy: Wang Wang!/*----------- 封装 (Encapsulation) -----------*/classBankAccount {private: // 封装敏感数据double balance;public:// 公开接口控制访问voiddeposit(double amount){if (amount > 0) balance += amount; }boolwithdraw(double amount){if (amount <= balance) { balance -= amount;returntrue; }returnfalse; }doublegetBalance(){ return balance; } // 只读访问 };// 使用示例: BankAccount acc; acc.deposit(1000); // 合法操作// acc.balance = 10000; // 错误:无法直接访问private成员/*----------- 继承 (Inheritance) -----------*/// 基类classVehicle {public:string brand;voidhonk(){cout << "Tu~ Tu~" << endl; } };// 派生类classCar :public Vehicle { // 继承语法public:int wheels = 4; // 新增属性voidshowSpec(){ // 新增方法cout << brand << " Car with " << wheels << " wheels" << endl; } };// 使用示例: Car myCar; myCar.brand = "BMW"; // 继承自基类 myCar.honk(); // 调用基类方法 myCar.showSpec(); // 输出:BMW Car with 4 wheels/*----------- 多态 (Polymorphism) -----------*/classShape {//一个形状public:virtualdoublearea(){ // 虚函数实现多态基础return0; } };classCircle :public Shape { //圆double radius;public: Circle(double r) : radius(r) {}doublearea()override{ // 重写基类方法return3.14159 * radius * radius; } };classRectangle :public Shape { //角度double width, height;public: Rectangle(double w, double h) : width(w), height(h) {}doublearea()override{ // 重写基类方法return width * height; } };// 使用示例: Shape* shapes[2]; // 基类指针数组 shapes[0] = new Circle(5); // 指向派生类对象 shapes[1] = new Rectangle(4, 6);// 同一接口表现不同行为cout << "Circle area: " << shapes[0]->area() << endl; // 输出78.5397cout << "Rectangle area: " << shapes[1]->area() << endl; // 输出24/* 多态实现关键点: 1. 基类方法声明为virtual 2. 派生类使用override重写方法 3. 通过基类指针/引用调用方法 */// 清理动态分配的内存delete shapes[0];delete shapes[1];return0;}---Buddy: Wang Wang!Tu~ Tu~BMW Car with 4 wheelsCircle area: 78.5397Rectangle area: 24
三种访问权限
-
公共权限(public):公共成员可以在任何地方访问,包括类外部和派生类中。 示例:int publicVar; 可以在 main 函数中直接访问。 -
保护权限(protected):保护成员只能在本类和派生类中访问,不能在类外部访问。 示例:int protectedVar; 可以在派生类 Derived 中访问,但不能在 main 函数中直接访问。 -
私有权限(private):私有成员只能在本类中访问,不能在类外部和派生类中访问。 示例:int privateVar; 只能在 Base 类的成员函数中访问,不能在 main 函数和派生类 Derived 中直接访问。
#include<iostream>#include<string>usingnamespacestd;/*----------- 访问权限示例 -----------*/classBase {public:int publicVar; // 公共权限:任何地方都可以访问protected:int protectedVar; // 保护权限:派生类和本类可以访问private:int privateVar; // 私有权限:只有本类可以访问public:// 构造函数 Base(int pub, int prot, int priv) : publicVar(pub), protectedVar(prot), privateVar(priv) {}// 公共方法,访问私有成员voidshowPrivateVar(){cout << "Private Variable: " << privateVar << endl; }};// 派生类classDerived :public Base {public:// 构造函数 Derived(int pub, int prot, int priv) : Base(pub, prot, priv) {}// 访问基类的保护成员voidshowProtectedVar(){cout << "Protected Variable: " << protectedVar << endl; }};intmain(){// 创建基类对象Base baseObj(1, 2, 3);// 访问公共成员cout << "Public Variable: " << baseObj.publicVar << endl;// 访问私有成员(错误)// cout << "Private Variable: " << baseObj.privateVar << endl; // 错误:无法访问私有成员// 通过公共方法访问私有成员 baseObj.showPrivateVar();// 创建派生类对象Derived derivedObj(4, 5, 6);// 访问基类的公共成员cout << "Public Variable (Derived): " << derivedObj.publicVar << endl;// 访问基类的保护成员(错误)// cout << "Protected Variable (Derived): " << derivedObj.protectedVar << endl; // 错误:无法直接访问保护成员// 通过派生类方法访问基类的保护成员 derivedObj.showProtectedVar();return0;}---Public Variable: 1Private Variable: 3Public Variable(Derived): 4Protected Variable: 5
struct 和 class的区别
在C++中,struct 和 class 的主要区别在于默认的访问控制权限。以下是详细的解释和示例代码: 区别
-
默认访问控制权限: struct 的成员默认是 public。 class 的成员默认是 private。 -
继承: struct 默认的继承方式是 public。 class 默认的继承方式是 private。
#include<iostream>#include<string>usingnamespacestd;// 使用 structstructMyStruct {int publicVar; // 默认是 public MyStruct(int val) : publicVar(val) {}};// 使用 classclassMyClass {int privateVar; // 默认是 privatepublic: MyClass(int val) : privateVar(val) {}intgetPrivateVar()const{return privateVar; }};intmain(){// 使用 structMyStruct s(10);cout << "MyStruct publicVar: " << s.publicVar << endl; // 可以直接访问// 使用 classMyClass c(20);// cout << "MyClass privateVar: " << c.privateVar << endl; // 错误:无法直接访问 private 成员cout << "MyClass privateVar: " << c.getPrivateVar() << endl; // 通过公共方法访问return0;}---MyStruct publicVar: 10MyClass privateVar: 20
🔔 想要获取更多网络安全与编程技术干货?
关注 泷羽Sec-静安 公众号,与你一起探索前沿技术,分享实用的学习资源与工具。我们专注于深入分析,拒绝浮躁,只做最实用的技术分享!💻
扫描下方二维码,马上加入我们,共同成长!🌟
👉 长按或扫描二维码关注公众号
或者直接回复文章中的关键词,获取更多技术资料与书单推荐!📚
原文始发于微信公众号(泷羽Sec-静安):13x1类和对象-1
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论