C++类(2)
上期,我们知道类里面的函数是不占内存的,那么如果这个类里面全都是函数呢?
此时这个类是没有成员的类对象,内存是1byte,是为了占位,表示对象存在,不储存有效数据
同样,类里面什么都没有的空类内存大小也是1
this指针
class Add
{
private:
int _day;
int _month;
int _year;
public:
void Init(int year, int month, int day)
{
_year = year;
_day = day;
_month = month;
}
void caa(void)
{
cout<< _year<<_month <<_day << endl;
}
};
int main(void)
{
Add s1;
Add s2;
s1.Init(2024,10,12);
s2.Init(2005,4,14);
s1.caa();
s2.caa();
return 0;
}
打印结果是
20241012
20050414
但是思考一下,为啥我们调用的是同一个函数,但是打印结果却不一样呢?
你可能说一个是s1一个是s2,两个不同的对象,但是函数是存放在公共区域啊!
和对象没有关系啊!
答案是这个地方在编译的时候编译器会加一个this指针
虽然我们这个地方caa函数参数写的是void
但是编译器在编译的时候会处理成
void caa(date* const this)
{
cout<< this->_year<<this->_month <<this->_day << endl;
}
这样我们才知道我们要找的_year和_month在哪里,不然你怎么找?
所以本质上s1.caa()会被编译器处理成s1.caa(&s1)而this指针指向s2
s2.caa会被编译器处理成s2.caa(s2);而this指针指向s2
但是要注意的时候,我们写的时候函数参数不能写date*this(this指针不能在实参和形参中传递),但是函数体内可以这样写!
但是函数体内的this指向是不可以更改的
那么再思考一下,this这个函数是在类里面栈上,堆上,静态区还是哪里呢?
首先肯定排除类里面,因为前面提过类的内存大小只和类的成员变量有关,所以肯定不可能存放在类里面。
正确答案是在栈上,this是形参,所以this是和普通参数一样存放在函数调用的栈帧里面
我们再来思考一下前面说过
Add::这样是错误的,因为这是声明没有真的去开辟空间
但是学了上面知识我们知道,如果可以,那么传啥给this指针呢?
同样可以验证这种方法的错误性
那么这样写可不可以呢?
Add::(s1);
这个地方我给了this指针要传的地址了
答案还是不行
因为this指针不能在实参和形参中传递