重载与参数缺省

一、命名空间

在C语言中,同一作用域内不能出现命名相同的变量;

int a = 0;
int a = 90;
int main()
{
	//编译时就会出现如下错误:
	//e:\test.c(12): error C2374: “a”: 重定义;多次初始化
	system("pause");
	return;
}

而C++中提供了命名空间(namespace),可以很方便的解决命名冲突的问题。我们可以使用命名空间把要定义的相同的变量名隔离开来,使它们放入不同的域,从而使相同名字的变量或函数可以同时存在。

namespace var1
{
	int a = 0;
}
namespace var2
{
	int a = 90;
}
int main()
{
	//把相同名字的变量定义在不同命名空间中,就可以成功编译了
	return 0;
}

那么,该如何访问想要访问的变量呢?

#include <iostream>      
using namespace std;     //C++标准程序库中的所有标识符都被定义于一个名为std的namespace中,只有使用这个,才能正确使用cout、cin等
namespace var1
{
	int a = 0;
}
namespace var2
{
	int a = 90;
}
int a = 30;
int main()
{
	//如果直接访问变量a,发现访问的是全局域中的a
	cout << "直接访问变量a=" << a << endl;
	//要访问命名空间中的变量,就要在访问时加上域作用符::,域作用符前面是要访问的域的名称
	cout << "访问var1中的变量a=" << var1::a << endl;
	return 0;
}


如果上述代码没有用using namespace std,那么就无法编译通过;可以选择加上这一句,或者在cout和endl前加上域作用符,

如下:(但很明显,这样会很麻烦)

std::cout<<var1::a<<std::endl;

二、函数重载

C++的函数重载,要求函数的参数不同:可以是参数的个数不同,也可以是参数的对应位置的类型不同

#include <iostream>
using namespace std;
void func(int a,char b)
{}
void func(int a,int b)   //与第一个函数参数类型不同
{}
void func(char a, int b)  //与第一个函数对应位置参数不同
{}
void func()               //与第一个函数参数个数不同
{}
void func(int a, char b)  //与第一个函数参数完全相同
{}
int main()
{
	return 0;
}

经过编译,


那么为什么C++可以重载,而C语言不可以呢?

答:因为C++在编译时,会对函数名做一些修饰,这样函数名就不同了,在链接阶段根据函数名找该函数地址时可以准确的找到调用的函数。

三、参数缺省

//全缺省:在形参都赋值的情况下,实参可以不传,也可以只传前几个(传入的是位于前面的参数)
int Add(int a = 10, int b = 13)
{
	return a + b;
}
//半缺省:
int Add2(int a, int b = 23)
{
	return a + b;
}
int main()
{	
	Add();
	Add(2);
	Add(1, 2);
	Add2(1);
	Add2(1, 3);
	system("pause");
	return 0;
}







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值