总结归纳一点C++类的知识,参考《C++ primer》,温故而知新~
- 构造函数的初始化列表:
没有默认构造函数的类类型的成员,以及const或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中进行初始化;
成员初始化的次序是定义成员的次序,不是初始化列表的顺序;
- 显示指定inline函数,可在类定义体内部指定一个成员为inline,或者在类定义体外部的函数定义上指定为inline;在声明和定义处指定inline均为合法。
- 只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的指针或引用。
如:
class LinkScreeen{ Screen window; LinkScreen *next; LinkScreen *prev; }
- 何时使用this指针:成员函数具有一个附加的隐含形参,即指向该类对象的一个指针。这个隐含形参命名为this,与调用成员函数的对象绑定在一起。
通常在成员函数内部显示引用this通常不必要,但有一种情况必须这样做:
当我们需要将一个对象作为整体引用而不是引用对象的一个成员时,最常见的情况是在这样的函数中使用this:该函数返回对调用该函数的对象的引用。如:
Screen& Screen::move(index x, index c) { index row = r *width; cursor = row+c; return *this; }
- 在普通的非const成员函数中,this的类型是一个指向类类型的const指针(指针常量);即可以改变this所指向的值,但不能改变this所保存的地址;
在const成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变this所指向的对象,也不能改变this所保存的地址。
const 对象只能使用const成员。非const对象可以使用任一成员,但非const版本是一个更好的匹配。
- 可变数据成员:mutable
有时我们希望类的数据成员(甚至在const成员函数内)可以修改。这可以通过将它们声明为mutable来实现。
即可变数据成员永远都不能为const。
- 隐式类型转换
可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换;
例:
class Sales_item{ public: Sales_item(const std::string &book = “ ”): isbn(book), units_sold(0), revenus(0.0){ } Sales_item(std::istream &is); };
这里的每个构造函数都定义了一个隐式转换。因此,在期待一个Sales_item类型对象的地方,可以使用一个string或一个istream。
抑制由构造函数定义的隐式转换:可以通过将构造函数声明为explicit,来防止在需要隐式转换的上下文中使用构造函数。
class Sales_item{ public: explicit Sales_item(const std::string &book = “ ”): isbn(book), units_sold(0), revenus(0.0){ } explicit Sales_item(std::istream &is); };
- 友元机制
友元(friend)机制允许一个类将对其非公有成员的访问权授予指定的函数或类。
- static类成员
对于特定类类型的全体对象而已,访问一个全局对象有时是必要的。也许,在程序的任意点需要统计已创建的特定类类型对象的数量;或者,全局对象可能是指向类的错误处理例程的一个指针;或者,它是指向类类型对象的内存自由存储区的一个指针。
全局对象会破坏封装,类可以定义类静态成员。
static数据成员独立于该类的任意对象而存在;每个static数据成员是与类关联的对象,并不与该类的对象相关联。
static成员函数没有this指针,它可以直接访问所属类的static成员,但不能直接使用非static成员。
static成员函数不能被声明为虚函数。