一、命名空间
在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;
}