学习《C++Primer》看到的,做点儿笔记吧
1、通常,函数不应该有vector或其他标准库容器类型的形参。调用含有普通的非引用vector形参的函数会复制vector的每一个元素,所以,从避免复制vector的角度出发,应考虑将形参声明为引用。而实际上,C++程序员倾向于通过传递指向容器中需要处理的元素的迭代器来传递容器。
2、数组形参的定义,下面三种是等价的:
void print(int *) { /*...*/}
void print(int []) { /*...*/}
void print(int [10]) { /*...*/}
上面三种的定义,其形参都是int *,一般来说,将其直接定义为指针要比使用数组更好。
3、当编译器检查数组形参关联的实参时,他只会检查实参是不是指针、指针类型、数组元素的类型是不是匹配,而不会检查数组的长度,所以没有必要在形参中制定数组长度,那样也容易引起误解;
4、如果通过引用传递数组,那么编译器不会将数组实参转化为指针:
void print(int (&array) [10]) {/*...*/}
int main()
{
int i=0;
int j[2]={0,1};
int k[10]={0,1,2,3,4,5,6,7,8,9};
print(&i);// error
print(j);// error
print(k);// ok
return 0;
}
5、多维数组的传递
void print(int (matrix *)[10], int rowsize) {/*...*/}
上式中,将matrix声明为指向含有10个int型元素的数组的指针。
同样也可以以数组语法形式定义
void print(int matrix[][10], int rowsize) {/*...*/}
这条语句把matrix声明为二维数组的形式。实际上,形参是一个指针,与一位数组一样,编译器忽略掉第一维的长度,所以最好不要把它包含在形参中;
6、编译器隐式的将类内定义的成员函数当做内联函数;
7、每个成员函数都有一个额外的、隐含的的形参将该成员函数与调用该函数的类对象捆绑在一起;
8、每个成员函数(static函数除外)都有一个额外的、隐含的的形参this,在调用时成员函数时,形参this初始化为调用函数的对象的地址。
total.same_isbn(trans);
编译器这样重写这个函数调用
Sales_item::same_isbn(&total,trans);
9、由编译器创建的默认构造函数通常称为合成的默认构造函数:合成的默认构造函数一般仅适用于包含类类型成员的类。而对于含有内置类型或者复合类型成员的类,则通常应该定义他们自己的默认的构造函数初始化这些成员;