C++ Primer 笔记5

来源:互联网 发布:python 重定向 编辑:程序博客网 时间:2024/06/05 02:22
1、编译器忽略为任何数组形参指定的长度,例如
void process(const int a[10])
{...}
尽管上述代码假定所传递的数组至少含有10个元素,但C++语言没有任何机制强调实现这个假设。下面的调用都是合法的:
int i = 0, j[2] = {0, 1};
process(&i);//ok, &i is int *;probable run-time error
process(j);//ok, j is converted to pointer to 0th element; argumenthas type int *;
          //probable run-time error
当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数组的长度。
2、和其他类型一样,数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参和实参类型的一部分。编译器检查数组实参的大小与形参的大小是否匹配。
void process(int (&arr)[10])
{...}
&arr两边的括号是必须的,因为下标操作符具有更高的优先级
f(int &arr[10]) //error: arr is an array ofreference
f(int (&arr)[10]) //ok, arr is a reference to anarray of 10 ints
3、给main()函数传递实参
  int main(int argc, char *argv[]){...}
  int main(int argc, char **argv) {...}
4、含有可变形参的函数
在无法列举出传递给函数的实参的类型和数目时,可以使用省略符形参,省略符暂停了类型检查机制。
省略符形参有下列两种形式:
  void foo(parm_list, ...);
  void foo(...);
5、确保返回引用安全的一个好方法是:请自问,这个引用指向哪个在此之前存在的对象?
   引用返回左值  get_char(s, 0)= 'A';
6、既可以在函数声明也可以在函数定义中指定默认实参。但是在一个文件中,只能为一个形参指定默认实参一次。通常,应在函数声明中指定默认实参,并将该声明放在合适的头文件中。如果在函数定义的形参表中提供默认实参,那么只有在包含该函数定义的源文件中调用该函数时,默认实参才是有效的。
7、内联函数应该在头文件中定义,这一点不同于其他函数。内联函数的定义对编译器而言必须是可见的,以便编译器能够在调用点内联展开该函数的代码。此时,仅有函数原型是不够的。在头文件中加入或修改内联函数时,使用了该头文件的所有源文件都必须重新编译。
8、形参与const形参的等价性仅适用于非引用形参。有const引用形参的函数与有非const引用形参的函数时不同的。类似的,如果函数担忧指向const类型的指针形参,则与担忧指向相同类型的非const对象的指针形参的函数不相同。 当形参以副本传递时,不能基于形参是否为const来实现重载。
9、如果函数具有默认实参,则调用该函数时,所用的实参可能比实际需要的少,默认实参也是实参,在函数匹配过程中,它的处理方式与其他实参一样。
10、函数指针形参:两种形式编写
① void useBigger(const string &, bool(const string&s, const string &));
② void useBigger(const string &, bool (*)(conststring &s, const string &));
11、返回指向函数的指针
int (*ff(int))(int *, int); //阅读函数指针声明的最佳方法是从声明的名字由里而外理解。
ff(int),将ff声明为一个函数,它带有一个int型的形参,该函数返回int (*)(int *,int);它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是int *型和int型的形参。
使用typedef可使该定义更简明易懂:
typedef int (*PF)(int *, int);
PF ff(int); //ff returns a pointer to function