【C++】对象与类

news2024/12/24 20:14:33

【C++】对象与类

文章目录

  • 【C++】对象与类
    • 1、定义
      • 1.1 对象的定义
      • 1.2 类的定义
    • 2、对象与类的创建
      • 2.1 类的创建
      • 2.2 对象的创建
    • 3、封装
      • 3.1 访问限定符
      • 3.2 对封装的解释
    • 4、类的实例化
    • 5、类、对象大小
    • 6、this指针
      • 6.1 this指针概念
      • 6.2 this指针特点

1、定义

1.1 对象的定义

现实世界对对象的定义是:行动或思考时作为目标的事物

在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。

在C++中,每个对象都是由数据和操作代码(通常用函数实现)组成的。

1.2 类的定义

类是一种自定义类型

是用来对对象进行描述的**(对象有什么属性,有什么功能)**

image-20230203173431271

2、对象与类的创建

2.1 类的创建

C++中定义类型有两个关键词:

  • struct
  • class

类型定义格式:

class 类名//或是 struct 类名
{
    //类体 :成员变量(属性)  成员函数(功能)
};

C++中的 struct(类)和结构体不同的是:除了可以定义成员变量(变量)还可以成员函数(函数)成员函数可以访问成员变量但是如果成员函数中的形参和成员变量相同 :

struct Stu
{
    void init(const char* name, int age, int id) 
    {
        ...
    }
    
	char _name[10];
	int _age;
	int _id;//加上_是为了区分形参和成员变量
};

类定义了一个新的作用域,类的所有成员都在类的作用域中

在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域

test.cpp:

#include<tools.h>//另有编写tools.h,内有类型newmem,内有成员函数testmember(),现向其中添加成员

void newmem :: testmember()
{
    ...//添加的成员列表
}

2.2 对象的创建

类名 * 对象指针变量;
对象指针变量 = new 类名;

name * p;
p = new name;

//删除对象
delete p;
  1. new运算分配得到的是对象的起始地址,程序通过这个起始地址间接访问对象,因此需要先定义一个指向类的对象的指针变量

  2. 执行new运算时,如果内存空间不足,则会返回一个0值指针,因此,只要检测返回值是否为0就可以判断动态分配对象是否成功,只有指针有效时才

能使用对象指针

  1. 释放p所指向的对象之后,不能再使用该对象
  2. new建立的动态对象不会被自动撤销,即使程序运行结束也是如此,必须认为使用delete撤销

3、封装

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

封装的特性:

  1. 在类中,类的数据和方法都放到一起
  2. 访问限定符

3.1 访问限定符

image-20230203204651021

访问限定符限制类外操作,对于类中则不限定,类里可以全局访问

  1. public修饰的成员在类外可以 直接被访问
  2. protected 和 private 修饰的成员在类外不能直接被访问(它们类似,但本质不一样)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)
  6. 默认访问限定符,即不写时,类中的默认访问权限;一般在定义类时,建议明确定义访问限定符 ,不要用 class/struct的默认限定

注意:

  1. struct定义的类:成员默认的访问权限是public
  2. class定义的类:成员默认的访问权限是private

3.2 对封装的解释

封装是一种更好的严格管理,不封装是一种自由管理

封装就是让数据和方法揉搓在一起,进行 严格 的管理。对于 C 是不封装的,是一种较 松散 的管理。C++ 是将数据和方法封装到类里面,C 是数据和方

法分离的(数据访问控制是自由的,不受限制的)

通过类将数据进行封装,我们不能直接访问类的属性,只能通过调用类中的方法来实现对对象属性功能的访问

封装的好处:

可以提高代码的安全性,当程序很大的时候,一个程序员可能只负责某一个模块,程序员将自己所写的程序进行封装,然后只对主函数提供几个接口(主

函数可以调用的方法),那么在调试的过程中,编程人员可以很快的找到代码错误的地方,提高了代码的可维护性)

4、类的实例化

用类类型创建对象的过程,称为类的实例化

类是对 对象 进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它

  • 对于类创建出来的对象,可以访问类中成员;但是对于类本身,是不能访问成员与方法的
  • 对于类仅仅起 描述作用 而已,真正使用还是要类对象 。而我们可以认为类这些代码存在代码段,是公共的
  • 类实例化出来的对象,占用实际的物理空间,储存类变量

5、类、对象大小

对象中包含了那些成员以及我们如何去求一个对象的大小?

效果上:对象中既有成员函数,又有成员变量然而成员函数,没有必要每个对象中都存储一份,如果每个对象都存储,会让对象的存储变得很大

实际上:对象只存储成员变量

求对象的大小时,注意内存对齐

如果是空类或者是没有成员变量只有成员函数的类创建的对象,编译器为了区分各个实体对象,分别会给予一定的空间。主流编译器对空类和对有成员变量的类创建的对象分配了一个字节

6、this指针

6.1 this指针概念

c++通过引入this指针,编译器给每一个“非静态的成员函数”增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数的对象)

在每一个成员函数体内所有成员变量的操作,都是通过该指针去访问

只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

6.2 this指针特点

  1. this指针的类型:类类型*const,即成员函数中,不能给this指针赋值。
  2. 只能在成员函数内部使用
  3. this指针本质上其实是一个成员函数的第一个形参,是对象调用函数时,将对象的地址作为实参传给this指针,,所以对象中不存储this指针。
  4. this指针是一个隐含指针形参,一般情况下由编译器自动传递。
  5. this指针存放在栈上(因为this指针是一个隐含指针形参)
  6. this 指针可以为空,this指针的类型为类类型*const,即指针变量为常量。我们可以在类外部定义一个类类型指针,将该指针初值为空 ,然后将其作为实参传入this指针形参中。
  7. 当this指针为空时,如果成员函数没有调用成员变量,那么代码不会崩溃,否则代码就会崩溃。

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

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

相关文章

写哪个IB科目的EE最易得A?

综合了IB论坛上学生的建议&#xff0c;根据IB毕业生们的看法&#xff1a; E同学&#xff1a;选择你感兴趣的科目写EE。 R同学&#xff1a;我推荐写IB英语EE&#xff0c;在我看来&#xff0c;英语很容易找到你感兴趣的内容&#xff0c;因为英语 EE 适用于诸多的不同主题。我觉得…

录制PPT课件哪个录屏软件好?这3款值得收藏

使用PPT课件进行教学&#xff0c;不仅可以让抽象的知识具体化&#xff0c;还可以让课堂变得更加生动有趣。在制作视频课程时&#xff0c;需要对PPT课件进行录制&#xff0c;那你知道录制PPT课件哪个录屏软件好吗&#xff1f;今天小编就给大家介绍3款值得收藏的录屏软件&#xf…

为什么GIF文件是图像文件而不是视频文件?(GIF文件格式详解)

今天整理硬盘的时候想到一个问题&#xff1a;GIF 是放在静态图像文件里还是视频文件里&#xff1f; 因为放视频里吧&#xff0c;GIF 的分类是静态图像&#xff0c;而且由图像组成&#xff1b;放图像里吧&#xff0c;它又会动。 然后我就开始想&#xff1a;GIF 会动但为什么被归…

分享113个图片切换JS特效,总有一款适合您

分享113个图片切换JS特效&#xff0c;总有一款适合您 113个图片切换JS特效下载链接&#xff1a;https://pan.baidu.com/s/1NNSP-DMf3n0PeNbdNd8jEg?pwdsfwr 提取码&#xff1a;sfwr Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj jQuery中间…

Java基础学习笔记(十九)—— 多线程

多线程1 多线程相关概念2 多线程的实现方式2.1 继承Thread类2.2 实现Runnable接口2.3 实现Callable接口3 线程休眠4 线程优先级5 守护线程6 线程同步6.1 案例引入6.2 同步代码块6.3 同步方法6.4 Lock锁6.5 死锁1 多线程相关概念 并行与并发&#xff1a; 并行&#xff1a;在同…

未授权和敏感文件泄露

目前存在未授权访问漏洞的服务主要 包括&#xff1a;NFS、Samba、LDAP、Rsync、FTP、GitLab、Jenkins、 MongoDB、Redis、ZooKeeper、ElasticSearch、Memcache、CouchDB、 Docker、Solr、Hadoop等。 redis未授权 通过手工进行未授权访问验证&#xff0c;在安装Redis服务的Kal…

MATLAB 线性整数规划

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

oracle官网下载指定版本的jdk

文章目录前言下载JDK环境变量前言 oracle官网下载jdk&#xff0c;如果是想下载指定版本的&#xff0c;总是提示需要你登录。如何解决呢&#xff1f; 下载JDK oracle官网 https://www.oracle.com 或者直达此页 https://www.oracle.com/java/technologies/downloads/archive…

springboot相关

2023.2.3 springboot的示例sagan涉及到很多软件技术&#xff0c;运行这个示例在Windows 7下遇到问题。将Windows 7重装为Windows 10专业版。下载了node-v18.14.0-x64.msi&#xff0c;安装node时可以选择安装相关的软件&#xff0c;例如python 3.11.0。下载python 3.11.0太慢了…

07、微服务组件Seata

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成。事务应该具有4个属性&#xff1a;原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性&#xff08;ato…

正则表达式记录

正则用途:分割 查找 匹配 替换 1 * ?的区别 *代表匹配任意次, 包括0,1,多次代表匹配最少一次, 1或者多次?代表匹配最多1次,0,1次 2 单次边界(\b和\B) 2.1 定义 首先说一下零宽: 只匹配位置, 不匹配字符, 然后我们再来谈单词边界: 何谓单词? 在JS中, 单词的定义就是\w也…

Python中的字典

1. 前言 字典&#xff0c;是Python中唯一实现了映射关系的内置类型。 2.映射关系 摩斯密码就是通过映射关系来实现的。 这里的字母 A 和 .- 就是其中的一对映射关系&#xff0c;字母 U 和 …- 又是另一对映射关系&#xff0c;那么有了这张表&#xff0c;破解莫斯密码就不再…

矩阵相关的性质

矩阵相关的计算性质1.矩阵的某一行*一个常数2.矩阵的一行加(减)另一行3.交换矩阵的两行两个未知数两个方程线程方程组解的结构以几何的角度查看矩阵的方式初等矩阵采用初等变换的方式在矩阵的元素中进行操作 相关的性能的变化采用点阵的乘法&#xff0c;在矩阵的维度进行处理将…

DeepLabV3+:ASPP加强特征提取网络的搭建

目录 ASPP结构介绍 ASPP在代码中的构建 参考资料 ASPP结构介绍 ASPP&#xff1a;Atrous Spatial Pyramid Pooling&#xff0c;空洞空间卷积池化金字塔。 简单理解就是个至尊版池化层&#xff0c;其目的与普通的池化层一致&#xff0c;尽可能地去提取特征。 利用主干特征提取…

低代码开发——创新赋能企业办公模式转变

近年来&#xff0c;国内云计算高速发展、SAAS 软件模式快速普及、企业数字 化的需求增长等方面促进了低代码平台开发与应用的高速发展&#xff0c;使之成为继 RPA之后企业数字化转型的明星工具。如果说RPA 将线上流程自动化&#xff0c;那么低代码解决了更基础的问题&#xff…

微信小程序 java Springboot大学生心理健康测试职位推荐系统

心理测试学生端要求在系统的安卓手机上可以运行&#xff0c;主要实现了线上考试测试等相关信息的查看&#xff0c;并且根据需求进行对管理端&#xff1b;首页、个人中心、学生管理、职业职位管理、职位申请管理、活动类型管理、活动项目管理、活动报名管理、试卷管理、试题管理…

Python算术运算符

Python算术运算符以下假设变量&#xff1a; a10&#xff0c;b20&#xff1a;运算符描述实例加 - 两个对象相加a b 输出结果 30-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200/除 - x除以yb / a …

C++内联函数:那时我还太年轻,并不知道使用inline带来的效率,早已在暗中标好了价格

&#x1f451;专栏内容&#xff1a;C学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 文章目录一、前言二、内联函数1、起源2、概念三、与宏的区别1、宏的缺点2、两者区别四、内联函数的代价代价一&#xff1a;可执…

1.DjangoRestFramework【前后端分离项目搭建】

1.使用cmd创建项目 在你需要创建项目的文件夹中打开cmd,进入对应的Django的虚拟环境中输入下面语句: django-admin startproject drfproject然后使用pycharm打开项目 2.创建子apps 在tirminal中输入: python manage.py startapp user python manage.py startapp shop3.注册…

博途1200PLC/1500PLCMODBUS从站通信应用(MB_SLAVE指令)

博途PLC作为MODBUS主站通信请参看下面的文章链接: 博途PLC 1200/1500PLC MODBUS-RTU通讯优化(状态机编程)_博途plc modbus-rtu通信优化_RXXW_Dor的博客-CSDN博客博途PLC 1200/1500PLC MODBUS-RTU通讯_RXXW_Dor的博客-CSDN博客_博图modbus通讯1、1200PLC的modbus通讯,可以参看…