友元:
不是类的成员函数, 或者是和其不同的另外一个类, 却可以访问该类的私有成员变量,.
使用方法:
友元函数, 在类中声明函数时在最前面加上 friend
friend Sales_Data add()//这个就是友元函数.
注意, 函数的具体定义需要放在类的外面
mutable 关键字: 可变数据成员
即使他是const 对象的成员, 这个变量也是可以改变的. 在const函数中也一样.
this 指针:
this 指向的是调用某成员函数的对象.
可以将this 指针作为返回值返回,
也可以作为左值 *this 返回.
this 指针是一个隐式的值, 作为额外的实参传递给类的每个费静态成员函数,
不完全类型, 把类的声明和定义分离
class screen ;
如果只有单纯的一行上述代码,那么screen 被称为前向声明,
在screen被定义之前, 她是一个不完全类型,我们只知道他的名字, 以及她是一个类, 但是并不知道他包含哪些成员.
聚合类:
所有成员都是public
没有定义任何构造函数
没有类内初始值
没有基类和virtual 函数
struct data{
int val;
string s;
}
就是一个聚合类.
constexpr:
常量表达式, 简单来说,该关键字要求表达式在编译器是可知的, 这样能保证代码安全, 优化代码, 在编译时, constexpr 修饰的变量, 会被替换成已经计算好的值.
constexpr 修饰构造函数时, 必须初始化所有数据成员
constexpr构造函数返回的对象也是constrexpr, 所以可以利用该构造函数, 生成constexpr对象.
constexpr 函数被隐式的指定为内联函数.
=default
一种语法形式, 位于类内部默认构造函数声明语句的参数列表之后, 药酒编译器生成构造函数, 而不管类是否已经有了其他构造函数/
就是指示编译器生成一个合成版本的构造/析构函数(包括拷贝构造,赋值构造,移动构造,移动赋值构造)
这里用构造函数来讨论:
如果用户没有定义,在需要的时候编译器会生成一个默认的构造函数,这个规则你应当是知道的。
但是,假如用户定义了其他构造函数(比如有参数的,或者参数不同的),那么编译器无论如何就不会再合成默认的构造函数了
那么如果要使用无参数版本,用户必须显示的定义一个无参版本的构造函数。
如果使用default指示的办法,那么可以产出比用户定义的无参构造函数有更优的代码(毕竟是编译器干活)
还有一个作用可以让使用者一眼就看出这是一个合成版本的构造函数(相当于知道类的作者没干其他事情)
其实一看,也没太多作用,delete这个关键字倒是还行。