C++ 类和对象零散知识点
成员函数的声明和定义
- 类的成员函数,如果定义在类中,默认为
inline函数 - 如果声明定义分离,则要在函数定义前面指定类域
类和对象的空间占用
- 类 就像一张设计图纸,运行时是不占用堆栈内存的
- 对象 占用的内存由非静态成员变量决定,成员函数、静态成员变量、成员函数都不会占用空间
- 空类 是特殊的,即使它里面没有任何成员变量,C++规定它的对象大小为 1 字节,这是为了保证每个不同对象都有唯一内存地址
注意
内存对齐和虚函数也会影响对象的大小,内存对齐 不在此处解释;如果类有虚函数,对象里会多出一个虚表指针 (vptr),占用 8 字节 (64 位系统),指向虚函数表。
this 指针
C++规定不能在实参和形参的位置显式的写this指针(编译时编译器会处理),但是可以在函数体内显式使⽤this指针。
友元
友元提供了一种突破类访问限定符封装 的方式,它可以给外部函数(即 友元函数)或外部类(即 友元类)赋予"好友权限",使它们可以访问类内部的私有成员,恰如它的关键字:friend 那样。
- 使用时,在函数声明或者类声明的前面加 friend ,并且把友元声明放到一个类的里面
- 外部友元函数可访问类的私有和保护成员,友元函数仅仅是一种声明,它不是类的成员函数
- 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
- 一个函数可以是多个类的友元函数
- 友元类的关系是单向的 且不能传递的,不具有交换性
内部类(嵌套类)
一个类里面定义的另一个类,就是内部类。内部类的本质是独立类型,仅作用域被包裹在外部类中,不是外部类成员变量。
- 创建外部类对象不会自动创建内部类对象;
sizeof(外部类)不计入内部类大小;C++内部类无隐式外部类this指针 - 内部类可访问外部类全部成员,前提:手动传入外部类对象/指针/引用。
- 外部类可访问内部类全部成员,前提:创建内部类对象;静态成员可直接
Inner::静态成员访问 - 内部类默认是外部类的友元类
匿名对象
匿名对象是没有名字的临时对象,创建后没有变量接收,生命周期仅在当前这一行表达式结束。
- 创建格式:
类名(),不定义变量名。
cpp
// A 是一个类
// 对于普通对象
A aa1(); //不能这么定义,因为编译器⽆法识别它是⼀个函数声明,还是对象定义
// 对于匿名对象
A(); // 是可以的