C++ primer 中文第三版 阅读笔记 第七章

来源:互联网 发布:李明老师讲linux视频 编辑:程序博客网 时间:2024/06/05 10:31

一、数组参数的传递

1. 数组永远不可能传值方式传递

2. 假如有f(int a[]) 或者 f(int *) 或者 f(int []) 或者f(int [10])这些都是一样的,他们是别的都是int * 并不是我们想的是个数组,首先它是不带长度的,并且int a; f(&a),这个是有潜在问题的。对于f(int [10])这种定义,int a[2],f(a);这个并不是长度为10的数组,也有潜在问题。总之,牢记一句话都是int *的,并不等价于数组。

3. 为了避免上面的问题,我们有一个好办法。就是传递数组的引用。具体使用是f(int (&a)[10]),这样他就要求传递的数据必须是长度为10的int类型数组了。像int a; f(&a)编译器就会报错的。int a[2], f(a)也会报错的。

总之一般数组传递有这样2种用法:

void fun(int a[], int size);//这种是有一定类型风险的,但用法灵活

void fun(int (&a)[10]);//这种对于类型还是比较安全的,但他要求就必须是长度为10的数组。用法比较死板

另外,对于多维数组,必须至少要指明除第一维的其他所有维的长度,传递int a[][10] ok, 但是int a[][] 或 int a [10][]就不ok了


二、缺省实参

void fun(int a = 1, int b = 2);

1. 调用时:

1>. fun(2) 相当于调用了 fun(2, 2)

2>. fun() 相当于调用了fun(1, 2)

3>. fun(, 2)不等价于fun(1, 2)

这是因为缺省参数只能替换已提供参数的后面的部分。

2. 另外,以为缺省参数是从参数尾部通过位置确定的,所以假如有缺省参数那么必须从最左边的缺省参数到参数尾部所有参数都设置缺省参数。

所以:

void fun(int a, int b = 1, int c, int d = 2);

这个定义是不对的,主要问题在于b,它定义了缺省参数,但是c并没有定义,所以错误。应该为

void fun(int a, int b = 1, int c = 0, int d = 2);

3. 一个参数只能在一个文件被设置一次缺省参数

三、未知个数参数

用...来表示

用法 fun(int a, ...)

va_start、va_arg、va_end来访问未知参数,需要#include<cstdarg>

va_list arg_ptr;

va_start(arg_ptr, a) 函数将参数arg_ptr设置为可变参数列表的第一个参数。

int b = va_arg(arg_ptr, int)将arg_ptr的int类型数据返回,将arg_ptr后移。

va_end(arg_ptr)将参数arg_ptr设置为可变参数列表的最后一个参数。


四、返回值

一般都是值返回分为值返回和引用返回。值返回是很常见的返回,这里讲一下引用返回。

为什么要引用返回呢?因为值返回是要一个赋值的,这样子效率会降低,利用引用返回会快一些。

引用返回一定要注意不能是返回局部变量,因为它是声明在栈里的,函数结束后空间被释放,返回引用无效。

用法

int &get()

{

return 0;

}

但是要是仅仅是为了效率考虑,不希望返回值被修改可以这样用

const int &get();


五、内联函数

inline

inline函数必须调用该函数在每个文本文件中的定义,对于不同文件,假如出现了同名的内联函数,那么定义必须一样。注意这里说的是定义,不是实现。这样子的话一般建议放在头文件中。


六、c++中编写c

extern "C" , 它可以控制一个函数的定义,也可以控制一个语句块。但要注意,它不能出现在函数中(包括main函数)。

一般用法是这样的

extern "C" int get();

extern "C"

{

int get();

void set();

}

这样是错误的

void main()

{

extern "C" int get();

}


七、main()函数

int main(int argc, char * argv[])


argc是命令个数,argv是空格分开的char*数组。可以用argv[i]访问。

原创粉丝点击