1.【CPP】入门(详解引用||缺省参数||函数重载)

0x01.缺省参数

1.半缺省参数只能从右往左依次给出,不能间隔着给
2.缺省值必须是常量或者全局变量
3.缺省参数不能在声明和定义时同时出现,如下图写法是错误的

//test.h
void Func(int a=10);

//test.cpp
void Func(int a=10)
{}

0x02.函数重载

1.概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)不同,常用来处理实现功能类似数据类型不同的问题。

2.函数名修饰规则

我们知道一个.c/cpp程序需要编译形成.o程序再链接形成exe可执行程序,函数会在编译阶段形成一个地址,编译器在链接时就会去找某个函数的地址,因为一般函数的实现是放在不同的cpp文件中,编译器为了去找重载函数的地址,就有了函数名修饰规则。(有关函数调用请看函数调用)
windows下编译器修饰规则较为复杂,以下演示的是g++下的修饰规则
注意:返回值不同不构成重载

int main()
{
	Add(1,1);//call _Z3Addii
	Add(1,1.2);//call _Z3Adddd
	return 0;
}

c语言gcc下就没有后面的ii,dd。只有函数名,所以无法重载。

0x03.引用

1.概念:

引用即给变量取别名,不会开辟新的内存空间。

2.引用特性

2.1.引用在定义时必须初始化
2.2.一个变量可以有多个引用
2.3.引用一旦引用了一个实体,就不能引用其他的了
2.4.可以多级引用

3.常引用

如果既要利用引用来提高程序的效率,又想要保护传递给函数的数据不能在函数中被改变,就应使用常引用。

3.1权限的放大
int main(void)
{
    const int a = 10;
    int& ra = a;
 
    return 0;
}
3.2权限的缩小
int main(void)
{
    int a = 10;
    const int& ra = a;
 
    return 0;
}
3.3.保持权限的一致
int main(void)
{
    const int a = 10;
    const int& ra = a;
 
    return 0;
}
3.4内置类型临时变量具有常性
int main(void)
{
    double d = 3.14;
    const int& i = d;  //不加const会报错
 
    return 0;
}

4.应用场景

4.1 作为参数
void Swap(int& left, int& right)
{
    int temp = left;
    left = right;
    right = temp;
}
4.2作为返回值

int& Count()
{
    static int n = 0;
    n++;
    // ...
    return n;
}

1.传值返回:函数调用完成后函数栈帧销毁,返回值作为临时变量存在寄存器中返回。
2.传引用返回:直接返回变量本身,减少了拷贝。
3.对于静态和全局变量可以使用传引用返回,而局部变量建议不要使用传引用返回。
看下面这段代码

#include 
using namespace std;
 
int& Add(int a, int b) {
    int c = a + b;
    return c;
}
 
int main(void)
{
    int& ret = Add(1, 2);
    cout << ret << endl;
    Add(10, 20);
    cout << ret << endl;  // 这里ret变成30了
 
    return 0;
}

c是一个局部变量存在函数的栈帧中,函数执行完成后会销毁栈帧,清理空间,那么c存的就是一个随机值。但在vs下销毁栈帧不会清理里面的数据,所以ret是栈帧空间中c变量位置的别名。第二次调用add时,用的还是同一块栈帧空间,而此时修改了c变量位置的值,那么ret是它的别名,ret的值因此也被修改为30.

0x04.引用与指针

在语法概念上,引用就是一个别名,没有独立空间。和其引用实体公用一块空间.
在底层实现上,引用其实是有空间的,因为引用是按照指针的方式来实现的.

⭐引用和指针不同点:
1.引用在定义时必须初始化,指针没有要求
2.引用在初始化时引用一个实体后,就不能再引用其它实体,而指针可以在任何时候指向任何同一个类型的实体.
3.没有NULL引用,但有NULL指针
4.在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占的字节个数(32位平台下占4个字节)
5.引用自加即引用的实体加1,指针自加即指针向后偏移一个类型的大小.
6.有多级指针,但没有多级引用.
7.访问实体方式不同,指针需要显式解引用,引用则编译器自己处理.
8.引用比指针使用起来更加安全.

以上就是本篇博客的全部内容,如果觉得有帮助点个赞再走

你可能感兴趣的:(CPP,c++)