文章目录
- 1.类的大小如何计算?
- 2.类内部的this指针
- 3.this指针的特性
本文为作者关于c++类学习过程中的小小总结
1.类的大小如何计算?
c++的类由成员变量和成员函数等组成,不同于c中的结构体只有成员变量,但类大小的计算方法和结构体的计算方法是一样的,总的来说,类大小的一样是用内存对齐的方式来计算的,(内存对齐计算方法参考点击这里,别人总结的很好)
类的大小计算只考虑成员变量,不考虑成员函数,因为在内存中一个类是被这样存放的
每一个类在内存中都会有一个共享的公共代码区来存放成员函数,类中的每一个对象都共享连接这片区域,而不是将其存放在对象里,这样有利于编译器减少内存空间浪费,没有必要为每一个对像单独开辟一片空间存放成员函数。
2.类内部的this指针
c++类用三个访问限定符:“public”,“protected”,"private"来修饰成员变量或成员函数
其中,public修饰的成员变量在类外面直接就能使用,但被其他两个访问限定符修饰的却不可以,那么c++是如何令用户可以访问被这两个修饰符修饰的成员变量的呢?答案是:借助了this指针
我们以时间类来举例
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
int main()
{
Date d1;
d1.Init(2021 11 11);
d1.print();
}
运行结果:
事情的表象好像是我们直接在类里面的函数可以对私有的成员变量进行更改,但实际这一切的实现都是this指针的功劳,
实际上:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
在Datet类里定义一个的d1对象时,编译器会自动生成一个指向d1的 Date *const this指针
而我们的Init 和Print函数实际上为:
void Init( Date* const this, int year, int month, int day)
{
this->_year = year;
this->_month = month;
this->_day = day;
}
void Print(Date* const this)
{
cout <<this->_year<< "-" <<this->_month << "-"<<this-> _day <<endl;
}
3.this指针的特性
1. this指针的类型:类的类型(*)const,即成员函数中,不能给this指针赋值。
- 只能在“成员函数”的内部使用
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递