面向对象编程概念

概念目录

    • 1.类
    • 2.对象
    • 3.继承
    • 4.多态
    • 5.组合
    • 6.封装
    • 7.抽象
    • 8.接口
    • 9.重载
    • 10.重写
    • 11.协变返回类型
    • 12.虚析构函数
    • 13.静态成员
    • 14.友元
    • 15.构造函数
    • 16.析构函数
    • 17.拷贝析构函数
    • 18移动析构函数

1.类

类(Class)

  • 概念:
    类是面向对象编程中的基本构建块,它是对具有相同属性和行为的对象的抽象描述。类定义了对象的属性(成员变量)和操作(成员函数)。
  • 代码示例:
class Person {
private:std::string name;int age;
public:Person(const std::string& n, int a) : name(n), age(a) {}void display() {std::cout << "Name: " << name << ", Age: " << age << std::endl;}
};int main() {Person p("Alice", 25);p.display();return 0;
}

解释:

  • Person 类包含nameage 成员变量,以及 display 成员函数,用来描述一个人的属性和展示信息的操作。

2.对象

对象(Object)

  • 概念:
    对象是类的实例,是根据类的定义创建的具体实体,拥有类中定义的属性和行为。

  • 代码示例:

class Car {
private:std::string brand;int year;
public:Car(const std::string& b, int y) : brand(b), year(y) {}void start() {std::cout << "The " << brand << " car from " << year << " is starting." << std::endl;}
};int main() {Car myCar("Toyota", 2020); // 创建一个 Car 类的对象 myCarmyCar.start();return 0;
}

解释:

  • myCarCar 类的对象,拥有 brandyear 属性,以及 start 操作。

3.继承

继承(Inheritance)

  • 概念:
    允许一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法,建立 “is-a” 关系。子类可以扩展、修改父类的行为或添加新的属性和方法。
  • 代码示例:
class Animal {
public:virtual void makeSound() {std::cout << "Animal makes a sound." << std::endl;}
};class Dog : public Animal {
public:void makeSound() override {std::cout << "Dog barks." << std::endl;}
};int main() {Animal* animal = new Dog();animal->makeSound(); // 多态性,调用 Dog 的 makeSound 方法delete animal;return 0;
}

解释:

  • Dog 类继承自 Animal 类,重写了 makeSound 方法,体现了继承和多态。

4.多态

多态(Polymorphism)

  • 概念:
    多态性允许不同的对象对相同的消息做出不同的响应,通常通过虚函数和继承实现,包括编译时多态(函数重载)和运行时多态(虚函数)。
  • 代码示例(运行时多态):
class Shape {
public:virtual void draw() = 0;
};class Circle : public Shape {
public:void draw() override {std::cout << "Drawing a circle." << std::endl;}
};class Rectangle : public Shape {
public:void draw() override {std::cout << "Drawing a rectangle." << std::endl;}
};int main() {Shape* shape1 = new Circle();Shape* shape2 = new Rectangle();shape1->draw(); // 调用 Circle 的 draw 方法shape2->draw(); // 调用 Rectangle 的 draw 方法delete shape1;delete shape2;return 0;
}

解释:

  • 通过基类指针调用虚函数,根据对象的实际类型调用相应的派生类的 draw 方法,实现运行时多态。

5.组合

组合(Composition)

  • 概念:
    组合是一种对象之间的关系,一个对象包含其他对象作为其成员,建立 “has-a” 关系,将多个对象组合成一个更复杂的对象。
  • 代码示例:
class Engine {
public:void start() {std::cout << "Engine starts." << std::endl;}
};class Car {
private:Engine engine;
public:void start() {engine.start();}
};int main() {Car car;car.start();return 0;
}

解释:

  • Car 类包含 Engine 类对象,通过组合来实现 Car 的功能。

6.封装

封装(Encapsulation)

  • 概念:
    将数据和操作数据的方法绑定在一起,并使用访问修饰符控制对它们的访问,隐藏内部实现细节。
  • 代码示例:
class BankAccount {
private:double balance;
public:BankAccount() : balance(0.0) {}void deposit(double amount) {if (amount > 0) {balance += amount;}}double getBalance() const {return balance;}
};int main() {BankAccount account;account.deposit(100.0);std::cout << "Balance: " << account.getBalance() << std::endl;return 0;
}

解释:

  • balance 成员变量被封装在 BankAccount 类中,外部只能通过 depositgetBalance
    方法访问,保护了数据的安全性。

7.抽象

抽象(Abstraction)

  • 概念:
    抽象是对复杂事物的简化,通过抽象类和接口定义对象的基本特征和行为,而不涉及具体实现。抽象类包含抽象方法,接口是纯抽象类。
  • 代码示例:
class Vehicle {
public:virtual void move() = 0;virtual ~Vehicle() = default;
};class Car : public Vehicle {
public:void move() override {std::cout << "Car is moving." << std::endl;}
};int main() {Vehicle* vehicle = new Car();vehicle->move();delete vehicle;return 0;
}

解释:

  • Vehicle 是抽象类,定义了 move 抽象方法,Car 类实现了 move 方法,抽象类为派生类提供了规范。

8.接口

接口(Interface)

  • 概念:
    接口定义了一组方法,类通过实现这些方法来提供具体功能,通常使用纯虚函数的抽象类表示。
  • 代码示例:
class Printable {
public:virtual void print() = 0;virtual ~Printable() = default;
};class Document : public Printable {
public:void print() override {std::cout << "Printing document." << std::endl;}
};int main() {Printable* doc = new Document();doc->print();delete doc;return 0;
}

解释:

  • Printable 是接口,Document 类实现了 print 方法,遵循接口定义的规范。

9.重载

重载(Overloading)

  • 概念:
    函数重载是指在同一作用域内,多个函数可以具有相同的名称但不同的参数列表,运算符重载是为已有运算符赋予新的操作含义。
  • 代码示例(函数重载):
class Math {
public:int add(int a, int b) {return a + b;}double add(double a, double b) {return a + b;}
};int main() {Math m;std::cout << m.add(1, 2) << std::endl;       // 调用 int add(int, int)std::cout << m.add(1.5, 2.5) << std::endl; // 调用 double add(double, double)return 0;
}

解释:

  • 不同参数类型的 add 函数,根据输入参数调用相应的函数。

10.重写

重写(Overriding)

  • 概念:
    在派生类中重新定义基类的虚函数,实现派生类特有的行为。
  • 代码示例:
class Base {
public:virtual void show() {std::cout << "Base::show()" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived::show()" << std::endl;}
};int main() {Base* basePtr = new Derived();basePtr->show(); // 调用 Derived 的 show 方法delete basePtr;return 0;
}

解释:

  • Derived 类重写了 Base 类的 show 方法,体现多态性。

11.协变返回类型

协变返回类型(Covariant Return Types)

  • 概念:
    在重写虚函数时,允许派生类的重写函数返回的指针或引用的类型是基类中相应虚函数返回类型的派生类型。
  • 代码示例:
class Base {
public:virtual Base* clone() = 0;virtual ~Base() = default;
};class Derived : public Base {
public:Derived* clone() override {return new Derived();}
};int main() {Base* basePtr = new Derived();Derived* derivedPtr = dynamic_cast<Derived*>(basePtr->clone());delete basePtr;delete derivedPtr;return 0;
}

解释:

  • Derived 类重写 clone 函数,返回类型为 Derived*,是基类 Base* 的派生类型。

12.虚析构函数

虚析构函数(Virtual Destructor)

  • 概念:
    基类的析构函数设为虚函数,确保通过基类指针删除派生类对象时正确调用派生类析构函数,防止内存泄漏。
  • 代码示例:
class Base {
public:virtual ~Base() {std::cout << "Base destructor." << std::endl;}
};class Derived : public Base {
public:~Derived() override {std::cout << "Derived destructor." << std::endl;}
};int main() {Base* basePtr = new Derived();delete basePtr; // 先调用 Derived 的析构函数,再调用 Base 的析构函数return 0;
}

解释:

  • 虚析构函数保证了正确的析构顺序。

13.静态成员

静态成员(Static Members)

  • 概念:
    静态成员属于类而不是对象,所有对象共享静态成员变量,静态成员函数可以在不创建对象的情况下调用。
  • 代码示例:
class Counter {
public:static int count;static void increment() {count++;}
};int Counter::count = 0;int main() {Counter::increment();Counter::increment();std::cout << Counter::count << std::endl; // 输出 2return 0;
}

解释:

  • count 是静态成员变量,increment是静态成员函数,通过类名直接调用。

14.友元

友元(Friend)

  • 概念:
    允许一个函数或类访问另一个类的私有或保护成员,破坏封装性,应谨慎使用。
  • 代码示例:
class A {
private:int data;friend void displayData(const A& a);
public:A(int d) : data(d) {}
};void displayData(const A& a) {std::cout << "Data: " << a.data << std::endl;
}int main() {A obj(10);displayData(obj);return 0;
}

解释:

  • displayData 函数是 A 类的友元函数,可以访问 A 类的私有成员 data

15.构造函数

构造函数(Constructor)

  • 概念:
    构造函数是类的特殊成员函数,用于初始化对象的成员变量,在对象创建时自动调用。
  • 代码示例:
class Point {
private:int x, y;
public:Point(int xVal, int yVal) : x(xVal), y(yVal) {}void display() {std::cout << "Point: (" << x << ", " << y << ")" << std::endl;}
};int main() {Point p(3, 4);p.display();return 0;
}

解释:

  • Point(int xVal, int yVal) 是构造函数,初始化 xy 成员变量。

16.析构函数

析构函数(Destructor)

  • 概念:
    析构函数是在对象销毁时自动调用的特殊成员函数,用于释放资源。
  • 代码示例:
class Resource {
public:Resource() {std::cout << "Resource acquired." << std::endl;}~Resource() {std::cout << "Resource released." << std::endl;}
};int main() {Resource r; // 创建对象时调用构造函数,销毁时调用析构函数return 0;
}

解释:

  • ~Resource() 是析构函数,在对象 r 销毁时释放资源。

17.拷贝析构函数

拷贝构造函数(Copy Constructor)

  • 概念:
    用于通过一个已有对象创建新对象,进行对象的复制,默认拷贝构造函数进行浅拷贝,可能需要自定义深拷贝。
  • 代码示例:
class Array {
private:int* data;int size;
public:Array(int s) : size(s) {data = new int[size];for (int i = 0; i < size; ++i) {data[i] = i;}}Array(const Array& other) : size(other.size) {data = new int[size];for (int i = 0; i < size; ++i) {data[i] = other.data[i];}}~Array() {delete[] data;}void display() {for (int i = 0; i < size; ++i) {std::cout << data[i] << " ";}std::cout << std::endl;}
};int main() {Array a(5);Array b = a; // 调用拷贝构造函数a.display();b.display();return 0;
}

解释:

  • Array(const Array& other) 是拷贝构造函数,实现深拷贝,避免浅拷贝导致的指针共享问题。

18移动析构函数

移动构造函数(Move Constructor)

  • 概念:
    用于将资源从一个对象转移到另一个对象,提高性能,避免不必要的复制。
  • 代码示例:
#include <iostream>
#include <utility>class Array {
private:int* data;int size;
public:Array(int s) : size(s) {data = new int[size];for (int i = 0; i < size; ++i) {data[i] = i;}}Array(const Array& other) : size(other.size) {data = new int[size];for (int i = 0; i < size; ++i) {data[i] = other.data[i];}}Array(Array&& other) : size(other.size), data(other.data) {other.data = nullptr;}~Array() {delete[] data;}void display() {for (int i = 0; i < size; ++i) {std::cout << data[i] << " ";}std::cout << std::endl;}
};int main() {Array a(5);Array b = std::move(a); // 调用移动构造函数a.display(); // 可能输出不确定结果,因为 a 的数据已被移动b.display();return 0;
}

解释:

  • Array(Array&& other) 是移动构造函数,将 other 对象的数据移动到新对象,避免复制操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495593.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

week 11 - BCNF

1. More on functional dependencies (功能依赖的更多内容) Lossless decomposition (无损分解) 研究如何在分解表的过程中不丢失信息&#xff0c;也就是说&#xff0c;通过分解后的表可以无损地重建原始表。 2. BCNF (Boyce-Codd Normal Form, BCNF范式) &#xff08;1&…

嵌入式学习-QT-Day06

嵌入式学习-QT-Day06 六、多窗口编程 1、QMessageBox 消息对话框 2、QWidget类 3、parent参数 4、堆栈窗口&#xff08;QStackedWidget&#xff09; 5、新建自定义窗口类 6、对象传值 6.1 父对象 → 子对象 6.2 子对象 → 父对象 7、事件机制 8、QMainWindow主窗口类 8.1 QMenu…

《战神:诸神黄昏》游戏运行时提示找不到gamede.dll文件怎么办?gamede.dll丢失的修复指南

在沉浸于《战神&#xff1a;诸神黄昏》的壮阔世界时&#xff0c;突然弹出的“找不到gamede.dll文件”错误提示可能会让玩家措手不及。作为一名经验丰富的软件开发从业者&#xff0c;我深知这类问题对游戏体验的影响。今天&#xff0c;我将为大家详细解析gamede.dll文件丢失的原…

1.系统学习-线性回归

系统学习-线性回归 前言线性回归介绍误差函数梯度下降梯度下降示例 回归问题常见的评价函数1. MAE, mean absolutely error2. MSE, mean squared error3. R square &#xff08;决定系数或R方&#xff09; 机器学习建模流程模型正则化拓展阅读作业 链接: 2.系统学习-逻辑回归 …

基于微信小程序的校园访客登记系统

基于微信小程序的校园访客登记系统 功能列表 用户端功能 注册与登录 &#xff1a;支持用户通过手机号短信验证码注册和登录。个人资料管理 &#xff1a;允许用户编辑和更新个人信息及其密码。站内信消息通知&#xff1a;通知公告。来访预约&#xff1a;提交来访预约支持车牌…

H3C MPLS跨域optionB

实验拓扑 实验需求 如图,VPN1 和 VPN2 分别通过运营商 MPLS VPN 连接各自分支机构按照图示配置 IP 地址,VPN1 和 VPN2 连接同一个 PE 设备的私网 IP 网段存在地址复用,使用多 VRF 技术来防止 IP 冲突AS 100 和 AS 200 内部的公共网络中各自运行 OSPF 使 AS 内各设备的 Loo…

【项目管理】根据业务流程进行函数结构设计和模块化设计

在开发一个复杂的系统时&#xff0c;根据业务流程进行函数结构设计和模块化设计是一个非常重要的步骤。通过这种方式&#xff0c;能够将复杂的业务逻辑拆分成多个功能模块和函数&#xff0c;使代码更清晰、易维护、易扩展。我们在写代码的时候需要基于对于业务的理解来编程&…

VMware虚拟机中CentOS系统/dev/mapper/centos-home分区扩容指南

要将VMware上新扩展的磁盘添加到CentOS虚拟机,并将其扩容到/dev/mapper/centos-home下,你可以按照以下步骤操作: 一、在VMware中扩展虚拟机磁盘 关闭CentOS虚拟机:确保在扩展磁盘之前,CentOS虚拟机已经关闭。 编辑虚拟机设置:在VMware中,右键点击CentOS虚拟机,选择“设…

GPUStack v0.4.1 单节点与多节点安装与部署指南 Docker PowerShell

Introduce GPUStack 是一个开源的 GPU 集群管理器&#xff0c;专为运行 AI 模型而设计。它以其广泛的硬件兼容性而闻名&#xff0c;支持多种品牌的 GPU&#xff0c;并能在 Apple MacBook、Windows PC 和 Linux 服务器上运行。 GPUStack支持各种AI模型&#xff0c;包括大型语言…

【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析

Hiヽ(゜▽゜ )&#xff0d;欢迎来到蓝染Aizen的CSDN博客~ &#x1f525; 博客主页&#xff1a; 【✨蓝染 の Blog&#x1f618;】 &#x1f496;感谢大家点赞&#x1f44d; 收藏⭐ 评论✍ 文章目录 行为型模式1、模板方法模式&#xff08;1&#xff09;概述&#xff08;2&…

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘

学习爬虫时&#xff0c;遇到如下报错&#xff1a; 报错原因&#xff1a; 正则表达式的 search 或 finditer 方法没有找到任何匹配项&#xff0c;可能是换行符处理不当等。 解决方法如下&#xff1a; 在正则表达式末尾加上re.S即可&#xff0c;re.S是一个编译标志&#xff0c…

一款5k star的 Redis 客户端!!简洁高效!

作为一名热爱编程的程序员&#xff0c;对于高效的工具总是格外追求。在日常的开发中&#xff0c;Redis 作为一款优秀的内存数据库&#xff0c;是我们不可或缺的利器之一。了不起之前也推荐过一些出色的 Redis 客户端&#xff0c;它们在提升我们的开发效率和便利性方面发挥了巨大…

关于科研中使用linux服务器的集锦

文章目录 常用的linux命令下载COCO2017数据集 常用的linux命令 一个文件移动到另一个目录下的命令是&#xff1a;mv -v ./old_name ./new_name 如果目标文件夹中已经有同名文件或文件夹&#xff0c;mv 会覆盖它们&#xff08;除非使用了 -i 选项来提示确认&#xff09;。 使用…

Vue开发环境搭建上篇:安装NVM和NPM(cpnm、pnpm)

文章目录 引言I 安装NVM1.1 Windows系统安装NVM,实现Node.js多版本管理1.2 配置下载镜像1.3 NVM常用操作命令II NPM永久使用淘宝源安装 cnpm安装pnpm【推荐】see also: vscode常用插件引言 淘宝镜像:http://npm.taobao.org 和 http://registry.npm.taobao.org 已在 2022.06.3…

x86_64 Ubuntu 编译安装英伟达GPU版本的OpenCV

手把手带你在Linux上安装带GPU加速的opencv库&#xff08;C版本&#xff09;_opencv linux-CSDN博客 cmake \-D CMAKE_BUILD_TYPERELEASE \-D OPENCV_GENERATE_PKGCONFIGON \-D CMAKE_INSTALL_PREFIX/usr/local \-D OPENCV_EXTRA_MODULES_PATH/home/hwj/opencv/opencv_contrib…

计算机毕业设计Python+卷积神经网络租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

bypy上传配置

bypy upload 上传文件权限不足时 使用此方法,改变权限保存 : w ! sudo tee % 好使但是没有进度条 CMAKE 的配置方法

三维动画的常用“视觉特效”有哪些?

在当今的视觉盛宴中&#xff0c;三维动画技术宛如一位神奇的魔法师&#xff0c;为视觉特效&#xff08;VFX&#xff09;领域施下了变革的咒语。从大荧幕上的震撼电影&#xff0c;到让人沉浸其中的视频游戏&#xff0c;再到夺人眼球的广告以及精细的模拟场景&#xff0c;三维动画…

《Cocos Creator游戏实战》非固定摇杆实现原理

为什么要使用非固定摇杆 许多同学在开发摇杆功能时&#xff0c;会将摇杆固定在屏幕左下某一位置&#xff0c;不会让其随着大拇指触摸点改变&#xff0c;而且玩家只有按在了摇杆上才能移动人物&#xff08;触摸监听事件在摇杆精灵上)。然而&#xff0c;不同玩家的大拇指长度不同…

Text组件的用法

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了页面之间传递数据相关的内容,本章回中将介绍如何使用Text Widget。闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的Text Widget就是显示文字内容的组件,其实我们一直在使用它,只是没有详细介…