【C++ | 类】类和对象

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-05-30

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、C++中的类
    • ✨2.1 类将数据和函数组织在一起
    • ✨2.2 类的访问控制(public、private、protect)
    • ✨2.3 实现类成员函数
  • 🎄三、对象(实例)
  • 🎄四、类作用域
    • ✨4.1 类作用域中的常量
  • 🎄五、总结


在这里插入图片描述

🎄一、概述

C++是面向对象编程的语言,编写C++代码是以类的形式来组织代码的,然后实例化一个个对象,让对象之间的交互来完成要做的事情。本文主要介绍C++中的自定义类型——类,以及怎么使用类去构建对象。

既然类是一种自定义类型,那么我们先了解一下什么是类型。类型主要完成下面三项工作:

  • 1、决定该类型的变量(对象)占用多少字节的内存:
    例如:int类型占用4个字节;short类型占用2个字节;char占用1个字节。
  • 2、决定怎样解释内存中的数据;
    例如:内存中存放着0xff这个数据,int类型和char类型对0xff的解释是不同的。
  • 3、决定该类型的变量(对象)可以执行哪些操作:
    例如:int类型的变量可以执行加减乘除等操作;而int*类型的变量一般不会执行乘法、除法的操作。

下面的内容将介绍类和对象。


在这里插入图片描述

🎄二、C++中的类

类是一种将抽象转换为用户定义类型的 C++工具, 它将数据表示和操纵数据的方法组合成一个整洁的包。

✨2.1 类将数据和函数组织在一起

如果你之前学过C语言,那么可能会觉得结构体会有点类似,它可以将多个数据组织在一起,但不同于C语言的结构体,类成员除了数据还可以是函数。定义一个类,可以使用class关键字。

class Animal
{int legs;int eye;void run(){cout << "Animal run" << endl;}
};

上面代码定义了一个类,将数据和函数放在同一个类中。


✨2.2 类的访问控制(public、private、protect)

类的成员有三种访问控制(public、private、protect),它们代表的含义如下:
1、public:标识的类成员公有的,这个类的对象可以直接访问;
2、private:标识的类成员私有的,这个类的对象不能直接访问,可以通过该类的公有成员间接地访问;
3、protect:标识的类成员受保护的,这个类的对象不能直接访问,可以通过该类的公有成员或该类的子类成员间接地访问。

另外注意一点,在C++中,类的默认访问控制权限是private的,结构体的默认访问控制权限是public的。所以前面小节定义的Animal类的几个成员都是私有的。虽然类的默认访问权限是private的,但为了强调数据隐藏的概念,还是建议显示地使用private关键字。

面向对象的一个特性就是封装,也就是数据隐藏和隐藏实现细节。所以,一般情况下,数据项通常放在私有部分(数据隐藏),实现细节相关的函数也放在私有部分(隐藏实现细节),而组成类接口的成员函数放在公有部分。

有了这些认识,我们对上个小节的 Animal 类做个小调整,

class Animal
{
private:int legs;int eye;public:void run() // 公有接口{cout << "Animal run" << endl;}
};

✨2.3 实现类成员函数

类成员函数一般在定义类时声明,然后将函数实现写在类定义之外。

类成员函数的几个特征:

  • 1、定义成员函数时,使用作用域解析运算符(::)来标识该成员函数所属的类,例如 run() 成员函数头如下:

    void Animal::run()
    

    这种表示法意味着run()Animal类的成员,还意味着我们可以将另一个类的成员函数命名为run()
    类成员函数的完整名称包括类名,而简单的run()是全名的缩写,只能在类作用域中使用。

  • 2、类成员函数可以访问类的 private 成员。

    class Animal{
    private:int legs;int eye;
    public:int legs() // 公有接口{return legs;}
    };
    
  • 3、定义位于类声明中的函数都将自动成为内联函数。如下面的run()函数会自动成为内联函数:

    class Animal{
    ...
    public:void run() // 公有接口{cout << "Animal run" << endl;}
    };
    

一般会将类声明放在头文件中,而将类成员函数实现放在源文件中,看下面例子:

#ifndef __ANIMAL_H__
#define __ANIMAL_H__#include <iostream>
using namespace std;class Animal
{
private:int legs;int eye;public:void run() // 公有接口{cout << "Animal run" << endl;}void SetLegs(int _legs);int GetLegs();
};#endif //__ANIMAL_H__
// g++ 08_Animal.cpp#include "08_Animal.h"void Animal::SetLegs(int _legs)
{legs = _legs;
}int Animal::GetLegs()
{return legs;
}int main()
{Animal animal;animal.run();animal.SetLegs(4);cout << "animal legs = " << animal.GetLegs() << endl;return 0;
}

在这里插入图片描述

🎄三、对象(实例)

类是用户自定义的类型,对象(如变量)是类的实例。

之前学习C语言时,通过类型定义出来的被成为变量。在面向对象编程中,通过类型(包括自定义类型)定义出来的被成为对象
例如下面的i、s、cAnimal都是对象:

int i = 0;
short s = 0;
Animal cAnimal;  // Animal类的对象

注意:所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。

为什么需要对象?
就像C语言需要变量一样,我们定义了一个类,需要通过对象(实例)来使用这个类。
C++的目标是使得使用类与使用基本的内置类型( 如 int 和 char ) 尽可能相同。

怎么创建对象?

Animal cAnimal; 
Animal *pAnimal = new Animal();

如上面代码,要创建类对象, 可以声明类变量, 也可以使用 new 为类对象分配存储空间。

怎么使用对象?

Animal cAnimal; 
Animal *pAnimal = new Animal();
cAnimal.run();
pAnimal->run();

要使用新类型, 最关键的是要了解成员函数的功能, 而不必考虑其实现细节。
如上代码,定义了对象后,可以使用 成员运算符( .->)来调用类的公有成员。


在这里插入图片描述

🎄四、类作用域

C++类引入了一种新的作用域: 类作用域

在类中定义的名称(如类数据成员名和类成员函数名)的作用域都为整个类,作用域为整个类的名称只在该类中是已知的, 在类外是不可知的。因此,可以在不同类中使用相同的类成员名而不会引起冲突。

另外, 类作用域意味着不能从外部直接访问类的成员,公有成员函数也是如此。也就是说,要调用公有成员函数,必须通过对象。

总之,在类声明或成员函数定义中,可以使用未修饰的成员名称(未限定的名称),如上面例子直接使用run();在其他情况下, 使用类成员名时, 必须根据上下文使用直接成员运算符(.)、 间接成员运算符(->) 或作用域解析运算符(::)。

下面的代码片段演示了如何访问具有类作用域的标识符:

#include <iostream>
using namespace std;class Animal
{
private:int legs;int eye;public:void run(){cout << "Animal run" << endl;}void SetLegs(int _legs);int GetLegs(){return legs;}
};void Animal::SetLegs(int _legs)// 作用域解析运算符(`::`)
{legs = _legs;
}int main()
{Animal animal;animal.run(); // 直接成员运算符(`.`)Animal *pAnimal = new Animal();pAnimal->run(); // 间接成员运算符(`->`) return 0;
}

✨4.1 类作用域中的常量

如果想在类中使用一个常量,直接使用下面代码是行不通的:

class Date
{	
public:const int Month_C = 12;	// 报错:invalid use of non-static data member ‘Date::Month_C’int mon_const[Month_C];
};

因为声明类只是描述了对象的形式,并没有创建对象,在创建对象前, 将没有用于存储值的空间。

可以使用下面两个方法在类中声明常量:

  • 1、在类中声明一个枚举:
    在类中声明一个枚举并不会创建数据成员,所以也不需要对象的存储空间。代码如下:
    class Date
    {	
    public:enum {Month_E = 12};int mon[Month_E];
    };
    
  • 2、使用关键字 static,定义属于整个类的常量:
    下面代码将创建一个名为 Month_C 的常量,该常量将与其他静态变量存储在一起,而不是存储在对象中。该常量被所有 Date 对象共享。
    class Date
    {	
    public:static const int Month_C = 12;	// 报错:invalid use of non-static data member ‘Date::Month_C’int mon_const[Month_C];
    };
    

上面例子完整代码:

#include <iostream>
using namespace std;class Date
{	
public:enum {Month_E = 12};//const int Month_C = 12;	// 报错:invalid use of non-static data member ‘Date::Month_C’static const int Month_C = 12; // 属于整个类int mon[Month_E];int mon_const[Month_C];
};int main()
{Date date;cout << Date::Month_E << endl;cout << Date::Month_C << endl;cout << "Date=" << sizeof(Date) << "date="<< sizeof(date)<< endl;return 0;
}

运行结果如下,整个类的大小为96,可以看出这两种方法都不会占用到类的空间。
在这里插入图片描述


在这里插入图片描述

🎄五、总结

👉本文简单介绍C++中类的访问控制、实现成员函数、对象的创建和使用、类作用域、类作用域的常量等知识点。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
《C++ priper plus》

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

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

相关文章

存在 ZooKeeper 未授权访问【原理扫描】--通过防火墙策略进行修复

ELK集群存在 ZooKeeper 未授权访问【原理扫描】 10.xx.xx.115; 10.xx.xx.98; 10.xx.xx.110; 10.xx.xx.6; 10.xx.xx.95; 1、启动firewalld服务并设置开机自动启动&#xff0c;下面的命令必须在防火墙开启的状态下才可用&#xff0c;由于firewalld默认不是放行所有端口&#xf…

nn.Sequential 和 nn.ModuleList

在 PyTorch 中&#xff0c;nn.Sequential 和 nn.ModuleList 都是用来容纳多个子模块的容器&#xff0c;但它们的用途和行为有所不同。以下是它们的用法和区别的详细解释&#xff0c;以及样例代码。 nn.Sequential nn.Sequential 是一个顺序容器&#xff0c;模块将按它们在传递…

重学java 57.哈希表结构存储过程

别焦虑&#xff0c;生活无非见招拆招 —— 24.6.3 哈希表存储数据去重复的过程: a.先比较元素的哈希值(重写hashCode),再比较内容(重写equals) b.如果哈希值不一样,证明内容不一样,存 c.如果哈希值一样,再比较内容 如果哈希值一样,内容不一样(哈希碰撞,哈希冲突),存 如果哈希值…

Vue3-VueRouter

客户端 vs. 服务端路由​ 服务端路由指的是服务器根据用户访问的 URL 路径返回不同的响应结果。当我们在一个传统的服务端渲染的 web 应用中点击一个链接时&#xff0c;浏览器会从服务端获得全新的 HTML&#xff0c;然后重新加载整个页面。 然而&#xff0c;在单页面应用中&a…

03-3.2.1 队列的基本概念

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

(文章复现)基于共享储能服务的智能楼宇双层优化配置

参考文献&#xff1a; [1]张浩鹏,李泽宁,薛屹洵,等.基于共享储能服务的智能楼宇双层优化配置[J/OL].中国电机工程学报,1-12[2024-05-22]. 1.摘要 为降低城市化进程中楼宇储能投资成本&#xff0c;提出一种基于共享储能服务的智能楼宇&#xff08;Intelligent Buildings&#…

mysql启动出现Error: 2 (No such file or directory)

查看mydql状态 systemctl status mysqlThe designated data directory /var/lib/mysql/ is unusable 查看mysql日志 tail -f /var/log/mysql/error.logtail: cannot open ‘/var/log/mysql/error.log’ for reading: No such file or directory tail: no files remaining 第…

【数智化CIO展】吉家宠物CIO张志伟:深度挖掘数据价值是数字化发展趋势,才能实现企业精细化运营...

张志伟 本文由吉家宠物CIO张志伟投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级优秀CIO》榜单/奖项评选。丨推荐企业&#xff1a;观远数据 大数据产业创新服务媒体 ——聚焦数据 改变商业 中国“宠物经济”热潮不断攀升&#xff0c;国内宠物市场的竞…

【牛客面试必刷TOP101】Day28.BM49 表达式求值和BM52 数组中只出现一次的两个数字

文章目录 前言一、BM49 表达式求值题目描述题目解析二、BM52 数组中只出现一次的两个数字题目描述题目解析总结 前言 一、BM49 表达式求值 题目描述 描述&#xff1a; 请写一个整数计算器&#xff0c;支持加减乘三种运算和括号。 数据范围&#xff1a;0∣s∣≤100&#xff0c;…

香蕉派BPI-F3 进迭时空(SpacemiT)K1RISC-V开发板软件下载链接

香蕉派BPI-F3是一款工业级 8核RISC-V开源硬件开发板&#xff0c;它采用进迭时空&#xff08;SpacemiT&#xff09; K1 8核RISC-V芯片设计&#xff0c;CPU集成2.0 TOPs AI计算能力。4G DDR和16G eMMC。2个GbE以太网接口&#xff0c;4个USB 3.0和PCIe M.2接口&#xff0c;支持HDM…

跟着小白学linux的基础命令

小白学习记录&#xff1a; 前情提要&#xff1a;Linux命令基础格式!查看 lsLinux 的7种文件类型及各颜色代表含义 进入指定目录 cd查看当前工作目录 pwd创建一个新的目录(文件夹&#xff09; mkdir创建文件 touch查看文件内容 cat、more操作文件、文件夹- 复制 cp- 移动 mv- 删…

代码随想录算法训练营第四十八天| 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 题目链接&#xff1a;70. 爬楼梯 &#xff08;进阶&#xff09; 文档讲解&#xff1a;代码随想录/爬楼梯 &#xff08;进阶&#xff09; 状态&#xff1a;已完成&#xff08;0遍&#xff09; 解题过程 这几天博主忙着面试和入职&am…

25-unittest执行顺序

在使用unittest框架时&#xff0c;各个测试方法的执行顺序是怎样的&#xff0c;本篇通过简单案例讲解unittest执行顺序。 一、定义测试类 import unittestclass Demo(unittest.TestCase):def setUp(self):print("start!")def tearDown(self):print("end!"…

前端工程化工具系列(八)——Commitizen(v4.3.0):Git 提交规范化工具

在 前端工程化工具系列&#xff08;四&#xff09;—— Commitlint(v19.3.0)&#xff1a;规范化 Git 提交 中曾介绍过 commitlint&#xff0c;它主要负责检查提交信息的规范性。而本文中的 commitizen&#xff0c;则是提供给了一个交互式的命令行界面&#xff0c;引导开发者按照…

度安讲 | 第二期「安全左移·业务护航」技术沙龙成功举办

当下&#xff0c;“安全左移”作为落地DevSecOps的重要实践之一&#xff0c;已在业界达成共识。DevSecOps作为一种集开发、安全、运维于一体的软件开发和运营模式&#xff0c;强调在敏捷交付下&#xff0c;“安全”在软件开发生命周期的全覆盖贯穿和核心位置。所谓“安全左移”…

Git命令行

文章目录 初始化配置仓库 其实Idea里自带的命令能满足工作多数场景&#xff0c;但也会使思维受限&#xff0c;总结下Git里常用的命令行对Idea进行补充 初始化配置 # 查看git配置&#xff08;重点关注账号和邮箱&#xff09; git config --list# 设置全局姓名和邮箱 git config…

不同类型红酒的保存期限与品质变化

云仓酒庄雷盛红酒&#xff0c;以其多样的品种和与众不同的风味吸引了无数葡萄酒爱好者。然而&#xff0c;不同类型和风格的红酒在保存过程中&#xff0c;其期限和品质变化也各不相同。本文将深入探讨这个问题&#xff0c;以帮助消费者更好地理解和欣赏云仓酒庄雷盛红酒的多样性…

【Linux】Linux环境基础开发工具_5

文章目录 四、Linux环境基础开发工具Linux小程序---进度条git 未完待续 四、Linux环境基础开发工具 Linux小程序—进度条 上篇我们实现了一个简易的进度条&#xff0c;不过那仅仅是测试&#xff0c;接下来我们真正的正式实现一个进度条。 接着编写 processbar.c 文件 然…

web刷题记录(4)

[GKCTF 2020]cve版签到 进来应该是给了个提示了&#xff0c;就是要以.ctfhub.com结尾 还有一个超链接&#xff0c;这题的ssrf还是挺明显的&#xff0c;抓包看看 发现回显里面有提示 说是和本地有关&#xff0c;那么也就是说&#xff0c;要访问127.0.0.1&#xff0c;大概意思就…

ModuleNotFoundError: No module named ‘torch_scatter‘

大概率是cuda的版本问题&#xff0c;看了很多解决方案&#xff0c;都不舒服。 直到看到这篇 新建一个名字叫torch_scatter.py的脚本&#xff0c;然后就可以调用本地的脚本了。 #torch_scatter.py import torch from typing import Optionaldef scatter_sum(src: torch.Tenso…