十四天学会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类,它有两个属性(color和speed)和两个方法(start和accelerate)。然后,我们创建了两个Car对象car1和car2,并分别设置了它们的属性,最后调用了对象的方法。
成员变量和成员函数是什么?
在C++类中,成员变量是用来存储对象的属性或数据的变量。它们描述了对象的状态。成员变量也被称为类的数据成员。
成员函数是与类相关联的函数,它们定义了对象的行为和操作。成员函数也被称为类的成员操作或方法。
声明和定义成员变量
在C++中,成员变量通常在类的声明部分进行声明,然后在类的定义部分进行定义。
class Student {
public:// 声明成员变量string name;int age;// 其他成员函数...
};// 在类的定义部分初始化成员变量
Student::Student() {name = "John";age = 20;
}
在示例中,我们声明了两个成员变量name和age,然后在类的定义部分使用构造函数对它们进行初始化。
声明和定义成员函数
成员函数通常在类的声明部分进行声明,然后在类的定义部分进行定义。
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;
}
在示例中,我们声明了两个成员函数setName和setAge,然后在类的定义部分进行了定义。这些成员函数用于设置成员变量name和age的值。
使用成员变量和成员函数
一旦类的成员变量和成员函数被声明和定义,我们可以通过创建类的对象来使用它们。例如:
int main() {Student student1;student1.setName("Alice");student1.setAge(22);// 其他操作...return 0;
}
在示例中,我们创建了一个Student对象student1,然后使用成员函数setName和setAge来设置对象的属性。
构造函数和析构函数是什么?
构造函数是一种特殊的成员函数,用于在对象被创建时初始化对象的成员变量。构造函数的名称与类名相同,它没有返回值。在C++中,每个类都可以有一个或多个构造函数。
析构函数也是一种特殊的成员函数,用于在对象被销毁时清理对象的资源。析构函数的名称与类名相同,但前面有一个波浪号(~)。在C++中,每个类都可以有一个析构函数。
构造函数的示例
下面是一个构造函数的示例:
class Student {
public:// 构造函数Student(string n, int a) {name = n;age = a;}// 其他成员函数...private:string name;int age;
};
在示例中,我们定义了一个接受两个参数的构造函数,用于初始化name和age成员变量。
析构函数的示例
下面是一个析构函数的示例:
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;
}
封装、继承和多态是什么?
这三个概念是面向对象编程的核心,它们分别是:
-
封装(Encapsulation):封装是将数据和操作数据的方法捆绑在一起的概念。类中的成员变量和成员函数可以被封装在一起,从外部只能访问类的公有接口,而不能直接访问内部的实现细节。
-
继承(Inheritance):继承允许一个类继承另一个类的属性和方法。子类可以继承父类的成员,并且可以添加新的成员或修改继承的成员。这提高了代码的重用性和可维护性。
-
多态(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,而Circle和Square类分别重写了这个函数。当我们通过基类指针调用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类,它有两个成员变量name和age,以及一个成员函数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;
}
练习题
- 创建一个类
Rectangle表示矩形,包含成员变量width(宽度)和height(高度),以及成员函数calculateArea用于计算矩形的面积。 - 在
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;
}
运行结果:
解答说明:
- 首先定义一个
Rectangle类,其中包含了两个成员变量width和height,以及一个成员函数calculateArea用于计算矩形的面积。 - 在
main函数中,创建一个名为myRectangle的Rectangle对象。 - 设置
myRectangle对象的width和height属性为5.0和3.0。 - 调用
calculateArea方法计算矩形的面积,并将结果存储在area变量中。 - 最后,使用
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;
}
运行结果:
解答说明:
- 首先定义了一个
Rectangle类,其中包含了两个成员变量width和height,以及一个成员函数calculateArea用于计算矩形的面积。 - 在
main函数中,创建一个名为myRectangle的Rectangle对象。 - 设置
myRectangle对象的width和height属性为5.0和3.0。 - 调用
calculateArea方法计算矩形的面积,并将结果存储在area变量中。 - 最后,使用
cout输出矩形的面积。
运行这段代码,你将得到输出结果:矩形的面积是: 15。
创建一个简单的类和对象,并在类中定义成员函数来执行操作。可以根据这个示例来创建更复杂的类和对象,并定义更多的成员函数来完成不同的任务。
相关文章:
十四天学会C++之第四天(面向对象编程基础)
类和对象是什么? 在C中,类是一种用户定义的数据类型,它可以包含数据成员(也就是属性)和成员函数(也就是方法)。类是一种模板或蓝图,用于创建具体的对象。 对象是类的实例ÿ…...
复习Day09:哈希表part02:141.环形链表、142. 环形链表II、454.四数相加II、383赎金信
之前的blog:https://blog.csdn.net/weixin_43303286/article/details/131765317 我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用…...
Internet通过TCP/IP协议可以实现多个网络的无缝连接
Internet通过TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网协议)协议实现多个网络的无缝连接。 TCP/IP是Internet的基础通信协议套件,它定义了数据如何在不同网络之间传输和路由,使得…...
互联网Java工程师面试题·Dubbo 篇·第二弹
目录 18、Dubbo 用到哪些设计模式? 19、Dubbo 配置文件是如何加载到 Spring 中的? 20、Dubbo SPI 和 Java SPI 区别? 21、Dubbo 支持分布式事务吗? 22、Dubbo 可以对结果进行缓存吗? 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; } 注:输出结果为死循…...
用于工业物联网和自动化的 Apache Kafka、KSQL 和 Apache PLC4
由于单一系统和专有协议,数据集成和处理是工业物联网(IIoT,又名工业 4.0 或自动化工业)中的巨大挑战。Apache Kafka、其生态系统(Kafka Connect、KSQL)和 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 ? 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,到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协议详解(图文并茂超详细) SPI通讯协议 于是我们想有没有更好一点的串行通讯方式;相比较于UART,SPI的工作方式略有不同。 SPI是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和…...
想要精通算法和SQL的成长之路 - 并查集的运用和案例(省份数量)
想要精通算法和SQL的成长之路 - 并查集的运用 前言一. 并查集的使用和模板1.1 初始化1.2 find 查找函数1.3 union 合并集合1.4 connected 判断相连性1.5 完整代码 二. 运用案例 - 省份数量 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 并查集的使用和模板 先说一下并查集…...
解决内网拉取企微会话存档代理问题的一种办法
问题:客户的服务都是内网的,不能直接访问外网;访问外网的话需要走kong网关才能出去。 会话存档官网说可以使用socket5、http方式拉取会话存档;我这边尝试了直接使用kong网关的ip和端口配置进去,是访问不了的 我后面就…...
二十二,加上各种贴图
使用pbr的各种贴图,albedo,金属度,ao,法线,粗糙度,可以更好的控制各个片元 1,先加上纹理坐标 texCoords->push_back(osg::Vec2(xSegment, ySegment)); geom->setVertexAttribArray(3, texCoords, osg::Array::BI…...
新版校园跑腿独立版小程序源码 多校版本,多模块,适合跑腿,外卖,表白,二手,快递等校园服务
最新校园跑腿小程序源码 多校版本,多模块,适合跑腿,外卖,表白,二手,快递等校园服务 此版本为独立版本,不需要** 直接放入就可以 需要自己准备好后台的服务器,已认证的小程序…...
SpringBoot banner 样式 自动生成
目录 SpringBoot banner 样式 自动生成 图案网站: 1.第一步创建banner.txt文件 2.访问网站Ascii艺术字实现个性化Spring Boot启动banner图案,轻松修改更换banner.txt文件内容,收集了丰富的banner艺术字和图,并且支持中文banner下…...
回收站里面删除的照片如何恢复?
现在拍照已经成为人们生活中的一种方式,照片为我们保留了许多珍贵而美好的回忆。大家通常会把重要的照片保存在硬盘里,但当不小心把照片移入回收站并彻底删除时,情况就有点糟糕了。那么,回收站里删除的照片还有办法恢复吗…...
Qt model/view 理解 2
这是我对 Qt 的 model/view 内容理解的第二篇 blog,在第一篇文章中,介绍 QTableView 和 QAbstractTableModel,实现显示了对数据源的显示,但是显示的格式和修改的模式都是按照 View 控件的自显示方式。在此,使用 Qt 自带…...
【LeetCode热题100】--114.二叉树展开为链表
114.二叉树展开为链表 方法一:对二叉树进行先序遍历,得到各个节点被访问到的顺序,利用数组存储下来,然后在先序遍历之后更新每个节点的左右节点的信息,将二叉树展开为链表 /*** Definition for a binary tree node.* …...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
