常量对象,常量成员函数
常量对象的引用和指针不能调用类的普通的成员函数。只能调用常量成员函数。
常量成员函数:把const放在类成员函数参数列表后。[表示隐含的this是一个指向常量的指针]
当创建一const对象时,直到构造函数完成初始化过程,对象才取得其常量属性。
友元
类可以允许其他类或函数访问它的非公有成员,方法是令其他类或函数成为它的友元。
友元:在类内为对应函数(成员函数或非成员函数)或类加上一个friend开头的声明。
把一个A类的成员函数FunA声明为令一个类B的友元时,需要组织下定义和声明顺序。
定义A
定义B【声明A::FunA为其友元】
定义A:FunA
内联函数
类内部定义函数的默认为内联的
类外部定义函数时,加上inline修饰使其内联。此定义放在头文件。
内联是否有效取决于编译器判断。
可变数据成员
mutable 类型 变量名;
然后可以在const成员函数里访问和修改此数据成员。
类内初始值
// 有些编译器不支持类内初始值
// 类内初始值两种赋值形式。=,{}
class x
{
private:
int a = 0;
vector<int> b{0};
};
类声明
类在声明后定义前这段区间属于不完全 类型。
此时只能,定义指向此类型的指针或引用。声明以其为形参或返回类型的函数。
类内部不能有类自己的成员声明。指向类自己的指针或引用可以。
类的定义分两步处理:
编译成员的声明
直到类全部可见才编译函数体,意味着函数体内可以使用类中任何成员.
成员函数的 返回类型或参数列表中名字,须使用前可见。意味着成员函数的返回类型,形参类型必须在类定义中,前面部分[类定义后面部分的声明无效,不同于类函数体内名字查找规则]或外层作用域内已经被声明.
构造函数
对const,引用或某种未提供默认构造函数的类类型 的类内成员,
则必须通过构造函数初始值列表为这些成员提供初值。
随着构造函数体一执行,初始化就完成了。
构造函数体内不属于初始化过程。
类成员初始化顺序和他们在类定义中出现顺序一致。(构造函数初始值列表不限定顺序)。
对象被默认初始化或值初始化时,自动执行默认构造函数。
默认初始化:
块作用域内定义不含初始值非静态变量或数组
类类型成员没在构造函数初始值列表中初始化
值初始化:
数组初始化时,初始值数量少于数组大小
定义局部静态变量无初始值
显示请求值初始化T()
// 对基本数值类型,默认初始化后,值大小为未知。值初始化后,为0。
// 对类类型,默认初始化,值初始化均指向默认构造函数。
如果构造函数只接受一个实参,
则它实际上定义了通过实参类型自动转化为此类类型的隐式转换机制。
在构造函数声明前加explicit可以阻止此隐式转换发生。(定义处不用加explicit)。
聚合类
条件:
所有成员都是public
没定义任何构造函数
没类内初始值
没基类,没virtual函数
--》针对这种类型可以 成员初始值列表初始化。(这样不好。)
类的静态成员
类的静态成员存在于任何对象之外。类的静态成员函数不包含this指针。
可通过类对象,引用或指针或作用域运算符来访问静态成员。
成员函数内,可直接访问。
在类外部定义静态成员是,不能重复static。
静态数据成员,不是在构造函数中初始化的。必须在类外部定义和初始化每个静态成员。
不同于普通成员处:
静态数据成员可以是不完全类型
可以用静态成员做默认实参
转载请注明原文地址: https://ju.6miu.com/read-1122957.html