前端学C++

138 阅读2分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

函数对各种数据结构的处理

函数与数组

之前没有注意和强调的一点,C++将数组的名字视为该数组第一个元素的内存地址,即 arr = &arr[0],而这一点具体到函数上来,就是数组作为函数参数时,其实传的参是一个地址,所以函数声明和定义也要是相应的指针类型:

int sum_arr(int* arr, int n);
int sum_arr(int* arr, int n){
    int total = 0; 
    for (int i = 0; i < n; i++) 
        total = total + arr[i]; 
    return total;
}    

但实际上,在且仅在函数定义时,以下的定义也是可行并同义的:

int sum_arr(int arr[], int n);

此时他们都代表arr是一个指向int类的指针。 由于数组名代表数组第一个元素地址的特性,可以玩出些花样来:

int cookies[8] = {1,2,4,8,16,32,64,128};
int sum = sum_arr(cookies+4,4)  
std:cout<<sum \\ 输出数组后4项的和,为240

函数与字符串

在C++中表示字符串的方法:

  • char 元素组成的数组:char ghost[15] = "galloping"
  • 字符串字面量:"galumphing"
  • 指向字符串的指针:char * str = "galumphing"; 它们本质上都是指向char类型的指针(即char *,这点跟数组很像),因此在函数中,其声明与定义也可用unsigned int c_in_str(const char * str, char ch);unsigned int c_in_str(const char str[], char ch);这样的语法。

值得注意的是,在函数中想返回一个字符串的时候,是没办法直接返回这个字符串的(函数执行完毕内存被回收),相应地应该返回这个字符串的指针。

函数与结构体

结构体和数组不太一样,函数在调用结构体的时候可以按值传递,也可以返回一个结构体。相对而言,由于某些结构体很大,按值传递会导致较多内存空间的浪费,传指针会更好。

函数默认参数

函数默认参数是大多数语言都有的特性,C++关于函数默认参数的规定如下:

void defaultFunc(int i, int j, float m=1.0) \\ 可
void defaultFunc(int i, float m=1.0int j)  \\ 不可,默认参数只能出现在参数列表尾,不然调用时语义不明确
defaultFunc(2, 1) \\ 等同于defaultFunc(2, 1, 1.0)
defaultFunc(2, 1, ) \\ 这种语法是不允许的