概述
目录
1.类的对象大小的计算
2.类成员函数的this指针
本篇讲述以上类容
类的对象大小计算
在C语言中,结构体中的成员变量,满足内存对齐原则,具体内存对齐原则,在我之前讲的C语言结构体中有详细说明,这里就不多说了内存对齐原则
那么,C++中的类,也满足内存对齐原则,比如:
class person
{
int _a;
char _b;
double _c;
};
int main()
{
person _A;
cout<<sizeof(_A)<<endl;
}
运行结果如下,这里默认对齐数为8。
不难看出,与struct中对齐规则是一致的。那么如果类中嵌套定义一个类呢?比如:
class person
{
public:
int _a;
char _b;
double _c;
class _number
{
int _e;
char _f;
double _h;
};
};
int main()
{
person _A;
cout<<sizeof(_A)<<endl;;
}
这里,就是需要注意的,结果仍然为16
这是因为我们在person这个类中。没有定义_number这个类的变量,所以,编译器是不会计算_number这个类中的变量大小,但如果改成下面形式
class person
{
public:
int _a;
char _b;
double _c;
class _number
{
int _e;
char _f;
double _h;
};
_number _B;//定义_number类类型的一个变量
};
int main()
{
person _A;
cout<<sizeof(_A)<<endl;;
}
结果显而易见为32
我们再看以下例子:
#include<iostream>
using namespace std;
class A1//含有成员变量和成员函数
{
public:
int _a;
void fun()
{};
};
class A2//只含有成员函数
{
void fun()
{};
};
class A3//空类
{};
int main()
{
cout<<sizeof(A1)<<endl;
cout<<sizeof(A2)<<endl;
cout<<sizeof(A3)<<endl;
}
输出结果如下:
至此我们得出结论:
1.类满足内存对齐原则。
2.嵌套类本身也遵循内存对齐的原则
3.类中只保存成员变量,成员函数存放在公共的代码段(成员函数不占字节数)
4.空类较特殊,编译器给了空类一个字节来唯一标识这个类
类成员函数的this指针
我们先看下面这个类的定义
class A1
{
public:
void set(int a = 1,double b = 0.1)
{
_a = a;
_b = b;
}
void display()
{
cout<<_a<<" "<<_b<<endl;
}
private:
int _a;
double _b;
};
int main()
{
A1 A,B;
A.set(10,10.5);
B.set(15,15.5);
A.display();
B.display();
}
我们在main函数中定了两个对象A,B。A1这个类中的两个成员函数并没有关于不同对象的区分,那么当A调用set的时候,set函数是如何知道设置A这个对象,而不设置B这个对象的呢?
这就有了this指针的引入:
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
上述display()就等价于:
void display()
{
cout<<this->_a<<" "<<this->_b<<endl;
}
其中this指向的就是当前调用display函数的对象的地址,作为成员函数的形参。
这里为大家总结一下this指针的特性:
- this指针类型为const* 类型
- this指针只能在成员函数内部使用
- this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针
- this指针是成员函数所隐藏的第一个指针形参
- this指针是通过编译器传递,不需要显式定义它
- this不是类的成员,只是一个函数形参
最后
以上就是糊涂奇异果为你收集整理的C++类与对象(类对象大小的计算以及this指针介绍)的全部内容,希望文章能够帮你解决C++类与对象(类对象大小的计算以及this指针介绍)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复