C++快速入门2

87 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

引用变量、引用形参

引用变量是其他变量的别名。

既然是引用,所以在定义是就必须指明引用变量指的是哪个变量。

int a = 3;
int &r = a;

引用变量定义后不能再引用其他变量,如:

int &r = a;
int &r = b;//(×)

引用变量和被引用变量类型必须匹配

double a;
int &r = a;//(×)

对引用变量的操作就是对被引用变量的操作

#include<iostream>

using namespace std;
int main(){
    int a = 3;
    int &r = a;
    cout << a << "\t" << r << endl;
    r = 5;
    cout << a << "\t" << r << endl;
    return 0;
}

输出:

3 3
5 5

在C语言中,为了交换两个变量的值,要使用指针:

#include<iostream>

using namespace std;

void swap(int *x, int *y){
    int t;
    t = *x;
    *x = *y;
    *y = t;
}
int main(){
    int a = 3, b = 4;
    cout << a << ' ' << b << endl;
    swap(&a, &b);
    cout << a << ' ' << b << endl;
    return 0;
}

但这种方式改变了函数的变量类型,也改变了传递的实参,这样不论是写函数还是调用函数都不方便,而使用引用就简单很多:

#include<iostream>

using namespace std;

void swap(int &x, int &y){
    int t;
    t = x;
    x = y;
    y = t;
}
int main(){
    int a = 3, b = 4;
    cout << a << ' ' << b << endl;
    swap(a, b);
    cout << a << ' ' << b << endl;
    return 0;
}

函数的默认形参、函数重载

函数的默认形参

函数的形参可以有默认值,但是有默认值的形参必须在无默认值形参的右边:

print(char ch, n=1)
add(x=1, y, z=3)//(×)
add(y, x=1, z=3)

函数重载

C++允许一个作用域有同名函数(实际名字是不同的),只要他们形参不同。

C++代码在编译时会根据参数列表对函数进行重命名,例如void Swap(int a, int b)会被重命名为_Swap_int_int,void Swap(float x, float y)会被重命名为_Swap_float_float。当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)c.biancheng.net/view/2206.h…

不同的编译器有不同的重命名方式,这里仅仅举例说明,实际情况可能并非如此。

从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。

int add(int x, int y);
double add(double x, double y);

函数名和形参列表(参数列表)构成了函数的签名

参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。

函数重载不能根据返回类型区分函数。

有一种情况要注意:

#include<iostream>

using namespace std;

int add(int x, int y){
    return x + y;
}

double add(double x, double y){
    return x + y;
}
int main(){
    cout << add(3, 5) << endl;
    cout << add(3.3, 5.5) << endl;
    cout << add(3, 5.5) << endl;//(×)
    return 0;
}

因为既可以把3变成double使用第二个函数,也可以把5.5变成int型5使用第一个函数