「C++系列」类/对象

news2024/9/23 16:22:50

文章目录

  • 一、类
    • 1. 基本类的定义
    • 2. 类的访问控制
    • 3. 类的实例化
    • 4. 构造函数和析构函数
    • 5. 继承
    • 6. 类的使用
  • 二、对象
    • 1. 创建对象
    • 2. 对象的生命周期
    • 3. 对象的内存
    • 4. 对象的操作
    • 5. 对象的复制
    • 6. 总结
  • 三、应用案例
    • 1. 定义BankAccount类
    • 2. 分析
  • 四、相关链接

一、类

C++ 类(Class)是C++面向对象编程(OOP)的基石。它允许你定义包含数据和函数的模板,这些数据和函数用于描述某种特定类型的对象。通过类,你可以创建具有属性和行为的对象。在C++中,类是一种用户定义的类型,它允许你封装数据(属性)和操作这些数据的方法(成员函数)。

1. 基本类的定义

一个C++类通过关键字class来定义,后面跟着类名和一对花括号{},其中包含了类的成员(即数据和函数)。

class ClassName {
public:
    // 成员变量(属性)
    int variable1;
    float variable2;

    // 成员函数(行为)
    void function1() {
        // 成员函数体
    }

    // 可以有构造函数和析构函数
    ClassName() {
        // 初始化
    }

    ~ClassName() {
        // 清理资源
    }

private:
    // 私有成员变量和函数
    int privateVariable;

protected:
    // 受保护成员变量和函数
    int protectedVariable;
};

2. 类的访问控制

C++中的类成员(包括变量和函数)可以有三种访问级别:

  • public:公开成员可以在类的外部被访问。
  • private:私有成员只能在类的内部被访问,外部代码不能直接访问。
  • protected:受保护成员在类的内部和派生类(子类)中可以被访问,但不能在类的外部被访问。

3. 类的实例化

创建类的对象的过程称为类的实例化。使用类类型创建对象时,会分配内存以存储对象的成员变量,并可以调用其成员函数。

ClassName obj; // 创建ClassName类的一个对象obj

obj.variable1 = 10; // 访问和修改public成员变量
obj.function1(); // 调用成员函数

4. 构造函数和析构函数

  • 构造函数是一种特殊的成员函数,它在创建对象时自动调用,用于初始化对象。
  • 析构函数也是一种特殊的成员函数,它在对象销毁时自动调用,用于执行清理工作。
class MyClass {
public:
    MyClass() {
        // 构造函数体
    }

    ~MyClass() {
        // 析构函数体
    }
};

5. 继承

C++支持继承,这是面向对象编程的一个关键概念。通过继承,可以创建一个新的类(称为派生类或子类),这个新类可以继承一个或多个现有类(称为基类或父类)的属性和行为。

class BaseClass {
public:
    void show() {
        // 基类方法
    }
};

class DerivedClass : public BaseClass {
public:
    void display() {
        // 派生类方法
        show(); // 调用基类方法
    }
};

6. 类的使用

类提供了一种将数据和操作这些数据的方法封装在一起的方式,使得代码更加模块化和可重用。通过定义类,你可以创建具有特定属性和行为的对象,这些对象可以代表现实世界中的实体或概念。

二、对象

在C++中,对象(Object)是类(Class)的实例。当你使用类来创建变量时,你实际上是在创建该类的一个对象。对象包含了类定义中声明的所有成员变量(也称为属性或字段)的副本,并且可以使用类定义中声明的所有成员函数(也称为方法或行为)。

1. 创建对象

创建对象通常涉及使用类名后跟一对圆括号(对于没有参数的构造函数)或包含必要参数的圆括号(对于有参数的构造函数)来声明变量。

class MyClass {
public:
    int x;
    void display() {
        std::cout << "x = " << x << std::endl;
    }

    // 构造函数
    MyClass(int val) : x(val) {}
};

int main() {
    // 创建一个MyClass对象,使用构造函数初始化x为10
    MyClass obj(10);

    // 调用成员函数
    obj.display(); // 输出: x = 10

    return 0;
}

2. 对象的生命周期

对象的生命周期从它被创建(即分配内存并调用构造函数)开始,到它被销毁(即调用析构函数并释放内存)结束。在上面的例子中,obj的生命周期从它在main函数中被创建开始,到main函数执行完毕、程序退出时结束。

3. 对象的内存

每个对象都占用一定的内存空间,用于存储其成员变量的值。这些值在对象被创建时初始化(通过构造函数),并在对象被销毁时(通过析构函数)进行清理(如果有必要的话)。

4. 对象的操作

你可以通过点操作符(.)来访问对象的成员变量和成员函数。点操作符用于指定你想要访问的是哪个对象的成员。

obj.x = 20; // 访问并修改成员变量x
obj.display(); // 调用成员函数display

5. 对象的复制

在C++中,当你将一个对象赋值给另一个同类型的对象时,会发生对象的复制。默认情况下,C++使用浅复制(shallow copy),这意味着新对象会获得原始对象成员变量的副本,但如果这些成员变量是指向动态分配内存的指针,则两个对象将共享同一块内存。为了避免这种情况,你可以定义自己的复制构造函数和赋值运算符。

6. 总结

C++中的对象是类的实例,它们具有类定义中声明的所有成员变量和成员函数。对象通过构造函数创建,通过析构函数销毁,并且它们的生命周期和内存占用由C++运行时环境管理。你可以通过点操作符来访问和操作对象的成员。

三、应用案例

C++ 类和对象的应用案例非常广泛,几乎可以涵盖任何需要面向对象编程的场景。下面,我将通过一个简单的案例来展示C++中类和对象的应用。

银行账户系统,在这个案例中,我们将定义一个BankAccount类来表示银行账户,该类将包含账户的基本信息(如账户持有人姓名、账户余额)以及一些操作(如存款、取款、显示账户信息)。

1. 定义BankAccount类

#include <iostream>
#include <string>

class BankAccount {
private:
    std::string owner; // 账户持有人姓名
    double balance;    // 账户余额

public:
    // 构造函数
    BankAccount(std::string name, double initBalance) : owner(name), balance(initBalance) {}

    // 存款
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            std::cout << "存款成功,当前余额:" << balance << std::endl;
        } else {
            std::cout << "存款金额必须大于0!" << std::endl;
        }
    }

    // 取款
    void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            std::cout << "取款成功,当前余额:" << balance << std::endl;
        } else {
            std::cout << "取款失败,余额不足或取款金额必须大于0!" << std::endl;
        }
    }

    // 显示账户信息
    void display() {
        std::cout << "账户持有人:" << owner << ", 当前余额:" << balance << std::endl;
    }
};

int main() {
    // 创建BankAccount对象
    BankAccount account("张三", 1000.0);

    // 调用成员函数
    account.display(); // 显示账户信息
    account.deposit(500.0); // 存款
    account.withdraw(300.0); // 取款
    account.display(); // 再次显示账户信息

    return 0;
}

2. 分析

  1. 类定义BankAccount类包含了私有成员变量owner(账户持有人姓名)和balance(账户余额),以及公有成员函数deposit(存款)、withdraw(取款)和display(显示账户信息)。
  2. 构造函数BankAccount类有一个构造函数,用于在创建对象时初始化账户持有人姓名和初始余额。
  3. 成员函数
  • deposit函数接受一个double类型的参数amount,表示要存入的金额。如果金额大于0,则更新余额并打印成功消息;否则,打印错误消息。
  • withdraw函数也接受一个double类型的参数amount,表示要取出的金额。如果金额大于0且不超过当前余额,则更新余额并打印成功消息;否则,打印错误消息。
  • display函数用于打印账户持有人的姓名和当前余额。
  1. 对象创建与操作:在main函数中,我们创建了一个BankAccount对象account,并使用其成员函数进行了存款、取款和显示账户信息的操作。

这个案例展示了C++中类和对象的基本用法,包括如何定义类、如何创建对象、如何访问对象的成员变量和成员函数,以及如何通过成员函数来操作对象的状态。
在这里插入图片描述

四、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法
  5. 「C++系列」C++ 数据类型
  6. 「C++系列」C++ 变量类型
  7. 「C++系列」C++ 变量作用域
  8. 「C++系列」C++ 常量知识点-细致讲解
  9. 「C++系列」C++ 修饰符类型
  10. 「C++系列」一篇文章说透【存储类】
  11. 「C++系列」一篇文章讲透【运算符】
  12. 「C++系列」循环
  13. 「C++系列」判断
  14. 「C++系列」函数/内置函数
  15. 「C++系列」数字/随机数
  16. 「C++系列」数组
  17. 「C++系列」字符串
  18. 「C++系列」指针
  19. 「C++系列」引用
  20. 「C++系列」日期/时间
  21. 「C++系列」输入/输出
  22. 「C++系列」数据结构
  23. 「C++系列」vector 容器

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

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

相关文章

【初阶数据结构】顺序表和链表算法题(下)

链表 2.链表2.4合并两个有序链表2.5链表分割2.6链表的回⽂结构2.7相交链表2.8环形链表I2.9 环形链表II2.10随机链表的复制 2.链表 2.4合并两个有序链表 思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ …

一键转换语言,探索四大在线翻译工具的魅力!

各种翻译工具不仅为个人用户提供了极大的便利&#xff0c;也为跨国企业、学术研究和文化交流提供了强有力的支持&#xff0c;接下来为大家推荐几款好用的翻译在线工具&#xff01; 福昕在线翻译 直达链接&#xff1a; https://fanyi.pdf365.cn/ 福昕在线翻译是一款功能强大…

分布式锁 redis与zookeeper

redis实现分布式锁 原理 基于redis命令setnx key value来实现分布式锁的功能&#xff0c;只有当key不存在时&#xff0c;setnx才可以设置成功并返回1&#xff0c;否则设置失败返回0。 方案1&#xff1a; 方案1存在的问题 假如在加锁成功&#xff0c;释放锁之前&#xff0c;…

面向对象08:什么是多态

本节内容视频链接&#xff1a;面向对象12&#xff1a;什么是多态_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p71&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的多态是面向对象编程的一个重要概念&#xff0c;‌它允许不同类型的对象对…

jenkins安装及介绍

Cl:持续集成 CD:持续部署 插件:丰富的插件&#xff0c;可以满足99%的需求&#xff0c;还可以二次开发插件来满足需求 Jenkins能干嘛 1.集成第三方工具的使用&#xff0c;jenkins是一个集大成者&#xff0c;它集成了1000多个插件&#xff0c;几乎把所有知名的工具都集成到ienkin…

职场达人必备:2024年PDF转PPT工具精选指南

PDF文件有卓越的兼容性和安全性&#xff0c;&#xff1b;而PPT则以其强大的演示能力。然而&#xff0c;在日常的工作与学习场景中&#xff0c;我们时常面临将PDF内容转化为PPT格式的需求&#xff0c;以便更好地进行展示与编辑。那么&#xff0c;究竟该如何高效地将PDF转换成PPT…

多维系统下单点登录之整理解决方案

从淘宝天猫的单点登录说起 1.1 SSO单点登录 概述 随着互联网大数据不断发展&#xff0c;应用服务的不断增多&#xff0c;单点登录越来越能够凸显其作用。单点 登录SSO(Single Sign On)&#xff0c;顾名思义就是单个节点登录&#xff0c;全局使用。是目前最为流行的统一登录 解…

36 使用LDT(2)

首先是 定义 两个任务的LDT表 这是再GDT表中的选择子 首先是宏定义&#xff1a;这里的 0x4 , 3 先不用管 这里 一个task 一个LDT表 然后是在GDT表中 增加关于LDT的描述。 这里需要加上一个图。 还是这个图 然后是在 TSS表中&#xff0c;设置LDT的表的地址。 然后是更改 TSS表中…

AI的未来已来:GPT-4商业应用带来的无限可能

随着人工智能技术的快速发展&#xff0c;OpenAI于2023年3月15日发布了多模态预训练大模型GPT-4&#xff0c;这一里程碑式的进步不仅提升了AI的语言处理能力&#xff0c;还拓展了其应用范围。本文将深入探讨GPT-4的技术进步、商业化进程、用户体验改善、伦理和社会影响&#xff…

UR机械臂的ROS驱动安装官方教程详解——机器人抓取系统基础系列(一)

UR机械臂的ROS驱动安装配置官方教程详解——机器人抓取系统基础系列&#xff08;一&#xff09; 前言1 准备工作2 电脑安装驱动3 机器人端设置4 电脑和机器人的通讯IP设置5 启动机械臂的ROS驱动6 MoveIt控制机械臂总结 前言 本文在官方Github教程的基础上&#xff0c;详细阐述…

详细说明:向量数据库Faiss的搭建与使用

当然&#xff0c;Faiss&#xff08;Facebook AI Similarity Search&#xff09;是一个用来高效地进行相似性搜索和密集向量聚类的库。它能够处理大型数据集&#xff0c;并且在GPU上的性能表现尤为出色。下面详细介绍Faiss的搭建与使用。 1. 搭建Faiss 1.1 安装依赖包 首先&a…

Hadoop集群运维管理

Hadoop集群运维管理 一、Hadoop 集群进程管理1.1 NameNode 守护进程管理1.2 DataNode 守护进程管理1.3 ResourceManager 守护进程管理1.4 NodeManager 守护进程管理 二、Hadoop 集群运维技巧2.1 查看日志2.2 清理临时文件2.3 定期执行负载均衡2.4 文件系统检查2.5 元数据备份 三…

Redis的持久化介绍及其Linux配置介绍

1. Redis的持久化 Redis的数据都是存储在内存中,为了数据的永久保存,需要把数据同步到硬盘上,这个过程就叫做持久化. Redis的持久化存在有两种方式: rdb方式,aof方式,这两种方式可以单独使用,也可以综合使用. rdb持久化方式: 是在指定的时间间隔写入硬盘aof持久化方式:是以日…

【Python使用】嘿马python基础入门全体系教程第5篇:容器:字符串、列表、元组、字典,<1>添加元素(“增“append

本教程的知识点为&#xff1a;计算机组成 计算机是由什么组成的&#xff1f; 1. 硬件系统&#xff1a; 2. 软件系统&#xff1a; 目标 运算符的分类 1. 算数运算符 2. 赋值运算符 3. 复合赋值运算符 判断语句和循环语句 if嵌套 1. if嵌套的格式 2. if嵌套的应用 if嵌套执行流程…

链家web安全面试经验分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s…

MyBatis使用:动态SQL

1、目标 本文的主要目标是使用MyBatis的动态SQL 2、最好使用Param注解 Data public class BaseEntity {protected String id;protected Integer createUserId;protected String createDateTime;}Data public class News extends BaseEntity {private String title;}RestCont…

【C++ Primer Plus习题】5.8

问题: 解答: #include <iostream> #include <cstring> using namespace std;#define SIZE 20int main() {char words[20];char done[] "done";int count 0;while (true){cout << "请输入单词:" << endl;cin >> words;if …

Open3D 最近点约束的体素滤波(35)

Open3D 最近点约束的体素滤波(35) 一、算法介绍二、算法步骤三、具体代码四、实现效果一、算法介绍 最近点约束的体素滤波,是指在每个体素中,选择距离体素中心最近的原始点作为滤波结果,这样保留的是原始点位置。相比于体素滤波的重心点重新计算,或者八叉树体素中心,更加…

进阶岛 茴香豆:企业级知识库问答工具

一、任务介绍 在 InternStudio 中利用 Internlm2-7b 搭建标准版茴香豆知识助手&#xff0c;并使用 Gradio 界面完成 2 轮问答&#xff08;问题不可与教程重复&#xff0c;作业截图需包括 gradio 界面问题和茴香豆回答&#xff09;。知识库可根据根据自己工作、学习或感兴趣的内…

【复旦微FM33 MCU 外设开发指南】外设篇1——GPIO

前言 本系列基于复旦微FM33系列单片机的DataSheet编写&#xff0c;旨在提供一些开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/08/25 文章目录 前言GPIO工作时钟…