一、命名空间
在C语言中,我们通常会遇到一个问题,就是在给函数起名字的时候怎么起呢,大部分人用汉语拼音,高端一些的人士会用英文,但是这也避免不了会有名字冲突的情况发生,一旦名字冲突那整个工程都将无法进行编译。在C++中,引用入了命名空间的这个概念来解决这个问题,它最主要的功能就是解决了名字相互冲突的问题。
1、命名空间的定义
定义一个命名空间,需要用到 namespace 这个关键字,后面跟上 这个命名空间的名字,然后用 { }将里面的内容圈起来;
namespace A {
int Add(int left,int right) {
return left + right;
}
}
namespace B {
int Add(int left,int right) {
return left + right;
}
}
这里定义了两个命名空间 一个叫做 A 一个叫做 B,但是值得注意的是:
- 在C++中允许存在命名空间的嵌套;
- 在C++中同一个工程中,允许存在多个相同名称的命名空间,编译器最后会把他们合并成一个命名空间;
//命名空间的嵌套
namespace C {
int Add(int left, int right) {
return left + right;
}
namespace D {
int Sub(int left,int right) {
return left + right;
}
}
}
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中;
2、命名空间的使用
命名空间的使用有三种方式:
- 加命名空间名称及作用域限定符号(以命名空间 A 为例):A::Add()
- 使用using将命名空间中的成员引入(以命名空间 C 为例):using C::D
- 使用 using namesapce 将命名空间引入 (以命名空间 B 为例):using namesapce B
//1
int main() {
printf("%d",A::Add(1,2));
return 0;
}
//2
using C::D;
int main() {
printf("%d",Add(1,2));
return 0;
}
//3
using namespace B;
int main() {
printf("%d",Add(1,2));
return 0;
}
二、C++中的输出&输出
在C++中使用 cout标准输出(控制台)和 cin标准输入(键盘),注意必须要包含头文件 <iostream> 以及 其所对应的命名空间 std;
#include<iostream>
using namespace std;
int main(){
int a;
cin >> a >> endl;
cout << a << endl;
return 0;
}
三、缺省参数
缺省参数就是定义或者声明函数的时候为函数的参数指定一个默认值,在调用该函数的时候,如果没有指定实参则采用该默认的值,否则使用是定的实参。
void TestFun1(int a = 10) {
cout << a << endl;
}
int main() {
TestFun1(); //使用默认值10进行输出
TestFun1(2); //使用给定的实参2进行输出
return 0;
}
缺省参数有两种情况:1、全缺省参数;2、半缺省参数;
//全缺省参数
void TestFun2(int a = 1,int b = 2,int c = 3) {
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
//半缺省参数
void TestFun2(int a, int b = 2, int c = 3) {
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
需要注意的是:
- 半缺省参数必须从右向左来给出,中间不能间隔;
- 缺省参数不能再函数的定义和声明中同时出现;
- 缺省值必须是常量或者全局变量;
- C语言不支持!!
四、函数重载
函数重载通俗的理解就是在同一个作用域中声明几个功能类似名字相同的函数,但是这些函数的形参列表(参数个数、参数类型、参数顺序)是不相同的,由编译器决定最后实际允许过程中调用哪个函数。
int Add(int a,int b) {
return a + b;
}
double Add(double a, double b) {
return a + b;
}
但是注意!:不能使用函数的返回值类型来进行函数重载,比如:
short Sub(short a,short b) {
return a + b;
}
int Sub(short a,short b) {
return a + b;
}
还有,函数重载在C语言中是不可行的!主要原因是因为函数名字修饰规则不相同,在C语言中名字修饰规则很简单,只是通过在函数的名字前面添加下划线 如:“_Add()”,而在C++中则由特殊的命名方式(包含了函数的名字以及参数类型等)
//在Visaul Stdio 2013中
int Add(int left,int right); //?Add@@YAHHH@Z
double Add(double left,double right); //?Add@@YANNN@Z
double Add(int left,double right); //?Add@@YANHN@Z
对于名字修饰这个问题,其实主要原因是一个程序要运行起来主要是:预处理、编译、汇编、链接。这几个步骤,在编译的过程中,将函数、变量的名字重新改编的机制,简单的来说就是编译器为了区分各个函数的一种做法。