一、命名空间
看个栗子:
#include<iostream>
#include<stdlib.h> //rand在此头文件中被定义为函数
int rand = 0; //全局变量
int main()
{
printf("%d", rand); //打印全局变量
return 0;
}
运行结果:
错误信息: “rand” : 重定义;以前的定义是“函数”;
结论:
因为C语言无法解决这种命名冲突的问题,所以C++建立了命名空间来解决冲突问题;
命名空间的定义
定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接一对{},{}即为命名空间的成员;
命名空间的作用
对标识符的名称进行本地化,以避免命名冲突或者名字污染;
对上面的栗子加以修改:
#include<iostream>
#include<stdlib.h>
namespace bit //bit为命名空间的名字,一般开发中用项目名字做命名空间名
{
int rand = 0; //定义变量
int Add(int left, int righr) //定义函数
{
return left + right;
}
struct Node //定义类型
{
struct Node* next;
int val;
};
//命名空间可以定义变量、函数、类型
}
int main()
{
printf("%d", bit::rand); //bit::rand为命名空间使用的形式之一
return 0;
}
运行结果:
命名空间使用的三种形式
第一种方式:
int main()
{
printf("%d", bit::rand); //加命名空间名称及作用域限定符
return 0;
}
第二种方式:
using bit::rand; //使用using将命名空间的某个成员引入
int main()
{
printf("%d", rand);
return 0;
}
第三种方式:
using namespace bit; //使用using namespace命名空间名称引入
int main()
{
printf("%d", rand);
return 0;
}
二、C++输入输出
栗子:
#include <iostream>
using namespace std; //std是C++标准库的命名空间,C++将标准库的定义实现都放在这个命名空间中
int main()
{
cout << "hello,world" << endl;
return 0;
}
运行结果:
说明
1、使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含头文件以及按照命名空间使用方法使用std。
2、cout和cin时全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含头文件中。
3、<<是流插入运算符,>>是流提取运算符。
4、使用C++输入输出更方便,不需要像printf/scanf那样手动控制格式。C++的输入输出可以自动识别类型。
5、实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及到运算重载符等知识。
三、缺省函数
缺省函数的概念
缺省函数是声明或者定义函数时为函数的参数指定一个缺省值。在调用该函数时,如何没有指定实参则采用该形参的缺省值,否则使用指定的实参值。
栗子:
#include<iostream>
using namespace std;
void fun1(int a = 0)
{
cout << a << endl;
}
int main()
{
fun1(); //没有传参时,使用参数的默认值
fun1(10); //传参时,使用指定的实参
return 0;
}
运行结果:
缺省参数的分类
全缺省参数
void func(int a = 12, int b = 7, int c = 6)
{
cout << "a=" <<a << endl;
cout << "b=" <<b << endl;
cout << "c=" <<c << endl;
}
半缺省函数
栗子1:
void func(int a , int b = 5, int c = 20) //半缺省函数必须从右往左以此给出,不能间隔给
{
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "c=" << c << endl;
}
栗子2:
A.h //函数声明文件
void func(int a = 10) {};
A.c //函数定义文件
void func(int a = 20) {};
//缺省参数不能在函数声明和定义中同时出现
补充说明:
1.缺省值必须时常量或者全局变量
2.C语言不支持(编译器不支持)
四、函数重载
函数重载的概念
函数重载是函数的一种特殊情况,C++允许在统一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数 个数或 类型或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
函数重载的三种类型
1.参数类型不同
栗子:
#include<iostream>
using namespace std;
int Add(int left, int right)
{
cout << "int Add(int left,int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(int left ,int right)" << endl;
return left + right;
}
int main()
{
Add(10.20);
Add(10.0,20.0);
return 0;
}
运行结果:
2.参数个数不同
栗子:
void func()
{
cout << "func()" << endl;
}
void func(int a)
{
cout << "func(int a)" << endl;
}
int main()
{
func();
func(10);
return 0;
}
运行结果:
3.参数类型顺序不同
栗子:
void func(int a, double b)
{
cout << "func(int a,double b)" << endl;
}
void func(double b, int a)
{
cout << "func(double b,int a)" << endl;
}
int main()
{
func(10,20.0);
func(20.0,10);
return 0;
}
运行结果: