C++基础一(命名空间、缺省参数、函数重载)

目录

命名空间

概念

用法

作用

特性

注意事项

使用场景

缺省参数

概念

用法

作用

特性

注意事项

使用场景

函数重载

概念

用法

作用

特性

注意事项

使用场景

总结

命名空间

概念

命名空间是在全局域中开辟出一个独立的作用域,这个作用域中可以定义变量,函数,类等,作用域内定义的实体,允许重名。

用法

必须在全局作用域内

定义时:
namespace a
{
	class tab
	{
	public:
		int a;
	};
	int a = 10;
	int add(int a, int b)
	{
		return a + b;
	}
}

使用时,需要作用域限定符::

int main()
{
    a::tab x;
    x.a=10;
    printf("%d\n",a::a)
    return 0;
}

作用

编程中可能会出现大量的同名的实体,命名空间避免了这一问题。

特性

1、改变了查找的规则

C++中默认的查找规则是局部变量优先,如果局部变量找不到,那么报错,查找的顺序是从下到上,命名空间限定后,直接到命名空间中查找,如果找不到就会直接报错。

2、全局定义,不影响实体的生命周期

命名空间的实体是全局的,生命周期随着整个工程,不会因为是在{}内,括号结束就结束。

3、名字相同的作用域会自动合并

a头文件中进行如下定义
#include<iostream>
#include<stdlib.h>


namespace bit
{
	int a = 10;

}
b头文件中进行如下定义
namespace bit
{
	int b = 5;

}
int main()
{
	printf("%d\n", bit::a);
	printf("%d\n", bit::b);
	system("pause");
	return 0;
}

 使用时,a,b头文件中会在编译阶段自动进行合并,合并的规则是同级同名的才会合并。

注意事项

使用时总是加上命名空间名比较麻烦,可以选择部分简化或者全部简化

部分简化命名空间名,是指对命名空间中的实体使用using命令,可以在使用时方便一些。

格式: using N::XX(N为命名空间名,XX为实体名)。

全部简化命名空间名,是指对命名空间使用using命令,使用时完全不加命名空间名,但是会有冲突。

格式: using namespace N。

使用场景

命名空间适合全场景使用,特别是大型项目,多人协作,可以多人编辑一个命名空间的内容,也可以多人编辑多个命名空间的内容。

缺省参数

概念

缺省参数是给函数的参数设一个默认值,当没有合适的实参传递给参数时,函数会使用默认的参数。

用法

int add(int a=10, int b=5)
{
	return a + b;
}

int main()
{
	printf("%d\n", add());
	system("pause");
	return 0;
}

作用

在不确定参数时,可以先使用默认参数。

特性

1、分为全缺省与半缺省。

全缺省
int add(int a=10, int b=5)
{
	return a + b;
}
半缺省
int add(int a, int b=5)
{
	return a + b;
}

2、C语言不支持

注意事项

1、缺省必须从右到左。

int add(int a, int b=5)
{
	return a + b;
}

从左到右缺省,会在编译时报错。 

2、声明和定义不可重复,因为声明和定义可能不统一,编译器不知道用哪一个,缺省放在声明里比较好(编译时报错)。

3、缺省值必须是常量或者全局变量,否则编译器无法确定参数大小,无法开辟栈帧。

使用场景

缺省参数实用的地方在开辟栈上,比如一个栈无法确定大小时,可以使用缺省参数先开辟。

void StackInit(Stack* ps,int x)
{
	assert(ps);
	int newcapacity = x;
	Datetype* newps = (Datetype*)malloc(sizeof(Datetype)*newcapacity);
	if (newps == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps->_Date = newps;
	ps->_Top = 0;
	ps->_Capacity = newcapacity;
	
}

函数重载

概念

相同的作用域,同名但参数列表不同的函数,编译器通过实参的类型判断调用哪个函数,影响调用的有参数类型,参数个数,参数次序不同

用法

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

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

int main()
{
	std::cout << Add(1,2) << std::endl;
	std::cout << Add(1.2, 2.5) << std::endl;
	system("pause");
	return 0;
}

作用

为了避免同名函数的冲突。

特性

1、编译时,编译器会将函数名及其之后的参数类型合并修饰成新的函数名,放入符号表,所以影响修饰后的函数名的几个因素是函数名,参数类型,参数类型的个数,参数类型的次序。

比如ADD(int a,float c)编译器修饰后为,ADDIF;

2、调用时,编译器会按照实参的类型进行推演,根据推演调用合适的函数。

注意事项

1、C语言不支持函数重载。

2、函数重载与参数类型有关

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

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

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

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

3、返回值不能作为函数重载的依据,返回值可以加入到函数名里面,但是调用时不能确定返回值的类型,会产生二义性。 

使用场景

函数重载适合用于多个函数同名的场景。

总结

命名空间可以使变量重名,函数重载可以是函数重名,缺省参数是给函数形参一个默认的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值