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)

相关推荐
随意起个昵称3 小时前
区间dp-基础题目1(石子合并)
算法·动态规划
吞下星星的少年·-·4 小时前
线段树模板
算法
星空椰4 小时前
Python 面向对象高级:继承与类定义详解
开发语言·python
wunaiqiezixin4 小时前
如何在C++中创建和管理线程
c++
段一凡-华北理工大学4 小时前
2026 高炉炼铁智能化技术全景与演进路径~系列文章11:演进路径与行业未来
大数据·网络·人工智能·算法·工业智能体·高炉炼铁智能化
白露与泡影4 小时前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
凯瑟琳.奥古斯特4 小时前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
雪度娃娃4 小时前
转向现代C++——在意为改写的函数添加 override
开发语言·c++
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之前缀和&差分 --【一维差分】:[NOIP 2018 提高组] 铺设道路
c++·前缀和·差分·csp·高频考点·信奥赛·铺设道路
叶小鸡4 小时前
小鸡玩算法-力扣HOT100-多维动态规划
算法·leetcode·动态规划