首页 > 编程语言 >C++类与对象——基础知识

C++类与对象——基础知识

时间:2025-03-13 16:26:05浏览次数:3  
标签:存储 函数 对象 成员 C++ 基础知识 访问 对齐

目录

1.访问限定符:

2.类域:

3.实例化:

4.类与对象的大小

5.this指针


类的关键字是class,类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

类与对象有三大特性:封装,继承和多态。C++用类将对象的属性与方法结合在⼀块,让对象更加完善。这就体现了封装的特性。

1.访问限定符:

定义在类内的成员函数默认是内联函数(inline)。当然,具体展不展开由编译器说了算。

类有三个访问限定符:public,protected,private。

public在类外可以访问,protected和private在类外不可以访问。在类内三个都可以访问。protected和private的区别是继承时子类可以访问父类的保护内容,但不能访问父类的私有内容。

访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有 访问限定符,作⽤域就到 }即类结束。

在C++中struct中也可以有成员函数,这在C语言中是不可以的,而class和struct的唯一区别就是默认访问权限不同,struct默认都是public,而class默认都是private。

上图中当a,b是public成员时,就可以正常访问,但是当它们是private成员时,就不能够访问了。

2.类域:

类定义了⼀个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用:: 作用域操作符指明成员属于哪个类域。

类域影响的是编译的查找规则。与命名空间类似。

3.实例化:

⽤类类型在物理内存中创建对象的过程,称为类实例化出对象

类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只 是声明,没有分配空间,用类实例化出对象时,才会分配空间。⼀个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。打个比方:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多 少个房间,房间⼤小功能等,但是并没有实体的建筑存在,也不能住⼈,用设计图修建出房子,房子才能住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象才分配物理内存存储数据。

4.类与对象的大小

分析⼀下类对象中哪些成员呢?类实例化出的每个对象,都有独⽴的数据空间,所以对象中肯定包含成员变量,那么成员函数是否包含呢?⾸先函数被编译后是⼀段指令,对象中没办法存储,这些指令存储在⼀个单独的区域(代码段),那么对象中⾮要存储的话,只能是成员函数的指针。再分析⼀下,对象中是否有存储指针的必要呢,如果类实例化100个对象,那么成员函数指针就重复存储100次,太浪费了。所以其实函数指针是不需要存储的,函数指针是⼀个地址,调⽤函数被编译成汇编指令[call 地址], 其实编译器在编译链接时,就要找到函数的地址,不是在运行时找,只有动态多态是在运行时找,就需要存储函数地址。

总之,类的对象中只存储成员变量,不存储成员函数

而类的内存对齐规则与结构体是一样的。

可以参考:C语言自定义类型——结构体、联合体、枚举-CSDN博客

内存对齐规则

  • 第⼀个成员在与结构体偏移量为0的地址处。
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
  • 注意:对齐数 = 编译器默认的⼀个对齐数 与 该成员⼤小的较小值。
  • VS中默认的对齐数为8
  • 结构体总⼤小为:最⼤对齐数(所有变量类型最⼤者与默认对齐参数取最小)的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对齐到⾃⼰的最⼤对齐数的整数倍处,结构体的整体⼤小就是所有最⼤对齐数(含嵌套结构体的对齐数)的整数倍。

 int是四个字节,4 + 4 = 8又刚好是4的倍数。

可以看到B,C都是1个字节大小,这是为什么呢,为什么没有成员变量还要给一个字节呢?因为如果⼀个字节都不给,怎么表示对象存在过呢!所以这⾥给1字节,纯粹是为了占位标识对象存在

5.this指针

因为对象中只有成员变量,调用成员函数时都是通过地址来调用的,那么不同的对象调用同一个函数时是如何区分不同对象的呢。C++中通过隐含的this指针解决这个问题。

编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this 指针。上面的show函数实际上是: 

void show(Date* const this);

const修饰使this不能改变指向。

类的成员函数中访问成员变量,本质都是通过this指针访问的。所以show函数实际上是:

void show(Date* const this)
{
    cout << this->year << " " << this->month << " " << this->day << endl;
}

C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显 示使⽤this指针。当然不写this也是可以的,编译器会自动加上this的。

标签:存储,函数,对象,成员,C++,基础知识,访问,对齐
From: https://blog.csdn.net/C_C2636xyz/article/details/146231064

相关文章