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

news2024/12/23 11:56:22

在这里插入图片描述

类和对象是什么?

在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。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++类和对象】:构造函数、析构函数、拷贝构造函数、赋值运算符重载

【C类和对象】&#xff1a;构造函数、析构函数、拷贝构造函数、赋值运算符重载 一、构造函数1.1 概念1.2 性质1.3 实例 二、析构函数2.1 概念2.2 性质2.3 实例 三、拷贝构造函数3.1 概念3.2 性质3.3 实例 四、赋值运算符重载4.1 运算符重载4.2 2 赋值运算符重载1. 赋值运算符重…

一文读懂UTF-8的编码规则

之前写过一篇文章“一文彻底搞懂计算机中文编码”里面只是介绍了GB2312编码知识&#xff0c;关于utf8没有涉及到&#xff0c;经过查询资料发现utf8是对unicode的一种可变长度字符编码&#xff0c;所以再记录一下。 现在国家对于信息技术中文编码字符集制定的标准是《GB 18030-…

yolov8封装进入ROS系统

一,yolov8的环境配置工作 说明:需要相关工程全部源码的可私聊博主或评论留言 配置工作可以参考我的一篇关于yolov8环境配置的博客。 需要说明的是:直接使用: pip install ultralytics 会导致后面对于网络结构的改进无法运行。所以如果需要对网络结构进行改进的同学,不要使用…

学信息系统项目管理师第4版系列17_干系人管理

1. 项目经理和团队管理干系人的能力决定着项目的成败 2. 干系人满意度应作为项目目标加以识别和管理 3. 发展趋势和新兴实践 3.1. 识别所有干系人&#xff0c;而非在限定范围内 3.2. 确保所有团队成员都涉及引导干系人参与的活 3.3. 定期审查干系人群体&#xff0c;可与单…

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

目录 1、为什么要用 Dubbo&#xff1f; 2、Dubbo 的整体架构设计有哪些分层? 3、默认使用的是什么通信框架&#xff0c;还有别的选择吗? 4、服务调用是阻塞的吗&#xff1f; 5、一般使用什么注册中心&#xff1f;还有别的选择吗&#xff1f; 6、默认使用什么序列化框架&…

CUDA+cuDNN+TensorRT 配置避坑指南

深度学习模型加速部署的环境配置&#xff0c;需要在本地安装NVIDIA的一些工具链和软件包&#xff0c;这是一个些许繁琐的过程&#xff0c;而且一步错&#xff0c;步步错。笔者将会根据自己的经验来提供建议&#xff0c;减少踩坑几率。当然可以完全按照官方教程操作&#xff0c;…

新手学习笔记-----⽂件操作

目录 1. 为什么使⽤⽂件&#xff1f; 2. 什么是⽂件&#xff1f; 2.1 程序⽂件 2.2 数据⽂件 2.3 ⽂件名 3. ⼆进制⽂件和⽂本⽂件&#xff1f; 4. ⽂件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 ⽂件指针 4.3 ⽂件的打开和关闭 5. ⽂件的顺序读写 …

多层神经网络和激活函数

多层神经网络的结构 多层神经网络就是由单层神经网络进行叠加之后得到的&#xff0c;所以就形成了层的概念&#xff0c;常见的多层神经网络有如下结构&#xff1a; 1&#xff09;输入层&#xff08;Input layer&#xff09;&#xff0c;众多神经元&#xff08;Neuron&#xff…

点云处理开发测试题目

点云处理开发测试题目 文件夹中有一个场景的三块点云数据&#xff0c;单位mm。是一个桌子上放了一个纸箱&#xff0c;纸箱上有四个圆孔。需要做的内容是&#xff1a; 1. 绘制出最小外接立方体&#xff0c;得到纸箱的长宽高值。注意高度计算是纸箱平面到桌子平面的距离。 2. 计…

【每日一题】买卖股票的最佳时机 IV

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】【2023-10-04】 题目来源 188. 买卖股票的最佳时机 IV 题目解读 本题与 121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II、123. 买卖股票的最佳时机 III 题意目的一…

一文拿捏Spring之IOC、循环依赖、Spring的设计模式

1.IOC(控制反转)与DI(依赖注入) &#x1f31f;面试题(IOC-DI): IOC控制反转是一种实现对象解耦的思想。传统情况下是采用new的方式来创建对象&#xff0c;这个对象是由我们来直接控制的&#xff0c;但是有了IOC后&#xff0c;我们可以在IOC运行期间通过DI动态的将依赖的对象进…

嵌入式系统设计与应用---ARM处理器体系结构(学习笔记)

ARM处理器概述 Cortex-A8处理器工作模式 ps&#xff1a;除用户模式以外的其他模式被称为非用户模式或特权模式&#xff1b;除用户模式及系统模式以外的其他模式可称为异常模式 Cortex-A8存储器管理​​​​​​​ ARM的基本数据类型 字节&#xff08;Byte&#xff09;&#…

激活函数介绍

介绍 神经网络当中的激活函数用来提升网络的非线性&#xff0c;以增强网络的表征能力。它有这样几个特点&#xff1a;有界&#xff0c;必须为非常数&#xff0c;单调递增且连续可求导。我们常用的有sigmoid或者tanh&#xff0c;但我们都知道这两个都存在一定的缺点&#xff0c…

第十五章 类和对象——友元

生活中你的家有客厅(Public)&#xff0c;有你的卧室(Private) 客厅所有来的客人都可以进去&#xff0c;但是你的卧室是私有的&#xff0c;也就是说只有你能进去 但是呢&#xff0c;你也可以允许你的好闺蜜好基友进去。 在程序里&#xff0c;有些私有属性 也想让类外特殊的一些…

springboot配置静态资源访问

使用springboot搭建web项目的时候&#xff0c;springboot默认从static目录访问静态资源 例如我们写一个html,然后去访问这个html 内容《你好&#xff01;》 然后运行项目 运行成功&#xff0c;此时我用的端口号是8089 然后去浏览器里访问hello.html http://localhost:8089/…

力扣 -- 879. 盈利计划(二维费用的背包问题)

解题步骤&#xff1a; 参考代码&#xff1a; 未优化的代码&#xff1a; class Solution { public:int profitableSchemes(int n, int minProfit, vector<int>& group, vector<int>& profit) {//计划数int lengroup.size();//每一维都多开一行空间vector&…

查询表中指定列数据

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select 列名1, 列名2, ..., 列名n from 表名; 想要查多少列就写多少个列名,不需要看的不要写就行了 案例&#xff1a;查询emp表中&…

Spring面试题学习: 单例Bean是单例模式吗?

单例Bean是单例模式吗 学习背景答案扩展知识单例模式Spring BeanJava Bean单例Bean 个人评价我的回答 学习背景 想换工作. 学习记录, 算是一个输出. 答案 通常来说, 单例模式是指在一个JVM中, 一个类只能构造出一个对象. 有很多方法来实现单例模式, 比如饿汉模式. 但是我们通…

使用Pytorch构建神经网络

构建神经网络的典型流程 定义一个拥有可学习参数的神经网络遍历训练数据集处理输入数据使其流经神经网络计算损失值将网络参数的梯度进行反向传播以一定的规则更新网络的权重 我们首先定义一个Pytorch实现的神经网络: # 导入若干工具包 import torch import torch.nn as nn …

【vue】element强制刷新el-carousel的dom:

文章目录 一、问题:二、分析:三、解决: 一、问题: 二、分析: el-carouse里面的数据是最新的&#xff0c;但dom却是前一个的数据 注意&#xff1a;使用了this.$forceUpdate();或this.$set(xx,xx);&#xff0c;没有效果 三、解决: :key"new Date().getTime()"