【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,一经查实,立即删除!

相关文章

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

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

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

参考文献&#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- 删…

25-unittest执行顺序

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

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

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

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

云仓酒庄雷盛红酒&#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;大概意思就…

镜头效果技术在AI绘画中的革新作用

随着人工智能技术的飞速发展&#xff0c;AI绘画已经成为艺术与科技交汇的前沿领域。在这一领域中&#xff0c;镜头效果技术的应用不仅为艺术家和设计师们提供了全新的创作工具&#xff0c;更在艺术创作中扮演了革命性的角色。本文将深入探讨镜头效果技术在AI绘画中的应用&#…

Visual Studio和BOM历史渊源

今天看文档无意间碰到了微软对编码格式解释&#xff0c;如下链接&#xff1a; Understanding file encoding in VS Code and PowerShell - PowerShell | Microsoft LearnConfigure file encoding in VS Code and PowerShellhttps://learn.microsoft.com/en-us/powershell/scrip…

【机器学习】使用Stable Diffusion实现潜在空间搜索

1、引言 1.1 潜在空间的概念 潜在空间&#xff08;Latent Space&#xff09;是在机器学习和深度学习中一个重要的概念&#xff0c;它指的是用于表示数据的一种低维空间。这个空间编码了数据中包含的所有有用信息的压缩表示&#xff0c;通常比原始数据空间的维数更低&#xff…

QT快速下载

去QT官网之后&#xff0c;如下图所示 比如要下载qt-opensource-windows-x86-5.14.2.exe&#xff0c;进入5.14对应的文件夹&#xff0c;找到对应的版本 点击Details&#xff0c; 下载对应的种子&#xff0c;然后通过迅雷下载 个人实测&#xff0c;家庭网络平均18M的速率

vs2022专业版永久密钥

vs2022专业版永久密钥&#xff1a; vs2022专业版永久密钥&#xff1a; Visual Studio 2022 Enterprise&#xff1a;VHF9H-NXBBB-638P6-6JHCY-88JWH Visual Studio 2022 Professional&#xff1a;TD244-P4NB7-YQ6XK-Y8MMM-YWV2J

numpy的基本使用

一、NumPy 的主要特性和功能&#xff1a; 多维数组对象&#xff08;ndarray&#xff09;&#xff1a; NumPy 的核心是 ndarray 对象&#xff0c;它是一个多维数组&#xff0c;可以存储相同类型的元素。ndarray 对象具有固定大小&#xff0c;支持矢量化运算和广播功能&#xff0…

Datetime,一个 Python 的时间掌控者

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 一个简单的库&#xff0c;也许能够开启我们的智慧之门&#xff0c; 一个普通的方法&#xff0c;也许能在危急时刻挽救我们于水深火热&#xff0c; 一个新颖的思维方式&#xff0c;也许能…

精选网络安全书单:打造数字世界的钢铁长城!

目录 1.前言 2.书单推荐 2.1. 《内网渗透实战攻略》 2.2. 《Kali Linux高级渗透测试&#xff08;原书第4版&#xff09;》 2.3. 《CTF那些事儿》 2.4. 《权限提升技术&#xff1a;攻防实战与技巧》 2.5. 《数字政府网络安全合规性建设指南&#xff1a;密码应用与数据安全…