首页 > 编程语言 >C++-类和对象(1)

C++-类和对象(1)

时间:2024-01-19 21:32:40浏览次数:36  
标签:函数 对象 成员 C++ 访问 指针 定义

引言:

C++语言兼容C语言的基础上,更多的是面向对象进行编程,即相较于事务处理的流程,更侧重于处理过程中涉及到的类以及对象。今天向大家分享C++中的类与对象相关知识。

1.类的定义:

常使用class关键字定义一个类:由两部分构成,分别是成员属性成员函数

class className //类名
{
   //成员属性
   
   //成员函数
   
};

其实C++的的结构与C语言中的结构体有部分相似之处,不同的是C语言中的结构体不支持在结构体内部定义成员函数,而C++中的类包括成员属性和成员函数两部分。(其实C++中的类也可以用struct关键字来定义,但这两个不同的关键字在定义一个类时有差别,具体细节在后面~)

2.类的定义方式:

类的定义方式有两种:两种方式成员属性均在类中定义,不同之处在于成员函数的定义。

  • 成员函数声明和定义不分离
  • 成员函数声明和定义分离(xx.h、xx.cpp)

第二种方式注意定义成员函数时要使用类作用域限定符“::”来声明当前函数的所属域,从而与全局函数进行区分,实际上类的定义在某种程度上也可以理解为是一个域范围的限定。

3.类域:

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类外定义成员时,需要使用作用域限定符“::”操作符指明成员属于哪个类域,例如上面提到的成员函数定义和声明分离时,需要指定定义函数的所属域。

例如:定义一个类A,成员函数定义和声明分离

C++-类和对象(1)_this指针

C++-类和对象(1)_类_02

4.类的访问限定符:

类的访问限定符有:public(公有)、protected(保护)、private(私有)

C++的三大特征分别为封装、继承、多态。封装的一部分目的也是为了控制访问权限,例如一个类的成员属性通常不希望我们直接在类外面进行直接访问修改,通常期望我们通过类中的成员函数对成员属性进行访问或修改,则可为成员设置访问限定符,起到访问权限控制的作用。

4.1各访问限定符的权限控制说明:

1.public修饰的成员在类外可以直接被访问

2.protectedprivate修饰的成员在类外不能直接被访问

4.2使用访问限定符注意:

1.访问权限作用域为:从该访问限定符出现的位置开始到下一个访问限定符出现时为止。

2.如果后面没有访问限定符,作用域到类结束。

3.class的默认访问权限为private,struct为public(struct要兼容C语言)

4.3 C++中struct和class区别

C++-类和对象(1)_C++_03

C++语言兼容C语言,所以C++中的struct关键字仍可以用于定义一个结构体,同时在C的基础上,C++中struct还可以连同class关键字用于定义类,但这两个关键字在定义类时存在区别,struct定义的类成员默认访问权限是public,而class定义的类成员默认访问权限是private。

5.类的实例化

类只是某种类型数据组合的抽象,而实例化可以获取一个个具体的类的对象。

即类的定义可以理解为声明,实际是不占物理存储空间的,而实例化出的对象实际占用物理空间。

5.1类实例化定义:

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

5.2实例化举例:

实例化一个类A的对象:

C++-类和对象(1)_this指针_04

6.类的大小:

虽然类的成员既有成员属性,又有成员函数,但类的大小绝大多数情况都是类的大小即为类的全体成员属性大小(类的全部成员属性大小计算需要遵守结构体计算时的对齐规则,可以参照上一篇博客)。

但是存在一些特殊情况,例如一个类中只有成员函数,没有成员属性,为了占位,此时类的大小为1byte。如下图示:

C++-类和对象(1)_类_05

通过类的大小计算,可以得出,类的成员函数并不在类中存储,类的成员函数存在代码段中,因为同一类的每个实例化对象只是成员属性的属性值不同,但是对这些成员属性的操作-即成员函数,是一致的,是可以共享的。所以将对成员属性处理的成员函数存入代码段。

7.类-this指针

通过类的大小计算,可以看到成员函数并不存储在成员类中,而是由实例化后的具体对象去调用函数,那么如果实例化了一个以上的类对象,在对象调用成员函数时,成员函数是如何得知调用者是哪一个对象呢?这就要介绍类中的一个重要概念-this指针

C++编译器给每个非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前调用成员函数的对象,在函数体中所有“成员变量“的操作,都是通过该指针去访问。只不过操作对用户是透明的,即用户不需要来传递,编译器自动完成。

即引入指向调用成员函数的类对象的指针,作为隐藏参数传给非静态成员函数。

但是通过前面对类大小的计算,可以得知,this指针并不存在类中,实际上,作为形参,this指针一般存在栈区。并且this指针可以为空。

7.1this指针使用注意:

1.在成员函数中可以显示使用this指针,但不能给this指针赋值。

2.this指针作为隐含形参的传递是由编译器自动传递的,无需使用者传递。


以上就是今天分享的全部内容,如果文章有表达不当之处或错误,欢迎在评论区指出或者私信小Q,希望今天的内容能对大家的学习有所帮助,下篇向大家分享类的6个默认成员函数,下篇博客见^-^。

标签:函数,对象,成员,C++,访问,指针,定义
From: https://blog.51cto.com/u_16191221/9336630

相关文章

  • 面向对象的三大特征
    面向对象的三大特性封装packagecom.zzl.oop2.Demo1.Demo4;//类private:私有publicclassStudent1{//名字privateStringname;//学号privateintid;//性别privateStringsex;privateintage;//提供一些可以操作属性的方法......
  • 细说JavaScript BOM之window常用子对象
    一、locationlocation翻译过来就是位置的意思,打开浏览器窗口大家可以看到导航栏上有一个URL地址。//例如https://www.zhishunet.com//分心可知,它使用的网络协议是https服务器名称是www,zhishunet.comlocation常用对象属性属性描述search设置或返回从问好(?......
  • [Java SE/JDK] Map之重定义key对象的hash值
    0序言项目上有个场景:数据源连接池需要对key对象的hash值重写,保证通过相同的关键属性(datasourceName)值去重不同的对象。publicabstractclassAbstractDatabaseConnectorKeyedObjectPool<KextendsDataSource,VextendsAbstractConnector>1重写Map的key对象的hash值......
  • C++中对象作为函数参数进行传参
    在C++语言环境中,对象是类的一个实例。 有三种方式:1、直接使用对象作为函数参数,形参和实参是不同的对象,它们所占地址空间不同,因此形参的改变并不影响实参的值。2、传入指向对象的指针作为函数参数,所谓“传址调用”,就是在函数调用时使用实参对象的地址,形参和实参都指向同一个地......
  • 车载视频JT1078协议视频接入(C++)
    把之前做的JT1078协议车载视频接入进行文档整理如下:-----------------------------------------------------------------------------------------------一。背景;平台能够通过jt808协议接入车辆GPS定位信息的基础上,扩展车载视频JT1078协议的接入。实现车辆位置信息和视频信......
  • 【计算机算法设计与分析】罗密欧与朱丽叶的迷宫问题(C++_回溯法)
    文章目录题目描述测试样例算法原理算法实现参考资料题目描述罗密欧与朱丽叶的迷宫。罗密欧与朱丽叶身处一个mxn的迷宫中,如图所示。每一个方恪表示迷宫中的一个房间。这mxn个房间中有一些房间是封闭的。不允任何人进入。在迷宫中任何位置均可沿8个方向进入未封闭的房间。罗密......
  • C++ Qt开发:Charts与数据库组件联动
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍Charts组件与QSql数据库组件的常用方法及灵活运用。在之前的文章中详细介绍了关于QCharts绘图组件......
  • 第26节: Vue3 绑定到对象
    在UniApp中使用Vue3框架时,你可以使用对象绑定语法将属性绑定到对象上。下面是一个示例,演示了如何在UniApp中使用Vue3框架使用绑定到对象:<template><view><button@click="toggleActive">ToggleActive</button><div:style="{color:activeColor,fontWeight:......
  • C/C++ 实现动态资源文件释放
    当我们开发Windows应用程序时,通常会涉及到使用资源(Resource)的情况。资源可以包括图标、位图、字符串等,它们以二进制形式嵌入到可执行文件中。在某些情况下,我们可能需要从可执行文件中提取自定义资源并保存为独立的文件。在这篇博客文章中,我们将讨论如何使用C++和WinAPI实现这个目标......
  • C++ 邮件槽ShellCode跨进程传输
    在计算机安全领域,进程间通信(IPC)一直是一个备受关注的话题。在本文中,我们将探讨如何使用Windows邮件槽(Mailslot)实现ShellCode的跨进程传输。邮件槽提供了一种简单而有效的单向通信机制,使得任何进程都能够成为邮件槽服务器,并通过UDP通信向其他进程发送数据。邮件槽是Windows操作系统......