欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > 【C++】类和对象(一)定义、访问限定符、实例化、对象大小、this指针

【C++】类和对象(一)定义、访问限定符、实例化、对象大小、this指针

2025/3/21 14:17:01 来源:https://blog.csdn.net/2302_79531041/article/details/146406648  浏览:    关键词:【C++】类和对象(一)定义、访问限定符、实例化、对象大小、this指针

文章目录

  • 1、类的定义格式
  • 2、访问限定符
  • 3、类域
  • 4、类的实例化
  • 5、对象的大小
  • 6、this指针
  • 7、谢谢观看!

1、类的定义格式

在这里插入图片描述

其中class为定义类的关键字,jyan为类的名字,{}中为类的主体。
注意类定义结束时不能省略后面的分号。

类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数
为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加_或者 m开头,注意C++中这个并不是强制的,只是一些惯例,具体看公司的要求。
C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是struct中可以定义函数,一般情况下我们还是推荐用class定义类。定义在类面的成员函数默认为inline(内联函数)。

2、访问限定符

三种访问限定符:public 、 protected、 private。
说明:public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,目前来说,protected和private是一样的,以后继承章节才能体现出他们的区别。

  • 限定范围:访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到 } 即类结束。
  • class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
  • 一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。

在这里插入图片描述
由于,C++中可以使用struct来定义类,这里来和C语言做一个区分:
在这里插入图片描述
(C++兼容C语言,故在C++中,以上两种方式均可)

3、类域

  • 类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。
  • 类域影响的是编译的查找规则,不影响生命周期。

4、类的实例化

一个类可以实例化多个对象。
类比盖房子,类就像是一个房子的设计图,而对象就是根据设计图而盖的房子,工程者可以根据图纸盖出多座框架相同的房子。
类定义了实例化的对象具有哪些属性,但图纸不是具体的房子,还不能住人。只有实例化成对象后,才可以住人!

5、对象的大小

类的对象大小和C语言基本相同,均要遵循内存对齐规则:

  • 第一个成员在与结构体偏移量为0的地址处。
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
  • 注意:对齐数=编译器默认的一个对齐数 与 该成员大小的较小值。
  • VS中默认的对齐数为8
  • 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
    (C语言篇已详细讲解,这里不过多赘述)

为什么要内存对齐?
空间换时间,方便查找:cpu读取内存中的数据时,不是从任意位置开始读,现代处理器通常以 字长(如32位系统为4字节,64位系统为8字节)为单位访问内存。(主要原因)

注:没有成员变量类对象的大小是1,为什么没有成员变量还要给1个字节呢? 因为如果一个字节都不给,无法表示对象存在过!所以这里给1字节,纯粹是为了占位标识对象存在。

6、this指针

引入:请看以下代码

#include <iostream>
using namespace std;//类
class jyan
{//声明,不开空间int _year;int _month;int _day;//方法
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
};int main()
{jyan aa;aa.Init(2025,3,20);aa.Print();jyan bb;bb.Init(2025, 3, 21);bb.Print();return 0;
}

问:jyan类中有 Init 与 Print两个成员函数,函数体中没有关于不同对象的区分,那当aa调用Init和Print函数时,该函数是如何知道应该访问的是aa对象还是bb对象呢?
答:C++给了一个隐含的this指针解决这里的问题。

  • 编译器编译后,类的成员函数默认都会在形参第一个位置,增加一个当前类类型的指针,叫做this指针。比如jyan类的Init的真实原型为,void Init( jyan*const this,int year,int month,int day)
  • 类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值,this->_year = year;
  • C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。

在这里插入图片描述
传了地址,就可以准确知道对应的参数的值。
而函数里面的访问是通过this访问的,只是被隐含了:
在这里插入图片描述
this指针可以在函数体内使用,但不可以在参数部分使用!
this指针存放在栈帧中

7、谢谢观看!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词