1.register声明的变量为寄存器变量,因此没有地址,不能对它取地址操作。
2.【用错sizeof】当数组作为函数参数传递时,数组会退化为同类型的指针。
3.每个成员在成员初始化列表中只能出现一次,初始化的顺序不是由名字在初始化列表中的顺序决定,而是由成员在类中被声明的顺序决定。
/******************point.h****************/ class point { private: int xPos; int yPos; public: point(int x):xPos(x),yPos(xPos) {} void print() { cout<<"xPos: "<<xPos<<", yPos"<<yPos<<endl; } }
/**********************main.c***************/ #include "point.h" int main() { point pt1(3); pt1.print(); return 0; }
输出结果如下:
xPos: 3, yPos: -858993460
从结果来看,yPos没有像预期初始为3,这是因为yPos排在xPos前面,因此“yPos(xPos)”先被执行,“xPos(x)”后被执行。
4.默认复制构造函数带来的问题
当复制成员涉及动态内存时,复制的两个对象中变量都指向了同一个内存块,可是,两个指针对象撤销有先后,一旦一个对象被撤销,另一个便成了“野指针”,使用该指针再次释放同一动态内存单元会引发内存错误。解决方法是:显示定义复制构造函数(为新对象开辟新的动态内存);
5.const和引用型数据成员只能通过成员初始化表达式进行初始化。
class point { private: const int xPos; const int yPos; public: /* point(int x,int y) //错误!!无法直接复制 { xPos = x; yPos = y; } */ point(int x,int y):xPos(x),yPos(y) //const数据成员只能在初始化列表中初始化 { } ... }
6.const与成员函数
类型 函数名(参数列表) const { 函数体 }
const成员函数表示该成员函数只能读取类数据成员,而不能修改类数据成员。
const对象只能被创建,撤销以及只读访问,不能改写。