十四天学会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.* …...

Java | Maven(知识点查询)
文章目录 Maven知识速查1. Maven概述2. Maven的作用3. Maven的下载4. Maven的环境配置5. Maven 的基础组成5.1 Maven仓库5.1.1 本地仓库配置:5.1.2 中央仓库配置:5.1.3 镜像仓库配置 5.2 Maven坐标 6. Maven项目6.1 手工创建Maven项目6.2 自动构建项目 7…...

Vmware 静态网络配置
概述 仅主机模式(VMware1):使用host-only的方式是不能和外界通信的,只能够和本机的物理网卡通信 桥接(VMnet0):使用桥接的方式使得自己的虚拟机和自己的真实机网卡在同一个网段 NAT࿰…...

【数据结构--八大排序】之希尔排序
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

Linux中生成so库的文件引用另一个so库问题的解决
文章目录 一、问题介绍二、问题解决 一、问题介绍 由于项目需求,需要将一个“编译时引用了另一个动态链接库”的文件(名为main.c),再编译成一个动态链接库。 简要说明一下,即原本的项目代码里,包含main.c…...

EDI是连接原始电子商务和现代电子商务的纽带
EDI是连接原始电子商务和现代电子商务的纽带。 EDI(Electronic Data Interchange,电子数据交换)是一种电子通信技术,用于在不同组织之间以结构化和标准化的方式交换业务文档和数据。EDI使企业能够更有效地与供应商、客户和合作伙…...

星宿UI2.4资源付费变现小程序源码 支持流量主
第一个小程序为星宿小程序 目前是最新版2.0 搭建星宿需要:备用域名 服务器 微信小程序账号 功能:文章展示 文章分类 资源链接下载 轮播图 直接下载附件功能 很多 很适合做资源类分享 源码下载:https://download.csdn.net/download/m0_6604…...

代码随想录训练营二刷第四十六天 | 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ
代码随想录训练营二刷第四十六天 | 518. 零钱兑换 II 377. 组合总和 Ⅳ 一、518. 零钱兑换 II 题目链接:https://leetcode.cn/problems/coin-change-ii/ 思路:完全背包求组合数,递推公式dp[j]dp[j-nums[i]]。 求组合数,物品在外…...

python安装第三方模块方法
正常情况下安装python第三方模块没啥说的,但是由于python安装模块默认是在外网下载安装,牵扯外网网速问题,所以可以配置下使用国内某镜像源来下载模块 python -m pip install xxxxxxxxxxx 和 pip install xxxxxxxxxx 的命令都可下载安装第三…...

广西小贷公司设立及小贷牌照申请政策要求
关于广西小额贷款公司设立及小贷牌照申请,依据《关于小额贷款公司试点的指导意见》(银监发〔2008〕23号);《广西壮族自治区小额贷款公司管理办法》(桂政发〔2009〕71号);《广西壮族自治区人民政…...

PyTorch应用实战二:实现卷积神经网络进行图像分类
文章目录 实验环境MNIST数据集1.网络结构2.程序实现2.1 导入相关库2.2 构建卷积神经网络模型2.3 加载MNIST数据集2.4 训练模型 附:系列文章 实验环境 python3.6 pytorch1.8.0 import torch print(torch.__version__)1.8.0MNIST数据集 MNIST数字数据集是一组手写…...