C++学习笔记 – 函数

函数

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

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

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

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

函数和数组

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

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

该规则有一些例外:

数组的函数原型

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 ghost[15] = "galloping";
char * str = "galumphing";

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

函数和string对象

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

函数和结构体

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

传递结构的地址

函数指针

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

-- EOF --
最后更新于: 2024-08-17 14:44
发表于: 2015-03-29 23:25
标签: C++