C++简明分析讲解引用与函数提高及重载

目录
  • 详解引用
    • 引用的基本使用
    • 引用做函数参数
    • 引用做函数返回值
    • 常量引用
    • 引用的本质
  • 函数提高
    • 函数默认值
    • 函数占位参数
    • 函数重载及注意事项

详解引用

引用的基本使用

语法:数据类型 &新变量名 =原来变量名

作用:给变量起别名

注意事项:

1、引用必须初始化

2、一旦初始化就不能更改(具体原因在下面引用本质上会讲到)

示例:

int a = 10; int c = 20;

如果写 int &b;这是错误的,没有初始化引用,编译器不知道b指向的地址。

所以这样写 int &b=a;那么现在b是a 的别名,他们的地址相同,存放的数据也都一样。这时如果写 b=c;我们不会认为 b是c的别名,只会认为是把c的值赋给了b,当然也赋给了a

引用做函数参数

这是引用最为方便和精辟的地方了,直接代替指针来进行引用传递,我们举个最为经典的例 子:swap交换函数.

void swap(int &x,int &y)
{
	int t = a;
	a = b;
	b = t;
	cout << "swap03 a =" << a << endl;
	cout << "swap03 b =" << b << endl;
}
int main()
{
    int a = 10, b = 20;
	/*值传递形参不能修饰实参
	地址传递可以修饰实参*/
	swap(a, b);//引用做函数参数也可以修饰实参
}

这里主函数传的实参是a,b 形参是int &x,int &y;不就是int &x= a, int &y= b 吗,x和a地址相同,y和b地址相同,x和y的变化必会导致a,b的变化,因此属于地址传递,不会令编译器产生副本,节省空间的同时,代码也更简洁。

引用做函数返回值

我们知道函数语法第一个就要写函数返回值类型,在数据类型后加上&符号,就可以返回该函数的引用,有的也叫返回函数的地址,其实意思都一样,只是叫法不同罢了。

注意事项:

1、不要返回局部变量的引用

2、返回函数的引用可以作为左值

示例:

#include<iostream>
using namespace std;
int& func1()
{
	int a = 10;//局部变量放在四区中的栈区,返回后会被编译器自动销毁
	return a;
}
int& func2()
{
	static int a = 10;
	return a;
}
int main()
{
	int& ref1 = func1();
	int& ref2 = func2();
	cout << "a =" << ref1 << endl;
	cout << "a =" << ref1 << endl;//乱码
	cout << "a =" << ref2 << endl;
	func2() = 1000;//如果函数的返回值是引用,那这个函数调用可以作为左值
	cout << "a =" << ref2 << endl;
}

func1函数开辟在栈区,返回的引用会被编译器自动释放掉,main函数中我用&ref1作为func1的引用返回,并输出ref1的值,不出意外,第二次输出的时候会出现乱码,其实就是ref的新地址,func1返回的地址已经被释放掉,第一次能输出是因为编译器做出了保留。func2虽然也是开辟在栈区,但是a 的地址却是放在了全局区,由操作系统自动释放,所以返回func2的引用不会被编译器释放,而且可以作为左值变化数据,最后一个cout结构必当是1000,附上结果图。

常量引用

这个就好理解了,就是传参的时候加上const关键字,防止误操作

示例:

//打印数据函数

void showData(const int& a) {

//a=100; 这里不能做出修改,防止误操作

cout << "a=" <<a<< endl;

}

引用的本质

引用的本质是一个指针常量

编译器发现是“引用”自动将int &ref=a;转变为 int *const ref=&a;并且再给 ref赋值时,自动解引用 ref=100 改为 *ref = 100

示例:

void fun1(int &ref) //自动转变为 int *const ref=&a

{

ref = 100; //转换成*ref=100

}

C++推荐使用引用,因为引用的本质是指针常量,但是有关指针的操作编译器都帮我们做了

函数提高

学习C很快就会接触函数了,这里主要讲你少见的函数形式来做一个函数提高

函数默认值

语法:返回类型值 函数名 (形参=默认值){}

注意事项

1、如果某个位置已经有默认参数,那么从这个位置开始从左往右都要有默认值

2、声明和实现只能有一个有默认参数,如果声明的时候给了形参默认值,那么下面对函数的实现就不能再给该形参默认值

示例:

int fun1(int a, int b, int c=50);
int fun1(int a, int b, int c)
{
	return a + b + c;
}
int main()
{
	cout << fun1(10,30) << endl;
}

这里cout的结果我们都能猜到是90;如果我们修改代码给形参b默认值,而不给c默认值,就会违反第一个注意事项,这时给c也默认值就解决问题了。

函数占位参数

语法:返回值类型 函数名(数据类型){}

占位参数可以有默认参数:

void fun2(int a,int=20)

{

cout << a<<"is this is fun2" << endl;

}

调用:

fun2(10);

结果:

10is this is fun2

函数重载及注意事项

函数重载需要函数都在一个作用域下

函数名相同,提高复用性

函数参数类型不同 或者 个数不同 顺序不同

#include<iostream>
using namespace std;
void func()
{
	cout << "func 的调用" << endl;
}
void func(int a)
{
	cout << "func(int a)的调用" << endl;
}
void func(double a)
{
	cout << "func(double a)的调用" << endl;
}
void func(int a, double b)
{
	cout << "func(int a,double b)的调用" << endl;
}
void func(double b,int a)
{
	cout << "func(doubel b,int a)的调用" << endl;
}
//函数返回值不可以做重载条件
int main()
{
	func();
	func(10);
	func(12.3);
	func(10,20.1);
	func(30.1,20);
}

这里写五个func函数,四个重载,并配上提示助理解,输出结果如下:

函数重载注意事项:

1、引用可作为重载的条件

void funct(int& a)
{
	cout << "funct(int &a)的调用" << endl;
}
void funct(const int& a)
{
	cout << "funct(const int &a)的调用" << endl;
}

调用方法:int a = 10; funct(a); funct(20);重载时加上const 关键字就相当于是一个常量,调用的时候直接写入数据即可。

2、函数重载碰到默认参数

void func2(int a,int b=10)
{
	cout << "func(int a,int b)的调用" << endl;
}
void func2(int a)
{
	cout << "func(double a)的调用" << endl;
}

这里调用func2方法必然会报错,因为两个函数发生了重载,而且调用方法一致,都是

func2(数值);那么就会产生二义性,编译器无法识别调用的是哪个重载的方法。

到此这篇关于C++简明分析讲解引用与函数提高及重载的文章就介绍到这了,更多相关C++引用与函数提高内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++详细分析讲解引用的概念与使用

    目录 1.引用的概念 2.引用的格式 3.引用的特性 4.取别名原则 5.引用的使用场景 做参数 做返回值 int&Count()的讲解 传值传引用效率比较 6.引用和指针的不同点 1.引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间. 2.引用的格式 类型 & 引用变量名 ( 对象名 ) = 引用实体: 举例如下: 注意:引用类型必须和引用实体是同种类型的 3.引用的特性 (1). 引用在 定义时必须初

  • C++ 函数重载背后的原理

    目录 函数重载 函数重载的原理 为何C++可以支持重载 程序的编译链接 C语言为何不支持重载 C++为何可以支持函数重载 C++和C语言相互调用 创建静态库 C++调用C extern “C” extern “C” 原理 C语言调用C++ C++ 注意事项 extern "C"修饰的函数和一个函数完全一样 extern "C"修饰的函数和一个函数构成重载 函数重载 我们可能对函数很是熟悉,但是重载又是什么意思呢?我们先来用一个具体的场景来分享. 一天,张三的老板要你

  • C++重载运算符你真的了解吗

    目录 1.重载运算符的必要性 2.重载运算符的形式与规则 3.重载运算符的运算 4.转义运算符 总结 运算符实际上是一个函数,所以运算符的重载实际上是函数的重载,.编译程序对运算符的重载的选择,遵循函数重载的选择原则.当遇到不很明显的运算时,编译程序会寻找与参数相匹配的运算符函数. 1.重载运算符的必要性 C++语言中的数据类型分为基本数据类型和构造数据类型.基本数据类型可以直接完成算术运算.例如: #include<bits/stdc++.h> using namespace std; in

  • C++深入探究引用的使用

    目录 一. 引用的概念 二. 引用特性 三. 常引用 四. 使用场景 1. 做参数 2. 做返回值 3. 做返回值需要注意的问题 五. 传值传引用效率对比 1. 值和引用传参时的效率比较 2. 值和引用的作为返回值类型的性能比较 六. 引用和指针 一. 引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间. 类型& 引用变量名(对象名) = 引用实体: 如下: void TestRef() { int a = 10

  • c++超细致讲解引用

    C和C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,而对于结构体和对象没有这种限制,调用函数时既可以传递指针,也可以直接传递内容:为了提高效率,我曾建议传递指针,这样做在大部分情况下并没有什么不妥. 但是在 C++ 中,我们有了一种比指针更加便捷的传递聚合类型数据的方式,那就是引用 在 C/C++ 中,我们将 char.int.float 等由语言本身支持的类型称为基本类型,将数组.结构体.类(对象)等由基本类型组合而成的类型称为聚合类型(在讲解结构体时也曾使用复杂类型.构造类型

  • c++核心编程之函数的重载

    目录 1.函数重载概述 2.函数重载的注意事项 1.函数重载概述 ​作用​:函数可以相同,提高复用性 ​函数重载必须满足的条件​: 1​.同一个作用域下​ 2.​函数名称相同​ 3.函数​参数类型不同​或者​个数不同​或者​顺序不同​ ​注意​:函数的返回值不可以作为函数重载的条件 完整代码示例: // 函数重载的条件 //1,在同一个作用域中 //2,相同的返回值类型和函数名 //3,函数的参数个数不同或者参数顺序不同或者参数类型不同 void cunc() {   cout << &quo

  • C++入门(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for)

    一.C++关键字 C++总共有63个关键字,在入门阶段我们只是大致了解一下就可,在后续博客中会逐渐讲解 二.命名空间 相信学过C++的同学,一定都写过下面这个简单的程序 #include<iostream> using namespace std; int main() { cout<<"hello world"<<endl; return 0; } 我们先来看第二行代码,using namespace std , 这行代码是什么意思呢 ? 这里我们

  • C++超详细分析函数重载的使用

    目录 一.函数重载分析(上) 1.1 重载的定义 1.2 函数重载的定义 1.3 函数重载需要满足的条件 1.4 编译器调用重载函数的准则 1.5 函数重载的注意事项 1.6 小结 二.函数重载分析(下) 2.1 函数重载遇上函数指针 2.2 C++和C的相互调用 2.3 使得C代码只会以C的方式被编译的解决方案 2.4 小结 一.函数重载分析(上) 1.1 重载的定义 定义:同一个标识符在不同的上下文有不同的意义 1.2 函数重载的定义 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时

  • C++简明分析讲解引用与函数提高及重载

    目录 详解引用 引用的基本使用 引用做函数参数 引用做函数返回值 常量引用 引用的本质 函数提高 函数默认值 函数占位参数 函数重载及注意事项 详解引用 引用的基本使用 语法:数据类型 &新变量名 =原来变量名 作用:给变量起别名 注意事项: 1.引用必须初始化 2.一旦初始化就不能更改(具体原因在下面引用本质上会讲到) 示例: int a = 10; int c = 20; 如果写 int &b;这是错误的,没有初始化引用,编译器不知道b指向的地址. 所以这样写 int &b=a

  • C++简明分析讲解布尔类型及引用

    目录 一.C++中的布尔类型 二.C++中的三目运算符 三.C++中的引用 四.总结 一.C++中的布尔类型 C++在C语言的基本类型系统之上增加了bool C++中的bool可取的值只有true和 false 理论上bool只占用一个字节 C++编译器会将非0值转换为true ,0值转换为false 注意: true代表真值,编译器内部用1来表示 false代表非真值,编译器内部用0来表示 下面看一下这段代码,加深一下对bool类型的理解. #include <stdio.h> int ma

  • C++超详细分析讲解内联函数

    目录 宏函数(带参数的宏)的缺点 inline修饰的函数就是内联函数 内联函数的特点 宏函数和内联函数的区别 宏函数(带参数的宏)的缺点 第一个问题:宏函数看起来像一个函数调用,但是会有隐藏一些难以发现的问题. 例如: #define FUN(x, y) (x * y) printf("%d", add(3, 3 + 2)) //3 * 3 + 2 = 11 以上情况可以通过加 “()” 解决: #define FUN(x, y) (x * y) printf("%d&quo

  • C++简明分析inline函数的使用

    目录 inline函数 实例 要点 建议 inline函数 当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等, 这些工作需要系统时间和空间的开销. 请看如下程序段,读入一行字符串,逐个判断是否为数字字符: #include<iostream> using namespace std; bool IsNumber(char ch) { return ch>= ʹ0ʹ && ch <= ʹ9ʹ ? 1 : 0; } int main(

  • GoLang函数与面向接口编程全面分析讲解

    目录 一.函数 1. 函数的基本形式 2. 递归函数 3. 匿名函数 4. 闭包 5. 延迟调用defer 6. 异常处理 二.面向接口编程 1. 接口的基本概念 2. 接口的使用 3. 接口的赋值 4. 接口嵌入 5. 空接口 6. 类型断言 7. 面向接口编程 一.函数 1. 函数的基本形式 // 函数定义:a,b是形参 func add(a int, b int) { a = a + b } var x, y int = 3, 6 add(x, y) // 函数调用:x,y是实参 形参是函

  • C++详细分析讲解函数参数的扩展

    目录 一.函数参数的默认值 二.函数占位参数 三.小结 一.函数参数的默认值 C++ 中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 参数的默认值必须在函数声明中指定 下面看一段代码: #include <stdio.h> int mul(int x = 0); int main(int argc, char *argv[]) { printf("%d\n", mul()); printf("%d\n", mul(-1

  • C++关于const与引用的分析讲解

    目录 一.关于 const 的疑问 二.关于引用的疑问 三.小结 一.关于 const 的疑问 const 什么时候为只读变量?什么时候是常量? const 常量的判别准则 只有用字面量初始化的 const 常量才会进入符号表 使用其他变量初始化的 const 常量仍然是只读变量 被 volatile 修饰的 const 常量不会进入符号表 注:在编译期间不能直接确定初始值的 const 标识符,都被作为只读变量处理. const 引用的类型与初始化变量的类型 如果相同,则初始化变量成为只读变量

  • C++分析讲解类的静态成员函数如何使用

    目录 一.未完成的需求 二.问题分析 三.静态成员函数 四.小结 一.未完成的需求 统计在程序运行期间某个类的对象数目 保证程序的安全性(不能使用全局变量) 随时可以获取当前对象的数目 在[C++基础入门]20.C++中类的静态成员变量中每次打印对象的个数时,都需要依赖于一个对象名,下面看一个代码: #include <stdio.h> class Test { public: static int cCount; public: Test() { cCount++; } ~Test() {

  • C语言详细分析讲解内存管理malloc realloc free calloc函数的使用

    目录 C语言内存管理 一.动态空间申请 二.动态空间的扩容 三.释放内存 C语言内存管理 malloc && realloc && free && calloc c语言中为了进行动态内存管理,<stdlib.h>中提供了几个函数帮助进行内存管理. 我们知道,C语言中是没有C++中的容器或者说是python中list,set这些高级的数据结构的,我们一旦申请了一段内存空间以后这一段空间就归你了,比如我们举个例子,我们申请一个数组 int nums[

随机推荐