C++入门(二)

目录

一.函数重载

二.引用

三.inline

四.nullptr


一.函数重载

1.定义:在C++中,可以在同一作用域内使用同名函数 ,但要求同名函数形参不同,比如参数类型不同,参数个数不同或者参数类型顺序不同

注意只有函数返回类型不同,参数相同不构成函数重载。

2.使用

(1)参数类型不同

cpp 复制代码
#include<iostream>
using namespace std;

int Add(int x, int y)
{
	return x + y;
}
double Add(double x, double y)
{
	return x + y;
}
float Add(float x, float y)
{
	return x + y;
}
int main()
{
	cout << Add(1 , 1) << endl;
	cout << Add(1.1, 2.2) << endl;
	cout << Add(2.2f, 3.3f) << endl;//C++中小数默认double,若float,则调用时写Add(1.1f,2.2f);
	return 0;
}

(2)参数个数不同

cpp 复制代码
#include<iostream>
using namespace std;
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}

int main()
{
	f();
	f(1);
	return 0;
}

(3)参数类型顺序不同

cpp 复制代码
#include<iostream>
using namespace std;

void f(int a, char b)
{
	cout << "f(int a , char b)" << endl;
}
void f(char b, int a)
{
	cout << "f(char b , int a)" << endl;
}
int main()
{
	f(1, 'a');
	f('a', 1);
	return 0;
}

注意:下面两个函数本身构成函数重载,但调用时会报错,因为编译器不知道调用哪个函数。

cpp 复制代码
#include<iostream>
using namespace std;

int f()
{
	cout << "f()" << endl;
}

int f(int a = 0)//缺省参数
{
	cout << "f(int a)" << endl;
}
int main()
{
	f();
}

二.引用

1.定义:

引用相当于给一个变量取了新名字 ,但它不像指针会开辟新的内存空间,而是引用和它引用的变量共同用一块内存空间。

2.形式:

类型& 引用别名 = 引用对象

cpp 复制代码
int a = 0;
int& b = a;//引用,此时a就是b,b就是a

3.使用注意事项

(1)引用在定义时要初始化

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	//正确:
	int a = 0;
	int& b = a;
	//错误:
	int& c;//c无初始化
	return 0;
}

(2)一个变量可以有多个引用(注意一个变量引用多个变量,其中一个变化,其它引用的变量要一起变化)

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	int a = 0;
	int& b = a;
	int& c = a;
	int& d = b;//a b c d是同一个变量
	b++;//a c d值与b相同

	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
	cout << d << endl;
	return 0;
}


(3)引用一个实体后,不能再引用另一个实体,即C++引用定义后不能改变指向。(若又"引用"另一个变量,则当作另一个变量值赋予该变量)

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	int a = 1;
	int& b = a;

	int c = 100;

	b = c;//这里不是改变b的引用,而是将c的值赋给b(a跟b发生相同的改变)

	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
	return 0;
}


(4)引用主要用于传参和返回值(不用申请额外空间从而提高效率,同时便于简单,便于理解,而不是用复杂指针来传址调用)。

以前我们用指针传址调用,才能改变实参值:

cpp 复制代码
#include<iostream>
using namespace std;

void swap(int* x, int* y)//用指针接收
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
int main()
{
	int a = 1;
	int b = 2;
	cout << a << endl;
	cout << b << endl;
	swap(&a, &b);//传址调用
	cout << a << endl;
	cout << b << endl;
	return 0;
}

现在可以使用引用方式,实参传递不再是变量地址,而是变量本身:

cpp 复制代码
#include<iostream>
using namespace std;

void swap(int& x, int& y)//引用
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 1;
	int b = 2;
	cout << a << endl;
	cout << b << endl;
	swap(a, b);//传变量本身
	cout << a << endl;
	cout << b << endl;
	return 0;
}

易错点:函数调用结束后,a销毁,因此不能返回in&类型。

cpp 复制代码
int& func()
{
	int a = 0;
	return a;
}

(5)const引用:一般用于函数参数中

--引用const对象

cpp 复制代码
const int a = 0;
const int& ra = a;
//a只读不写 eg. a++是错的
//ra只读不写 eg. ra++是错的
 

--引用普通对象:缩小rb权限,但不缩小b的权限。(即rb只能只读不写,b可读可写)

cpp 复制代码
int b = 0;
const int& rb = b;
//b可读可写 eg. b++是正确的
//rb只读不写 eg. rb++是错误的

注意:引用只能缩小权限,不能放大权限

cpp 复制代码
const int a = 0;
int& ra = a;//错误,ra权限扩大

但可以建立新变量。(权限无放大,只是开辟新空间

cpp 复制代码
const int a = 0;
int ra = a;

--引用常量

cpp 复制代码
const int& ra = 0;//正确
int& ra = 0;//错误

--引用临时对象(临时对象:编译器需要一个空间暂存表达式的求值结果时创建的一个未命名对象,比如表达式返回值或类型转换)

cpp 复制代码
int a = 1;
const int& ra = a*3;//a*3是表达式的值,属于临时变量

double b =1.11;
const int& rb = b;//b类型需要转换,属于临时变量

(6)指针与引用关系:二者相辅相成,功能上有重叠部分,但又不能完全替代另一方。

--引用是一个变量的别名,不开空间 ;指针是存储一个变量的地址,开空间

--引用必须初始化;指针建议初始化(可以不初始化)。

--引用在初始化时引用一个对象后,不能引用其它对象;指针可以不断改变指向的对象。

--sizeof计算引用结果是引用类型大小;sizeof计算指针大小是地址空间所占字节个数(32位平台下是4字节,64位平台下是8字节)。

--引用可以直接访问指向对象;指针需要解引用才能访问指向对象。

--引用更安全;指针容易出现空指针和野指针问题,不安全。

三.inline

1.inline修饰的函数叫做内联函数 ,编译时编译器会在调用的地方展开内敛函数,这样内联函数不需要建立栈帧,达到提高效率目的。

2.可以替代#define宏函数(宏函数易出错)

3.inline适用于频繁短小的函数。(代码多一些的函数,编译器会自动忽略)

4.涉及多文件时,inline修饰的函数定义和声明一起放到头文件中(不能分开)。

四.nullptr

空指针(NULL在C++中被定义字面常量0)

相关推荐
gugucoding10 小时前
2. 【Java】搭建Java开发环境
java·开发语言
多加点辣也没关系10 小时前
JavaScript|第9章:对象 — 基础
开发语言·javascript·ecmascript
2601_9498180910 小时前
Vector从入门到应用(C++ STL动态数组万字全解
开发语言·c++
汉克老师11 小时前
GESP2026年6月认证C++八级( 第三部分编程题(1、线网建设))精讲
c++·最小生成树·排序·kruskal·并查集·gesp8级
胖大和尚11 小时前
Linux 内核工程师、HPC工程师、C++工程师
c++·kernel·hpc
想吃火锅100511 小时前
【leetcode】56.合并区间js
算法·leetcode·职场和发展
imuliuliang11 小时前
可合并堆在多任务调度中的优势与实现技巧7
算法
学究天人11 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷6)
网络·算法·数学建模·动态规划·几何学·图论·拓扑学
汤米粥11 小时前
Python爬虫中Xpath用法之——normalize-space()
开发语言·python
wabs66611 小时前
关于动态规划【力扣72.编辑距离的思考】
算法·leetcode·动态规划