目录
1.类的对象大小的计算
2.类成员函数的this指针
本篇讲述以上类容
类的对象大小计算
在C语言中,结构体中的成员变量,满足内存对齐原则,具体内存对齐原则,在我之前讲的C语言结构体中有详细说明,这里就不多说了内存对齐原则
那么,C++中的类,也满足内存对齐原则,比如:
1
2
3
4
5
6
7
8
9
10
11
12class person { int _a; char _b; double _c; }; int main() { person _A; cout<<sizeof(_A)<<endl; }
运行结果如下,这里默认对齐数为8。
不难看出,与struct中对齐规则是一致的。那么如果类中嵌套定义一个类呢?比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class 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这个类中的变量大小,但如果改成下面形式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20class 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
我们再看以下例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#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指针
我们先看下面这个类的定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25class 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()就等价于:
1
2
3
4
5void display() { cout<<this->_a<<" "<<this->_b<<endl; }
其中this指向的就是当前调用display函数的对象的地址,作为成员函数的形参。
这里为大家总结一下this指针的特性:
- this指针类型为const* 类型
- this指针只能在成员函数内部使用
- this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针
- this指针是成员函数所隐藏的第一个指针形参
- this指针是通过编译器传递,不需要显式定义它
- this不是类的成员,只是一个函数形参
最后
以上就是糊涂奇异果最近收集整理的关于C++类与对象(类对象大小的计算以及this指针介绍)的全部内容,更多相关C++类与对象(类对象大小内容请搜索靠谱客的其他文章。
发表评论 取消回复