当前位置: 首页 > news >正文

十四天学会C++之第四天(面向对象编程基础)

在这里插入图片描述

类和对象是什么?

在C++中,是一种用户定义的数据类型,它可以包含数据成员(也就是属性)和成员函数(也就是方法)。类是一种模板或蓝图,用于创建具体的对象。

对象是类的实例,它是根据类的定义创建的,可以用来表示现实世界中的各种事物。对象具有类定义的属性和行为。

面向对象编程思想

面向对象编程(OOP)是一种编程范式,强调将现实世界的概念映射到类和对象上。这种思想使得代码更加模块化、可维护性更强,更容易理解。

举个例子,如果我们要编写一个程序来模拟汽车的行为,我们可以创建一个名为Car的类。这个类可以有属性,如颜色、速度等,以及方法,如加速、刹车等。然后,我们可以根据这个类创建多个汽车对象,每个对象都代表现实世界中的一辆汽车。

C++中的类和对象示例

类和对象的基本概念:

#include <iostream>
using namespace std;// 定义一个类
class Car {
public:// 属性string color;int speed;// 方法void start() {cout << "Car started." << endl;}void accelerate() {speed += 10;cout << "Accelerating. Speed: " << speed << " km/h" << endl;}
};int main() {// 创建两个Car对象Car car1;Car car2;// 设置属性car1.color = "Red";car1.speed = 0;car2.color = "Blue";car2.speed = 0;// 调用方法car1.start();car1.accelerate();car2.start();car2.accelerate();return 0;
}

运行结果:在这里插入图片描述

在示例中,我们定义了一个Car类,它有两个属性(colorspeed)和两个方法(startaccelerate)。然后,我们创建了两个Car对象car1car2,并分别设置了它们的属性,最后调用了对象的方法。

成员变量和成员函数是什么?

在C++类中,成员变量是用来存储对象的属性或数据的变量。它们描述了对象的状态。成员变量也被称为类的数据成员。

成员函数是与类相关联的函数,它们定义了对象的行为和操作。成员函数也被称为类的成员操作或方法。

声明和定义成员变量

在C++中,成员变量通常在类的声明部分进行声明,然后在类的定义部分进行定义。

class Student {
public:// 声明成员变量string name;int age;// 其他成员函数...
};// 在类的定义部分初始化成员变量
Student::Student() {name = "John";age = 20;
}

在示例中,我们声明了两个成员变量nameage,然后在类的定义部分使用构造函数对它们进行初始化。

声明和定义成员函数

成员函数通常在类的声明部分进行声明,然后在类的定义部分进行定义。

class Student {
public:// 成员函数的声明void setName(string n);void setAge(int a);// 其他成员变量...private:string name;int age;
};// 成员函数的定义
void Student::setName(string n) {name = n;
}void Student::setAge(int a) {age = a;
}

在示例中,我们声明了两个成员函数setNamesetAge,然后在类的定义部分进行了定义。这些成员函数用于设置成员变量nameage的值。

使用成员变量和成员函数

一旦类的成员变量和成员函数被声明和定义,我们可以通过创建类的对象来使用它们。例如:

int main() {Student student1;student1.setName("Alice");student1.setAge(22);// 其他操作...return 0;
}

在示例中,我们创建了一个Student对象student1,然后使用成员函数setNamesetAge来设置对象的属性。

构造函数和析构函数是什么?

构造函数是一种特殊的成员函数,用于在对象被创建时初始化对象的成员变量。构造函数的名称与类名相同,它没有返回值。在C++中,每个类都可以有一个或多个构造函数。

析构函数也是一种特殊的成员函数,用于在对象被销毁时清理对象的资源。析构函数的名称与类名相同,但前面有一个波浪号(~)。在C++中,每个类都可以有一个析构函数。

构造函数的示例

下面是一个构造函数的示例:

class Student {
public:// 构造函数Student(string n, int a) {name = n;age = a;}// 其他成员函数...private:string name;int age;
};

在示例中,我们定义了一个接受两个参数的构造函数,用于初始化nameage成员变量。

析构函数的示例

下面是一个析构函数的示例:

class Student {
class Student {
public:// 构造函数Student(string n, int a) {name = n;age = a;}// 其他成员函数...private:string name;int age;
};public:// 构造函数Student(string n, int a) {name = n;age = a;}// 析构函数~Student() {// 清理资源的代码}// 其他成员函数...private:string name;int age;
};

在示例中,我们定义了一个析构函数,它可以用于清理对象的资源,例如释放动态分配的内存。

使用构造函数和析构函数

构造函数在创建对象时自动调用,而析构函数在对象被销毁时自动调用。例如:

int main() {// 创建对象时调用构造函数Student student1("Alice", 22);// 对象销毁时调用析构函数// 不需要手动调用析构函数,它会自动执行清理操作return 0;
}

封装、继承和多态是什么?

这三个概念是面向对象编程的核心,它们分别是:

  1. 封装(Encapsulation):封装是将数据和操作数据的方法捆绑在一起的概念。类中的成员变量和成员函数可以被封装在一起,从外部只能访问类的公有接口,而不能直接访问内部的实现细节。

  2. 继承(Inheritance):继承允许一个类继承另一个类的属性和方法。子类可以继承父类的成员,并且可以添加新的成员或修改继承的成员。这提高了代码的重用性和可维护性。

  3. 多态(Polymorphism):多态允许不同的对象对相同的消息作出不同的响应。这意味着具有不同类的对象可以对相同的方法调用做出不同的响应。多态性通过虚函数和抽象类实现。

封装的示例

下面是一个封装的示例:

class Circle {
public:// 构造函数Circle(double r) {radius = r;}// 计算面积的方法double calculateArea() {return 3.14159 * radius * radius;}private:double radius;
};

在示例中,radius成员变量被封装在Circle类中,外部代码无法直接访问它。

继承的示例

下面是一个继承的示例:

class Animal {
public:void eat() {cout << "Animal is eating." << endl;}
};class Dog : public Animal {
public:void bark() {cout << "Dog is barking." << endl;}
};

在示例中,Dog类继承了Animal类的eat方法,同时添加了自己的bark方法。

多态的示例

下面是一个多态的示例:

class Shape {
public:virtual void draw() {cout << "Drawing a shape." << endl;}
};class Circle : public Shape {
public:void draw() override {cout << "Drawing a circle." << endl;}
};class Square : public Shape {
public:void draw() override {cout << "Drawing a square." << endl;}
};

在示例中,Shape类定义了一个虚函数draw,而CircleSquare类分别重写了这个函数。当我们通过基类指针调用draw方法时,具体执行哪个子类的方法取决于对象的实际类型。

类和对象的概念

在C++中,类是一种用户定义的数据类型,它用于封装数据和操作数据的方法。类定义了一种对象的结构,包括它的属性(成员变量)和行为(成员函数)。对象是类的实例,是具体的数据。

让我们从一个简单的示例开始:

// 定义一个类
class Student {
public:// 成员变量string name;int age;// 成员函数void display() {cout << "Name: " << name << ", Age: " << age << endl;}
};int main() {// 创建一个Student对象Student s;// 设置对象的属性s.name = "Alice";s.age = 20;// 调用对象的方法s.display();return 0;
}

在示例中,我们定义了一个Student类,它有两个成员变量nameage,以及一个成员函数display用于显示学生信息。然后,我们创建了一个Student对象s,设置了对象的属性并调用了成员函数。

示例代码

  • 创建一个类Car,包含成员变量brand(品牌)和price(价格),以及成员函数showInfo用于显示车辆信息。
class Car {
public:string brand;double price;void showInfo() {cout << "Brand: " << brand << ", Price: $" << price << endl;}
};
  • main函数中,创建两个Car对象并设置它们的属性,然后调用showInfo方法显示信息。
int main() {Car car1;car1.brand = "Toyota";car1.price = 25000.0;Car car2;car2.brand = "Honda";car2.price = 22000.0;car1.showInfo();car2.showInfo();return 0;
}

练习题

  1. 创建一个类Rectangle表示矩形,包含成员变量width(宽度)和height(高度),以及成员函数calculateArea用于计算矩形的面积。
  2. main函数中,创建一个Rectangle对象,设置其宽度和高度,然后调用calculateArea方法计算并显示面积。

创建一个Rectangle类表示矩形时,首先要定义类的成员变量和成员函数。在main函数中,我们可以创建一个Rectangle对象并调用其成员函数来计算面积并显示。

#include <iostream>using namespace std;// 创建一个类 Rectangle 表示矩形
class Rectangle {
public:// 成员变量,表示矩形的宽度和高度double width;double height;// 成员函数,用于计算矩形的面积double calculateArea() {return width * height;}
};int main() {// 创建一个 Rectangle 对象Rectangle myRectangle;// 设置矩形的宽度和高度myRectangle.width = 5.0;myRectangle.height = 3.0;// 调用 calculateArea 方法计算面积double area = myRectangle.calculateArea();// 显示矩形的面积cout << "矩形的面积是: " << area << endl;return 0;
}

运行结果:在这里插入图片描述

解答说明:

  1. 首先定义一个Rectangle类,其中包含了两个成员变量widthheight,以及一个成员函数calculateArea用于计算矩形的面积。
  2. main函数中,创建一个名为myRectangleRectangle对象。
  3. 设置myRectangle对象的widthheight属性为5.0和3.0。
  4. 调用calculateArea方法计算矩形的面积,并将结果存储在area变量中。
  5. 最后,使用cout输出矩形的面积。

运行这段代码,你将得到输出结果:矩形的面积是: 15。

一个简单的类和对象,并在类中定义成员函数来执行操作。可以根据这个示例来创建更复杂的类和对象,并定义更多的成员函数来完成不同的任务。

创建一个Rectangle类表示矩形时,首先要定义类的成员变量和成员函数。在main函数中,可以创建一个Rectangle对象并调用其成员函数来计算面积并显示。

#include <iostream>using namespace std;// 创建一个类 Rectangle 表示矩形
class Rectangle {
public:// 成员变量,表示矩形的宽度和高度double width;double height;// 成员函数,用于计算矩形的面积double calculateArea() {return width * height;}
};int main() {// 创建一个 Rectangle 对象Rectangle myRectangle;// 设置矩形的宽度和高度myRectangle.width = 5.0;myRectangle.height = 3.0;// 调用 calculateArea 方法计算面积double area = myRectangle.calculateArea();// 显示矩形的面积cout << "矩形的面积是: " << area << endl;return 0;
}

运行结果:在这里插入图片描述

解答说明:

  1. 首先定义了一个Rectangle类,其中包含了两个成员变量widthheight,以及一个成员函数calculateArea用于计算矩形的面积。
  2. main函数中,创建一个名为myRectangleRectangle对象。
  3. 设置myRectangle对象的widthheight属性为5.0和3.0。
  4. 调用calculateArea方法计算矩形的面积,并将结果存储在area变量中。
  5. 最后,使用cout输出矩形的面积。

运行这段代码,你将得到输出结果:矩形的面积是: 15。

创建一个简单的类和对象,并在类中定义成员函数来执行操作。可以根据这个示例来创建更复杂的类和对象,并定义更多的成员函数来完成不同的任务。

相关文章:

十四天学会C++之第四天(面向对象编程基础)

类和对象是什么&#xff1f; 在C中&#xff0c;类是一种用户定义的数据类型&#xff0c;它可以包含数据成员&#xff08;也就是属性&#xff09;和成员函数&#xff08;也就是方法&#xff09;。类是一种模板或蓝图&#xff0c;用于创建具体的对象。 对象是类的实例&#xff…...

复习Day09:哈希表part02:141.环形链表、142. 环形链表II、454.四数相加II、383赎金信

之前的blog&#xff1a;https://blog.csdn.net/weixin_43303286/article/details/131765317 我用的方法是在leetcode再过一遍例题&#xff0c;明显会的就复制粘贴&#xff0c;之前没写出来就重写&#xff0c;然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用…...

Internet通过TCP/IP协议可以实现多个网络的无缝连接

Internet通过TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/互联网协议&#xff09;协议实现多个网络的无缝连接。 TCP/IP是Internet的基础通信协议套件&#xff0c;它定义了数据如何在不同网络之间传输和路由&#xff0c;使得…...

互联网Java工程师面试题·Dubbo 篇·第二弹

目录 18、Dubbo 用到哪些设计模式&#xff1f; 19、Dubbo 配置文件是如何加载到 Spring 中的&#xff1f; 20、Dubbo SPI 和 Java SPI 区别&#xff1f; 21、Dubbo 支持分布式事务吗&#xff1f; 22、Dubbo 可以对结果进行缓存吗&#xff1f; 23、服务上线怎么兼容旧版本&…...

(c语言)经典bug

#include<stdio.h> //经典bug int main() { int i 0; int arr[10] {1,2,3,4,5,6,7,8,9,10}; for (i 0; i < 12; i) //越界访问 { arr[i] 0; printf("hehe\n"); } return 0; } 注&#xff1a;输出结果为死循…...

用于工业物联网和自动化的 Apache Kafka、KSQL 和 Apache PLC4

由于单一系统和专有协议&#xff0c;数据集成和处理是工业物联网&#xff08;IIoT&#xff0c;又名工业 4.0 或自动化工业&#xff09;中的巨大挑战。Apache Kafka、其生态系统&#xff08;Kafka Connect、KSQL&#xff09;和 Apache PLC4X 是以可扩展、可靠和灵活的方式实现端…...

1.1.1开发基础-硬件-万用表

​ 1 万用表 万用表又叫多用表、三用表、复用表,是一种多功能、多量程的测量仪表,一般万用表可测量直流电流、直流电压、交流电压、电阻和音频电平等,有的还可以测交流电流、电容量、电感量及半导体的一些参数,是最常用、最简单的测试设备。 万用表是一种多功能多量程的便…...

Mysql内置函数、复合查询和内外连笔记

目录 一、mysql内置函数 1.1.日期函数 1.2.字符串函数 1.3.数学函数 1.4.其他函数 二、复合查询 2.2 自连接 2.3 子查询 2.3.1单行自查询 2.3.2 多行子查询 2.3.3 多列子查询 2.3.4在from子句中使用子查询 2.3.5合并查询 三、表的内连和外连 3.1内连接 3.2外连接…...

【VUE·疑难问题】定义 table 中每行的高度(使用 element-UI)

一、如何定义 table 中每一行的 height &#xff1f; 1.table例子 <!-- 二、table --><div style"overflow: hidden;display: block;height: 68vh;width: 100%;"><el-table stripe show-header style"width: 100%" :data"tableData&q…...

【重拾C语言】四、循环程序设计(后判断条件循环、先判断条件循环、多重循环;典例:计算平均成绩、打印素数、百钱百鸡问题)

目录 前言 四、循环程序设计 4.1 计算平均成绩——循环程序 4.1.1 后判断条件的循环 a. 语法 b. 典例 4.1.2 先判断条件的循环 a. 语法 b. 典例 4.1.3 for语句 a. 语法 b. 典例 4.2 计算全班每人平均成绩—多重循环 4.2.1 打印100以内素数 4.2.2 百钱百…...

Linux 安装 Gitlab

1、到官网下载Gitlab安装包 (如果是Centos&#xff0c;到el目录下载)。下载GitLab 2、安装依赖软件 sudo yum install -y policycoreutils-python3、安装gitlab sudo rpm -i gitlab-jh-16.3.4-jh.0.el7.x86_64.rpm 4、修改 gitlab.rb sudo vi /etc/gitlab/gitlab.rb 5、g…...

stm32-SPI协议

SPI协议详解&#xff08;图文并茂超详细&#xff09; SPI通讯协议 于是我们想有没有更好一点的串行通讯方式&#xff1b;相比较于UART&#xff0c;SPI的工作方式略有不同。 SPI是一个同步的数据总线&#xff0c;也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和…...

想要精通算法和SQL的成长之路 - 并查集的运用和案例(省份数量)

想要精通算法和SQL的成长之路 - 并查集的运用 前言一. 并查集的使用和模板1.1 初始化1.2 find 查找函数1.3 union 合并集合1.4 connected 判断相连性1.5 完整代码 二. 运用案例 - 省份数量 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 并查集的使用和模板 先说一下并查集…...

解决内网拉取企微会话存档代理问题的一种办法

问题&#xff1a;客户的服务都是内网的&#xff0c;不能直接访问外网&#xff1b;访问外网的话需要走kong网关才能出去。 会话存档官网说可以使用socket5、http方式拉取会话存档&#xff1b;我这边尝试了直接使用kong网关的ip和端口配置进去&#xff0c;是访问不了的 我后面就…...

二十二,加上各种贴图

使用pbr的各种贴图&#xff0c;albedo,金属度&#xff0c;ao,法线&#xff0c;粗糙度&#xff0c;可以更好的控制各个片元 1&#xff0c;先加上纹理坐标 texCoords->push_back(osg::Vec2(xSegment, ySegment)); geom->setVertexAttribArray(3, texCoords, osg::Array::BI…...

新版校园跑腿独立版小程序源码 多校版本,多模块,适合跑腿,外卖,表白,二手,快递等校园服务

最新校园跑腿小程序源码 多校版本&#xff0c;多模块&#xff0c;适合跑腿&#xff0c;外卖&#xff0c;表白&#xff0c;二手&#xff0c;快递等校园服务 此版本为独立版本&#xff0c;不需要** 直接放入就可以 需要自己准备好后台的服务器&#xff0c;已认证的小程序&#xf…...

SpringBoot banner 样式 自动生成

目录 SpringBoot banner 样式 自动生成 图案网站&#xff1a; 1.第一步创建banner.txt文件 2.访问网站Ascii艺术字实现个性化Spring Boot启动banner图案&#xff0c;轻松修改更换banner.txt文件内容&#xff0c;收集了丰富的banner艺术字和图&#xff0c;并且支持中文banner下…...

回收站里面删除的照片如何恢复?

现在拍照已经成为人们生活中的一种方式&#xff0c;照片为我们保留了许多珍贵而美好的回忆。大家通常会把重要的照片保存在硬盘里&#xff0c;但当不小心把照片移入回收站并彻底删除时&#xff0c;情况就有点糟糕了。那么&#xff0c;回收站里删除的照片还有办法恢复吗&#xf…...

Qt model/view 理解 2

这是我对 Qt 的 model/view 内容理解的第二篇 blog&#xff0c;在第一篇文章中&#xff0c;介绍 QTableView 和 QAbstractTableModel&#xff0c;实现显示了对数据源的显示&#xff0c;但是显示的格式和修改的模式都是按照 View 控件的自显示方式。在此&#xff0c;使用 Qt 自带…...

【LeetCode热题100】--114.二叉树展开为链表

114.二叉树展开为链表 方法一&#xff1a;对二叉树进行先序遍历&#xff0c;得到各个节点被访问到的顺序&#xff0c;利用数组存储下来&#xff0c;然后在先序遍历之后更新每个节点的左右节点的信息&#xff0c;将二叉树展开为链表 /*** Definition for a binary tree node.* …...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...