目录
1. 命名空间
1.1 命名冲突
1.2 命名空间定义
1.3 命名空间的使用
2. 输入输出
3. 缺省参数
3.1 缺省参数分类
4. 函数重载
4.1 函数重载概念
4.2 为什么C++支持函数重载而C不支持?
C++是兼容C语言的
1. 命名空间
1.1 命名冲突
我们在C语言里,是不能定义两个相同的名字。比如
在stdlib.h库中有一个库函数也叫rand,这就导致了命名冲突的问题。
在我们以后与别人合作时,定义变量或函数时用了同样的名字,项目和项目之间会冲突。在C语言中,只能一方修改名字进行解决,这就很麻烦。C++为了解决这个问题,就有了命名空间。
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
1.2 命名空间定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
普通的命名空间
namespace N1 // N1为命名空间的名称 { // 命名空间中的内容,既可以定义变量,也可以定义函数 int a; int Func(int n) { return n + 1; } }
嵌套使用命名空间
namespace N2 { int a; int b; int Func1(int n) { return n + 1; } namespace N3 { int c; int d; int Func2(int n) { return n + 2; } } }
一个工程中的多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
//再定义一个命名空间N1 namespace N1 { int Func3(int n) { return n + 3; } }
注:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
1.3 命名空间的使用
命名空间的使用有三种方式:
namespace my
{
int b = 20;
int a = 10;
}
加命名空间名称及作用域限定符int main() { printf("a = %dn", my::a); }
使用using将命名空间中成员引入
using my::b; int main() { printf("a = %dn", my::a); printf("b = %dn", b); }
使用using namespace 命名空间名称引入
using namespace my; int main() { printf("a = %dn", a); printf("b = %dn", b); }
为什么C++编程时几乎每次都要敲上using namespace std;
因为cout,cin等都是在C++标志库(std)里面定义的;
2. 输入输出
C++的输入和输出可以继续用C语言的那一套,但是C++的更加简单。
cin >> 是输入流,向cin输入的内容流到a、b里面保存起来。
cout << 是输出流,从a、b里面流出到cout中。
endl 和’n’相同,表示换行。
使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空间。
使用C++输入输出更方便,不需增加数据格式控制,比如:整形–%d,字符–%c
cout(ostream)、cin(istream)在C++中是对象,>>(流提取运算符)、<<(流插入运算符)其实是运算符重载,以后再详细讲解。
3. 缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
没有传参时,使用参数的默认值传参时,使用指定的实参
3.1 缺省参数分类
1. 全缺省参数
void Func(int a = 1, int b = 2, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func();
Func(10);
Func(10, 20);
Func(10, 20, 30);
return 0;
}
传参只能按顺序传,不能用这种TestFunc(, , 30);方式传参。
2. 半缺省参数
半缺省并不是缺省一半的参数,而是缺省部分参数。
void Func(int a, int b = 2, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func(10);
Func(10, 20);
Func(10, 20, 30);
return 0;
}
半缺省参数必须从右往左缺省,并且是连续的。
缺省参数不能在函数声明和定义中同时出现
如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
所以,只能在函数声明的时候缺省参数。
4. 函数重载
4.1 函数重载概念
C语言不支持同名函数,但是C++支持在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,与返回类型、是否为缺省参数无关,常用来处理实现功能类似数据类型不同的问题。
int Func(int a, int b)
{
return a + b;
}
double Func(double a, double b)
{
return a + b;
}
double Func(int a, double b)
{
return a + b;
}
double Func(double a, int b)
{
return a + b;
}
看看下面这几种是不是函数重载呢?
int Func(int a, int b)
{
return a + b;
}
double Func(int a, int b)
{
return a + b;
}
显然不是。因为判断是否为函数重载,与函数的返回类型无关。
4.2 为什么C++支持函数重载而C不支持?
在代码进行汇编的时候,C语言区别函数只依赖函数名,因此如果有相同函数名的函数,那么汇编中会出现两个相同的名字,这样在C语言编译连接时就无法区分该使用哪个函数。
C++区别函数依赖于函数名和形参列表。
返回值不同不能区分同名函数,而形参列表不同可以区分同名函数,这就是为什么重载函数的形参列表必须不同。
1. 全缺省参数
void Func(int a = 1, int b = 2, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func();
Func(10);
Func(10, 20);
Func(10, 20, 30);
return 0;
}
传参只能按顺序传,不能用这种TestFunc(, , 30);方式传参。
2. 半缺省参数
半缺省并不是缺省一半的参数,而是缺省部分参数。
void Func(int a, int b = 2, int c = 3)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func(10);
Func(10, 20);
Func(10, 20, 30);
return 0;
}
半缺省参数必须从右往左缺省,并且是连续的。
缺省参数不能在函数声明和定义中同时出现
如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
所以,只能在函数声明的时候缺省参数。
4.1 函数重载概念
C语言不支持同名函数,但是C++支持在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,与返回类型、是否为缺省参数无关,常用来处理实现功能类似数据类型不同的问题。
int Func(int a, int b)
{
return a + b;
}
double Func(double a, double b)
{
return a + b;
}
double Func(int a, double b)
{
return a + b;
}
double Func(double a, int b)
{
return a + b;
}
看看下面这几种是不是函数重载呢?
int Func(int a, int b)
{
return a + b;
}
double Func(int a, int b)
{
return a + b;
}
显然不是。因为判断是否为函数重载,与函数的返回类型无关。
4.2 为什么C++支持函数重载而C不支持?
在代码进行汇编的时候,C语言区别函数只依赖函数名,因此如果有相同函数名的函数,那么汇编中会出现两个相同的名字,这样在C语言编译连接时就无法区分该使用哪个函数。
C++区别函数依赖于函数名和形参列表。
返回值不同不能区分同名函数,而形参列表不同可以区分同名函数,这就是为什么重载函数的形参列表必须不同。
C语言不支持同名函数,但是C++支持在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,与返回类型、是否为缺省参数无关,常用来处理实现功能类似数据类型不同的问题。
看看下面这几种是不是函数重载呢?
int Func(int a, int b)
{
return a + b;
}
double Func(int a, int b)
{
return a + b;
}
显然不是。因为判断是否为函数重载,与函数的返回类型无关。
在代码进行汇编的时候,C语言区别函数只依赖函数名,因此如果有相同函数名的函数,那么汇编中会出现两个相同的名字,这样在C语言编译连接时就无法区分该使用哪个函数。
C++区别函数依赖于函数名和形参列表。
返回值不同不能区分同名函数,而形参列表不同可以区分同名函数,这就是为什么重载函数的形参列表必须不同。



