C++ 函数学习笔记

作者:袖梨 2022-06-25


函数

创建自己的函数必须自行处理这3方面 - 定义、提供原型和调用。

库函数是已经定义和编译好的函数,同时可以使用标准头文件提供其原型,因此只需要正确的调用这种函数即可。

C++对于返回值的类型有一定的限制:不能是数组,但可以是其他任何类型 ―― 整数、浮点数、指针,甚至可以是结构和对象!(虽不能直接返回数组,但可以将数组作为结构或对象组成部分返回。)

函数原型不要求提供变量名,有类型列表就足够了。C++中函数原型是必不可少的。

函数和数组

C++将数组名解释为其第一个元素的地址:

cookies == & cookies[0]

cookies[i] == *(cookies + i)

该规则有一些例外:

1、数组声明使用数组名来标记存储位置
2、对数组使用sizeof得到整个数组的长度
3、将地址符&用户数组名时,将返回整个数组的地址,

数组的函数原型

int sum_arr(int arr[], int n)

int sum_arr(int *arr, int n)

传递常规变量时,函数将使用该变量的拷贝;但传递数组时,函数将使用原来的数组。
为了防止函数无意中修改数组的内容,可在声明形参时使用关键字const

void show array(const double ar[], int n);

指针和const

1、让指针指向一个常量对象,可以防止指针来修改指向的值。

int age = 39;

const int * pt = &age;

pt的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对pt而言,这个值是常量。例如,pt指向age,而age不是const。可以直接通过age变量来修改age的值,但不能使用pt指针来修改它。
const只能防止修改*pt指向的值,而不能防止修改pt的值。也就是说可以将一个新地址赋值给pt。

可以将常规变量赋值给指向const的指针,因此还有两种可能:将const变量的地址赋值给指向const的指针、将const的地址赋值给常规指针。

const float g_earth = 9.80;

const float *pe = &g_earth; //valid

 

const float g_moon = 1.63;

float *pm = &g_moon; //invalid

2、将指针本身声明为常量,这样可以防止改变指针指向的位置。

int sloth = 3;

const int * ps = &sloth; // a pointer to const int

int * const finger = &sloth; //a const pointer to int

关键字const的位置不同,使得finger只能指向sloth,但允许使用finger来修改sloth的值。中间的声明不允许使用ps来修改sloth的值,但允许将ps指向另一个位置。简而言之,finger和*ps都是const,而*finger和ps不是。

3、指针和值均为常量

double trouble = 2.0E30;

const double * const stick = &trouble;

此时,stick只能指向trouble,并且不能用stick来修改trouble的值。

函数和C-风格字符串

C-风格字符串由一系列字符组成,以空字符结尾。数组相关知识也适用于C-风格字符串。例如,将字符串作为参数时意味着传递的是地址,也可以使用const来禁止对字符串进行修改。
将字符串作为参数传递给函数,有3中表示字符串的方式:

char数组;

用引号括起的字符串常量(也成为字符串字面值);
被设置为字符串的地址的char指针

char ghost[15] = "galloping";

char * str = "galumphing";

将字符串作为参数来传递,实际上传递的是字符串第一个字符的地址。意味着函数原型应声明为 char *类型。
C-风格字符串与常规char数组之间的一个重要区别是,字符串有内置的结束字符,这意味着不必将字符串长度作为参数传递给函数。

函数和string对象

虽然C-风格字符串和string对象的用途几乎相同,但与数组相比,string对象与结构更相似。例如,可以将一个结构赋给另一个结构,也可以将一个对象赋值给另一个对象。可以将结构作为完整的实体传递给函数,也可以将对象作为完整的实体进行传递。如果需要多个字符串,可以声明一个string对象数组,而不是二维char数组。

函数和结构体

与数组名就是数组第一个元素的地址不同的是,结构名只是结构的名称,要获取结构的地址,必须使用地址运算符&。

传递结构的地址

调用函数时,将结构的地址(&st)而不是结构本身(st)传给给它;
将形参声明为指向st的指针,即st *类型。如果不允许修改结构,可以使用const修饰符;
由于形参是指针而不是结构,因此应用间接成员运算符(->),而不是成员运算符(.)。
函数指针

与数据项相似,函数也有地址。函数的地址是存储其机器语言代码的内存的开始地址。可以编写将另一个函数的地址作为参数的函数,这样子第一个函数将能够找到第二个函数,并运行它。函数名即为函数的地址

相关文章

精彩推荐