0%

C++中的类与this指针

类的定义

C++ struct:可以定义数据以及函数,一般使用class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
struct Student
{
void display()
{

}
void setId(int id)
{
_id = id
}
char name[10];
int _id;
};

class Student
{//成员函数
public://共有成员在任何地方可用
void display()
{

}
void setId(int id)
{
_id = id
}
private://私有的成员在类外不可见
//成员变量,属性
char name[10];
int _id;
protected://保护的成员在类外不可见
char major[10];
};

类的限定符以及封装

访问限定符:public,protected, private

限定符表示范围,从当前限定符开始,到下一个限定符结束,只限制成员在类外的访问,类内访问不受限制

class 定义成员默认访问权限为私有
struct 定义的成员默认访问权限是共有

建议显式的写出来,以增加可读性
类的封装:将数据和操作数据的方法有机结合,隐藏属性和实现的细节,仅对外公开接口来和对象进行交互

类的作用域:

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

类的实例化:

变量:对象 -—->自定义类型的变量一般习惯称为对象

类只是一个模型一样的东西,限定了类有哪些成员,定义一个没有分配实际的内存空间来存储它

一个类可以实例化多个对象,实例化出的对象,占用实际的物理空间,存储类成员变量

类对象模型(大小)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class A  //4字节
{
int _a;
};
class B //4字节
{
int _b;
void fun1()
{
int a = 1;
float b = 2.0;
char c = 'a';
}
};
class C //1字节
{
void fun1()
{
int a = 1;
float b = 2.0;
char c = 'a';
}
};
class D //1字节
{};

对象模型中只存放普通的成员变量,不存放成员函数,成员函数存放在公共代码段

空类占一个字节(起到标记作用)

类的大小遵循内存对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍地址处。 _(对齐数 = 编译器默认对齐数与该成员大小的较小值,VS默认为 8 ,Linux和当前字段sizeof值一样)_
  3. 结构体总大小为:最大对齐数(所有变量类型的最大者与默认对齐数取最小)的整数倍。
  4. 如果存在嵌套,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍处。

!!!!如果嵌套的结构体只有定义,那么算大小的时候不算它!!!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class A  //48 字节
{
char _a;
double _b;
int _c;
char _d;
class B
{
double _a;
char _b;
int _c;
char _d;
};
B b;//关键点
};

class A //24字节
{
char _a;
double _b;
int _c;
char _d;
class B
{
double _a;
char _b;
int _c;
char _d;
};
};

为什么要内存对齐?

答:提高访问效率,CPU读取内存是按块读取的,内存对齐可以提高访问效率,方便一些硬件(如嵌入式)读取数据

如何修改内存对齐数:#pargma pack()

this 指针

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

this指针只存在于成员函数中

this指针始终作为成员函数的第一个行参

this不是类的成员,只是一个函数行参,一般存在于栈上,一般会做优化,存在寄存器中

有解引用的情况下this指针不能为空!

-------------本文结束感谢您的阅读-------------