纯虚函数只能有.hh文件,不能有.cc文件。
类中函数可以有默认参数,但是默认参数只能出现在.hh中,不能出现在.cc中。
类中的一般数据成员是对每个对象都有自己的拷贝的,而且每个一般成员函数一定要有一个调用它的对象。
static数据成员不在类的声明中定义或初始化。而在对应的.cc文件中初始化(由于交叉编译/链接的原因)。只在声明中带有static关键字,但是在对应的.cc文件中,是不带static关键字的。也可以用默认初始化,但是还是要出现在.cc文件中,否则会出现链接错误。其他外部代码可用::访问静态成员变量。
static成员函数可以定义在类型的声明中或在定义中(.hh中或.cc中)。外部代码也可以用::来访问静态成员函数。
但是在本类中,静态数据成员和成员函数不需要用::访问,直接访问就可以了。
c++支持类模板和函数模板。
定义类模板和定义对象如下:
template<typename T> class Point { T x_coord, y_coord; public: Point() : x_coord(0), y_coord(0) { } Point(T x, T y) : x_coord(x), y_coord(y) { } ... }; Point<float> p1(3.31, 2.67); Point<int> p2(15, -6);
定义函数模板和调用函数如下:
template <typename T> T square(T val) { return val * val; } int i = 15; cout << i << " squared = " << square(i) << endl; Matrix m(3, 3); // Matrix provides operator* Matrix m2 = square(m);
函数模板不需要指定模板参数,编译器可以自己从上下文推断出来类型。
函数模板声明如下:
template <typename T> T square(T val);
如果需要也可以指定模板参数:
double result = square<double>(3);
3是整形,所以square(3)会被初始化为square<int>()
所以显示指定模板函数参数是很必要的,尤其是把一个函数模板初始化冰川递给另一个函数或函数模板的时候。
structs或者classes提供了()的重载,然后就可以对其使用适配器了。
STL容器是各种拷贝进拷贝出的。STL使用拷贝构造函数和赋值操作符。
Widget(const Widget&); Widget & operator=(const Widget &);
当容器和类继承有关时小心子类对象被分片(父类的容器存放子类对象,导致子类对象的子类部分数据成员被舍掉而不能存放)。