类型成员、
就是类的成员是一个类型
OK举个例子
class peron{
public :
typedef std::string zm;
private:
zm name = "love_ke";
zm address = "anywhere";
}
我们的person类在public部分定义了zm,这样用户就可以使用这个名字。因为封装嘛,无形装逼最为致命,不让用户知道,我们用了一个string来放它的数据。(当然我们之前学过的using也可以做到)
注意:类型先定义后使用
可变数据成员
一个可变数据成员永远不可能是const,即使它是const对象的成员
通过关键字 mutable来定义。
类型数据成员的初始值
我们定义了构造函数,在进行列表初始化的时候,其会自动匹配构造函数去初始化我们的类型数据成员。
当然也可以进行赋值初始化。(仅仅是初始化的它的数据成员)
关于如何定义并使用类类型及友元
关于类类型
每个类定义了唯一的类型
对于两个类来说,即使他们的成员完全一致,这两个类也是不同的类型。
对于一个类来说,要创建它的对象 必须先定义它才行。
所以一个class的友元class 想要使用 该class的数据成员 必须先定义该class,再定义友元class。
(c++ primer我觉得解释的巨拗口,)
举个例
class a
{
friend:class b;
public:
int x;
}
class b
{
public:
int y = x;
}
但是class a和class b的位置对调就会出现问题
类之间的友元关系,我这样解释
假设有两个小朋友 小k,小d。(小k有糖,小d有玩具)
小k说:从此以后,小d就是我的好朋友了。
这句话的意味着小k拿小d当好朋友,所以小k允许小d吃他的糖 (并不意味着小k能玩小d玩具)
仅有小d也说:小d你也是我好朋友了。才意味着小k能玩小d的玩具。
(所以你看我们程序员都心智多淳朴,拿别人当朋友是开放朋友对自己的访问权限,而不是要别人的访问权限)
扯回来,总结一句话,一个class定义友元,就是允许友元对该class的成员进行访问
关于类内的作用域
只提一句 :编译器处理完类中的全部声明后才会处理成员函数的定义。
关于名字定义
类内层定义的名字,尽量和外层不要相同。(类内层定义的名字会隐藏外层相同的名字)
成员函数的形参名字,尽量不要和类内层相同。(如果相同的话,形参会隐藏类内对象名字,可以用this指针强制访问)
构造函数初始化顺序,尽量与数据成员 声明顺序一致
explicit关键字声明构造函数时,它将只能以直接初始化的形式使用,而且,编译器将不会在自动转换过程中使用该构造函数
所有的隐式转换只进行一步
聚合类:
所有成员都是public
没有定义任何构造函数
没有类内初始值
没有基类,也没与virtual函数
字