C++入门基础

命名空间

在项目中使用的变量、函数和类的名称都会存在全局作用域中,可能会导致很多冲突。所以使用命名空间的目的是对标识符的名称进行本地化,避免命名冲突。

//1.普通定义
namespace a
{
	int m;//可以定义变量,也可以定义函数
	int add(int x, int y)
	{
		return x + y;
	}
}


//2.可以嵌套定义
namespace b
{
	int n;
	int add2(int x, int y)
	{
		return x + y;
	}

	namespace c
	{
		int p;
		int add3(int x, int y)
		{
			return x + y;
		}
	}
}

//3.如果命名空间的名称相同,编译器最后会合成一个命名空间
namespace a
{
	int q;
	int add4(int x, int y)
	{
		return x + y;
	}
}

定义了一个新的命名空间,就相当于定义了一个新的作用域。
命名空间的使用:

namespace a
{
	int m=10;
	int add(int x, int y)
	{
		return x + y;
	}
}

//1.命名名称加作用域限定符
int main()
{
	printf("%d", a::m);
	return 0;
}

//2.using引入成员
using a::m;
int main()
{
	printf("%d", m);
	return 0;
}

//3.using namespace引入
using namespace a;
int main()
{
	printf("%d", m);
	return 0;
}

缺省参数

缺省参数是在声明或定义函数时为参数指定一个默认值。在使用该函数时,若没有给定实参就使用该默认值。

//全缺省参数
void fun1(int a=10,int b=20,int c=30)
{
	//...
}

//半缺省参数
void fun2(int a , int b = 20, int c = 30)
{
	//...
}

注意:
1.半缺省参数需从右往左依次给出,不能跳过
2.缺省参数不能在函数声明的定义同时给出
3.缺省值需为变量或全局变量

函数重载

同名函数,但形参列表(参数个数、类型、顺序)必须不同

int add(int x, int y)
{
	//...
}
int add(double x, double y)
{
	//...
}

为什么C++支持函数重载,而C语言不支持函数重载:
因为函数名修饰规则不同:
下面通过声明未定义的方法看一下c++中函数的命名规则:

int add(int x, int y);
int add(double x, double y);

int main()
{
	add(1,2);
	add(1.1, 2.2);
	return 0;
}

在这里插入图片描述
再来看看C语言的命名规则:

int add(int x, int y);
//int add(double x, double y);

int main()
{
	add(1,2);
	//add(1.1, 2.2);
	return 0;
}

在这里插入图片描述
C++的命名还包括了参数的类型,而C语言中有函数的名称,所以C语言没有函数重载。

拓展一下程序运行的阶段:
在这里插入图片描述

引用

引用没有开辟新空间,而是给一个已存在的变量定义一个别名,共用一个内存空间。

1.引用在定义时必须初始化
2.一个变量可以有多个引用,给引用引用也可以(给别名取别名)
3.一旦引用了一个实体,就不能引用其他实体

void test()
{
	int a = 10;
	int& b = a;
	printf("%p\n", a);
	printf("%p\n", b);
}

使用场景:

//1.做参数
void test1(int& x, int& y)
{
	int temp = x;
	x = y;
	y = temp;
}
//2.做返回值
int& count()
{
	int n = 2;
	//返回n的别名
}

这里就要提到传值返回和传引用返回的区别:传值返回返回的值会储存在一个临时变量中,传引用返回则返回的时其的别名,同一块空间,出了该函数,如果栈帧没有覆盖值不会改变,若改变了后果就不堪设想。
所以函数返回时,出了函数作用域,返回对象还未返回给系统时,可以使用引用返回,若已经返回给系统了,则必须用传值返回。

内联函数

内联函数是为了避开C语言的宏做的提升,用inline修饰函数,不用建立栈帧。
先说说宏的优缺点:
优点:1.没有严格的类型要求
2.针对频繁调用的小函数,可以不用再建立栈帧,提高效率
缺点:1.语法坑较多
2.不能调试(预编译阶段就进行了替换)
3.对类型没有安全检查

inline对于编译器来说只是一个建议,编译器会自动优化,对于函数体内有循环、递归等,编译器会选择忽略内联。inline不建议声明和定义分离,如果分离的话,当inline被展开时,找不到函数地址。

auto

作为类型指示符,依据初始化表达式决定auto实际类型。

int main()
{
	int a = 0;
	auto b = a;
	auto c = 'a';

	cout << typeid(b).name << endl;
	cout << typeid(c).name << endl;
	return 0;
}

注意:
1.不能作为函数的参数
2.不能声明数组

指针空值nullptr

nullptr是为了衔接C语言中的错误,提出的改正,使用时不需要包含头文件,建议最好使用nullptr
c头文件中的代码:

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

如有错误,欢迎提出。码字不容易,点个赞再走吧~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值