C++中的类与this指针

8 篇文章 2 订阅

类的定义

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

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 定义的成员默认访问权限是共有

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

类的作用域:

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

类的实例化:

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

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

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

类对象模型(大小)

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. 如果存在嵌套,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍处。

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

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指针不能为空!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值