本文首发于个人博客
类
C++中可以使用struct、class来定义一个类
struct和class的区别
- struct的默认成员权限是public
- class的默认成员权限是private
- 实际开发中,用class表示类比较多
1 | struct Person { |
等价于
1 | class Person { |
操作类
- 对类进行操作。我们有两种方式
1 | Person person; |
汇编分析
struct
1 | struct Person { |
反汇编结果如下
1 | pushq %rbp |
class
1 | class Person { |
反汇编结果如下
1 | pushq %rbp |
可以看到无论是struct
还是class
。汇编代码完全一样
- 实际开发中,用class表示类比较多
this
this是指向当前对象的指针
- 对象在调用成员函数的时候,会自动传入当前对象的内存地址
例如
1 | class Person { |
需要注意的是:不能用this.age来访问成员变量。因为this是指针。
指针访问对象成员的本质
下面代码最后打印出来的每个成员变量值是多少?
1 | class Person { |
第一感觉是
id = 40 age = 50 height = 30
然后用编译器运行起来的结果是
id = 10 age = 40 height = 50
原因
- 因为指针
p
实际指向的是person.age
的地址,但是(Person *)&person.age;
欺骗编译器是指向person。 - 64位下
person
中每个成员变量都是Int类型,占用4个字节。 - 当我们修改
p->id = 40;
的时候,实际上修改的是age
指向的内存空间。
拓展
打印的时候不用点语法,使用指针呢?如下
1 | p->display(); |
其结果为:其中height 的值是不确定的
id = 40 age = 50 height = 1
- 是因为,使用指针访问的时候,传入的this就是偏移了4个字节的内存空间,打印的id实际上是age,打印的age实际上是height,打印的height实际上是其他空间的数据。