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)

相关推荐
枫叶丹41 小时前
【HarmonyOS 6.0】Desktop Extension Kit 正式接棒原状态栏服务,API 引用路径全面更新
开发语言·华为·harmonyos
颜安青1 小时前
【python】运算符号(后续不断补充)
开发语言·python
傻瓜搬砖人1 小时前
c语言绿皮书第三版第十章习题
c语言·开发语言·算法
一只大袋鼠1 小时前
JavaWeb四种文件上传方式(上篇)
java·开发语言·servlet·javaweb
代钦塔拉1 小时前
Qt 按钮 Lambda 信号槽重复绑定、多次触发 BUG 深度剖析与终极解决方案
c++·qt·bug
j_xxx404_1 小时前
【Linux进程间通信】硬核剖析:消息队列、信号量、内核IPC资源统一管理与mmap加餐
linux·运维·开发语言·c++·人工智能·ai
Lazionr1 小时前
数据结构堆详解:原理、实现与应用
数据结构·算法
geovindu1 小时前
Python: Condition Variable Pattern
开发语言·python·设计模式·条件变量模式
Zephyr_01 小时前
c++数据结构
数据结构·c++