一.命名空间
1.为什么要有命名空间
为了解决全局域上命名冲突的问题。
2.语法
namespace AA1
{
int a = 10
int b = 20;
}
namespace AA2
{
int a = 30;
int b = 40;
}
注意:在C语言中花括号里面的内容也属于一个域(例如下面在main函数里定义了两个a,因为两个a在不同的作用域下所以可以同时存在)
int main()
{
int a = 40;
cout << a << endl;
{
int a = 30;
}
return 0;
}
3.命名空间可以无限嵌套
#include<iostream>
using namespace std;
namespace AA1
{
int a = 10;
namespace AA2
{
int a = 20;
namespace AA3
{
int a = 20;
}
}
}
int main()
{
cout << AA1::a << endl;
cout << AA1::AA2::a << endl; //调用时必须要指定确定的域
system("pause");
return 0;
}
4.using namespace std
①如果没用using namespace std(例如想用cout就会报错说cout未声明,因为C++库里面的所有东西基本都放在std命名空间)
②如果不想写using namespace std,而调用cin或cout,则必须在前面加上前缀std::cin。
二.函数重载
1.重载的定义
在同一个作用域下,函数名相同,函数的参数不相同(参数的类型不相同或参数的个数不相同)
2.为什么C++有函数重载而C语言没有
因为C++中有函数名修饰规则,而C语言没有函数名修饰规则。
3.验证函数名修饰规则(以Linux系统为例)
①首先在vim里编写一个test.c程序(该程序包含两个fun函数,他们的的函数名相同,函数的参数不同)
#include<stdio.h>
void fun(int i)
{}
void fun(char ch)
{}
int main()
{
fun(11);
return 0;
}
②采用gcc编译,则会出现如下错误
若采用g++编译,则可以编译通过
③我们可以通过查看汇编代码,来查看函数名修饰规则(编写的程序经过g++编译后,生成的汇编代码如下,Linux修饰后的函数名一般以_Z开头,3表示函数名的长度,fun为函数名,fun后面的i或c表示参数类型int或char)
4.函数重载的使用
①如何根据一组重载的函数来调用合适的函数?
- 在函数调用过程中,编译器会根据实参的个数或实参的类型来选取不同的函数实现。
②例如:
#include<iostream>
using namespace std;
int Add(int x,int y)
{
return (x+y);
}
double Add(double x,double y)
{
return (x+y);
}
int Add(int x,int y,int z)
{
return (x+y+z);
}
int main()
{
cout<<Add(2,3)<<endl; //结果为5
cout<<Add(2.1,3.0)<<endl; //结果为5.1
cout<<Add(2,3,4)<<endl; //结果为9
return 0;
}
③在函数重载中应该注意的问题:
- 重载函数必须具有不同的参数个数或不同的参数类型,若只有返回值的类型不同是不行的。(即不能根据返回值来判断两个或多个函数构成重载)
- 当函数的重载带有默认参数时,应该注意避免二义性,例如:
int fun(int a,int b=0); int fun(int a);
是错误的。如果有函数调用fun(2)时,编译器无法准确地确定应调用哪个函数。
5.函数重载与extern“C”
①如果 C++程序要调用已经被编译后的C 函数,该怎么办?
- 假设某个C 函数的声明如下:void foo(int x, int y);
- 该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。
- 因此C++提供了一个C连接交换指定符号extern“C”来解决这个问题。
②使用extern “C”
例如:
extern “C”
{
void foo(int x, int y);
⋯ // 其它函数
}
这就告诉C++编译译器,函数foo 是个C 连接,应该到库中找名字_foo 而不是找_foo_int_int。
三.缺省参数
1.全缺省
int Add(int a = 2, int b = 3, int c = 10)
{
return a + b + c;
}
2.半缺省
注意:当有多个参数时,如果想要缺省参数,则必须从右向左缺省(而且必须连续),下面是对的。
int Add(int a, int b, int c=10)
{
return a + b + c;
}
int main()
{
cout << Add(2, 3) << endl; //结果为15
system("pause");
return 0;
}