未经本人授权,禁止转载
这一期的全部内容几乎都是函数相关
1. 基于范围的for循环
这是C++11的新特性,下面直接给出代码示例
int num[5] = {1,2,3,4,5};
for(int x : num){
cout<<x<<std::endl;
} //遍历数组num
2. const与指针
const和指针的组合使用可以说是C++编程中非常重要的一个环节,使用得当可以更好的保护数据,使程序更加健壮。
-
const int* ptr = #
指向的num是不可通过ptr修改,ptr可以更改指向,num可以直接重新赋值 -
int* const ptr = #
ptr只能指向num,可以使用ptr修改num的值 -
const int* const ptr = #
ptr只能指向num且ptr不能用来修改num
3. 函数——声明时的参数设置
声明函数时void func(int x);
和void func(int)
在结果上没有任何区别,但是void func(int x);
这种声明方式中参数的变量名x相当于占位符。
4. 函数的参数传递
数组和结构体之类的数组结构传递的都是一个指向他们首地址的指针。
- 一维数组:
void func(int num[]);
或void func(int* num);
这两种方式的效果是完全一样的,数组作为参数时和其他情况不同,传递的并不是源数组的整体拷贝,而是指向源数组首地址指针的拷贝,,可以通过这个指针对源数组进行各种操作,如果不想让函数对源数组操作,可以使用const指令void func(const int* num);
或void func(const int num[]);
。 - 二维数组:推荐使用下面的方式,可读性更高
void func1(int array[][]);
void func2(int array[][4]); //列数固定4列
- char字符串:
char* func(char* str);
- 函数作为参数传递:
void func1(func2);
,注意func2不带括号,这样就把func2的地址传到了func1中,在func1中可以调用func2
5. 函数指针
int func(int);
int (*fptr)(int);
fptr = func; //fptr是指向函数func的一个指针
int x = (*fptr)(5); 或 int x = fptr(5); //函数指针的调用,前者清晰的指出这是一个函数指针
6. 内联函数
常规的函数需要在调用时跳转地址,耗费一定的时间,内联函数是直接使用相应的函数代码替换函数调用,速度更快但是占用更多内存,适合规模小需要反复调用的函数。
inline void func(int x);
内联函数不能递归,不能过大。
7. 引用const及其在函数中至关重要的作用
const是给变量起另外一个名字,指针是创建一个指针变量指向源变量,二者的作用类似,但是在实际使用中(依据需求)却有着很大的不同。主要区别一,const必须在定义时就表明他是谁的引用而指针不用;主要区别二,指针本身可参与运算但是引用不可,引用本质上是一个变量的两个名字。
1.const的优势
- 程序员能够修改调用函数中传递进来的的数据对象
- 因为const只是给数据对象起了另外一个名字,所以当数据对象较大时,它可以提高程序的运行速度
2.关于何时使用指针何时使用引用const,这里给出一些参考:
- 若数据对象很小,如内置数据类型或小型结构,则按值传递
- 若数据对象是数组,则只能用指针传递
- 若数据对象是结构,则使用const指针或const引用
- 若数据对象是类对象,则使用引用
8. 函数的默认参数
在函数声明是我们可以给参数一个默认值:void func(string str , int n = 1);
这样在调用func("abc");
时 n会被默认设置为1,函数不会报错。
9. 函数重载
函数名相同,参数数目类型不同的函数,返回值可以相同也可以不相同,但是函数名相同参数相同返回值不同是不允许的。
10. 函数模版
不同类型的值都采用同一算法时可以使用函数模版来代替重复的函数。
template <typename mytype> //没有分号
void swap(mytype &a , mytype &b);
int main()
{
//........
}
void swap(mytype &a , mytype &b)
{
mytype temp;
temp = a;
a = b;
b = temp;
}
当然函数模版也是可以重载的,只不过在重载函数声明前依旧要加上template <typename Anytypename>
。
网友评论