C++笔记 --基本语法(命名空间/函数重载/缺省参数/引用/inline/nulltpr)

在C语言中,常常会出现命名冲突的问题,当你展开头文件时,发现别人写的函数或变量名和自己定义的一样,那么就需要通过条件编译解决,但是很麻烦

而C++就通过 关键字namespace来解决命名冲突的问题。

可以使用namespace来定义一个命名空间域,将自己的代码放入命名空间域中,而编译器编译时是默认只会查找全局和局部域的,所以就避免了命名冲突的问题

1.namespace

cpp 复制代码
//C++命名空间namespace,解决C会出现的命名冲突
namespace hj
{
	//在命名空间中有自己单独的命名空间域,程序在运行时默认只会在全局域和局部域去找,而想要访问命名空间域的成员,那么就需要指定命名空间
	int num = 0;

	int Add(int a, int b)
	{
		return a + b;
	}
}

在命名空间可以创建变量和函数,命名空间域不影响变量的生命周期

命名空间是可以嵌套的

cpp 复制代码
//C++命名空间namespace,解决C会出现的命名冲突
namespace hj
{
	//在命名空间中有自己单独的命名空间域,程序在运行时默认只会在全局域和局部域去找,而想要访问命名空间域的成员,那么就需要指定命名空间
	int num = 0;

	int Add(int a, int b)
	{
		return a + b;
	}

	namespace hj2 //嵌套命名空间
	{
		int num = 0;
	}
}

访问命名空间

访问命名空间的三种方式

1.使用 using namespace hj; 将命名空间内的成员全部展开

2.使用 using hj::ADD; 将命名空间内频繁调用的成员展开

3.使用 **hj::Add()**使用域访问操作符访问命名空间内的成员

2.函数重载

C语言中函数是不可以同名的,因为C代码在编译链接后,会从符号表中找函数在符号表中的函数名,而C中的同名函数在符号表中也是同名的,所以C语言是没有同名函数的。而C++中的同名函数在链接时创建的符号表中是根据参数的类型和个数进行创建符号名的,所以同名函数在符号表中的符号是不一样的

所以,函数重载需要函数名相同,参数个数/类型/类型顺序不同,与函数的返回值无关

cpp 复制代码
void Swap(double& a, double& b)//参数类型不同
{
	double tmp = a;
	a = b;
	b = tmp;
}

void Swap(int& a)//参数个数不同
{
	int tmp = a;
	a = tmp;
}

void Swap(double& a, int& b)//参数顺序不同
{
	int tmp = a;
	a = b;
	b = tmp;
}

3.缺省参数

cpp 复制代码
//C++缺省参数
int Add(int a = 0, int b = 0)//全缺省
{
	return a + b;
}

int Add(int a, int b = 0)//半缺省
{
	return a + b;
}
//在函数声明时,可以给函数一个默认值,当外部调用没有传参数就采用默认值。
int Add(int a, int b)
{
	return a + b;
}

缺省参数分为全缺省和半缺省,C++规定缺省参数必须从右向左依次定义。

4.cout/cin

C++的流输入cout,流提取cin

C++中输入输出不需要去指定格式去打印,直接利用cout和cin就可以实现输入输出

注意cout和cin都是命名空间std中的,所以你要使用它们需要注意

cpp 复制代码
int main()
{
    int num = 0;
	cin >> num;
	cout << num << endl;
	int a = 0;
	cout << a << endl;
	return 0;
}

5.引用

C++中的引用是给变量取一个别名,语法上引用本身不占用空间。

引用的类型就是所引用对象的类型

引用创建时必须初始化,且只能引用一个对象

引用在传参时可以减少临时变量的拷贝提高效率,并且在改变引用时同时改变引用的对象

cpp 复制代码
int main()
{
	int a = 0;
	int& ra = a;
	ra++;
	cout << ra << endl;
	return 0;
}

const引用

const引用可以引用常量、临时变量、常变量

cpp 复制代码
	const int x1= 0;
	int x2 = 1;
	const int& rx1 = x1;
	const int& rx2 = x1 + x2; 
	const int& rx3 = 10;

当引用临时变量时,此时临时变量的生命周期就变成引用的生命周期

const引用主要的作用在传参时,因为当你传参时穿的是一个常量,你使用引用是会报错的,因为常量是不允许修改的,你使用int& 就是一种权限的放大,而权限只能缩小不允许放大。

const引用可以引用变量,不过引用变量后就是一种权限的缩小

6.inline

在C语言中使用宏函数进行预处理时替换,从而减少建立栈帧的消耗,提高效率,而C++给出了inline这样更好的解决方式。

内联函数也会在函数调用处展开,减少开辟栈帧的消耗。

但是内联函数inline仅仅只是一种建议,当编译器觉得函数不适合被展开时,就忽略掉inline。

当函数被频繁调用,且代码量较少没有递归时。才会去展开inline

当没有使用inline时,函数在调用时就会执行call指令去跳转到函数的地址中

当使用inline展开之后,编译器就会将Add函数的汇编指令直接展开在函数内,就没有call和建立栈帧的过程

7.nullptr

NULL在C语言中是条件编译,实际的值是(void*)0,在C语言中这样没什么问题,因为C语言中void*可以赋给任意的指针类型,会进行隐式类型转换

但C++不可以,C++中使用nullptr,nullptr在赋给不同类型的指针时,可以隐式类型转换为任意类型的指针

相关推荐
好开心3319 分钟前
axios的使用
开发语言·前端·javascript·前端框架·html
codists22 分钟前
《计算机组成及汇编语言原理》阅读笔记:p82-p85
笔记
ladymorgana25 分钟前
【运维笔记】windows 11 中提示:无法成功完成操作,因为文件包含病毒或潜在的垃圾软件。
运维·windows·笔记
过过过呀Glik40 分钟前
在 Ubuntu 上安装 Muduo 网络库的详细指南
linux·c++·ubuntu·boost·muduo
又蓝42 分钟前
使用 Python 操作 Excel 表格
开发语言·python·excel
oneouto44 分钟前
selenium学习笔记(一)
笔记·学习·selenium
余~~185381628001 小时前
稳定的碰一碰发视频、碰一碰矩阵源码技术开发,支持OEM
开发语言·人工智能·python·音视频
蜀黍@猿1 小时前
【C++ 基础】从C到C++有哪些变化
c++
Am心若依旧4091 小时前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb