一,命名空间
1.1命名空间简介
在C++中命名空间的存在是为了解决源代码中的重名问题。想象一个团队合写一个”小区‘四害’杀防系统“的软件,你负责用户操作界面模块,小丁负责”四害“数据定义模块。写着写着,你需要定义”鼠标“,而他需要定义”耗子“,因此很可能 重复地叫”mouse"了。
在学校中一般经常会有同名的学生,在这种情况下为了避免同名的麻烦,学校一般都会把同名的学生分配到不同的班级,比如都叫陈静,一个在1班,一个在二班,这样就可以避免指代不清了。
类似的,在C++中可以给程序加上不同的命名空间(namespace),这样不同的空间下名字就可以重名了!命名空间和名字之间用符号( :: )。比如上述的例子:class one :: chenjing和class two ::chenjing。以输出两个同名的年龄为例,代码如下:
#include<iostream>
using namespace std;
namespace classone
{
int chenjing = 20;
}
namespace classtwo
{
int chenjing = 19;
}
int main()
{
cout << classone::chenjing << endl;
cout << classtwo::chenjing << endl;
}
//输出结果20 19
cout 和 endl 同样位于命名空间 std 中(整个C++标准库都位于std命名空间中)如果不引用 namespace std 那么上述输出年龄的代码将有以下的写法
#include<iostream>
namespace classone
{
int chenjing = 20;
}
namespace classtwo
{
int chenjing = 19;
}
int main()
{
std::cout << classone::chenjing << std::endl;
std::cout << classtwo::chenjing << std::endl;
}
1.2命名空间使用
1,命名空间的定义
#include<iostream>
using namespace std;
//定义一个名字为A的命名空间
namespace A
{
int x = 100;
}
//定义一个名字为B的命名空间
namespace B
{
int x = 50;
}
//调用A中的x:A::x
//调用B中的x: B::x
void test()
{
cout << "A中x= " << A::x << endl;
cout << "B中x =" << B::x << endl;
}
2,命名空间只能在全局范围内定义,因此命名空间中的变量属于全局变量
若在test函数内使用命名空间则编译器会进行报错,因此命名空间制可定义在全局变量中。
3,命名空间可以嵌套
namespace A
{
int x = 100;
namespace B
{
int x = 50;
}
}
void test()
{
cout << "A中x= " << A::x << endl;
cout << "B中x =" << B::x << endl;
}
4,命名空间可以存放函数和变量
#include<iostream>
using namespace std;
namespace X
{
int a = 10;
int Add(int x,int y)
{
return x + y;
}
}
int main()
{
cout << "X中a= " << X::a << endl;
cout << X::Add(3, 5) << endl;
}
二,输入输出
在C语言中,我们一般使用的是scanf输入,printf输出。而在C++中为我们提供了一种新的输入输出方式:使用cin,cout完成输入输出的功能。下面是一串代码示例:
#include<iostream>
using namespace std;
int main()
{
int a;
double b;
char c;
cin >> a;//键盘上输入一个整型
cin >> b >> c;//同理输入一个浮点数和一个字符
cout << a << endl;//输出即在屏幕上打印你输入a的内容
cout << b << " " << c << endl;//同理
}
根据以上代码示例我们须知几点:
1.使用cin和cout时需要包含 <iostream>头文件,以及按命名空间使用方法使用using std
2,<< 是流插入运算符 ,>>是流提取运算符
3,使用C++的输入输出的方法时,不用像C语言中printf函数那样需要%s %d等操作识别变量的数据类型,它可以自动识别变量类型。
4,cin和cout既不是关键字也不是函数,而是全局流对象,它们的用法非常的强大灵活,以上只是最基础的功能。
三,缺省参数
3.1缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值,在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参
void Func(int a = 10)
{
cout << a << endl;
}
int main()
{
Func();//输出缺省值10
Func(20);//指定参数20,则输出20.
return 0;
}
3.2缺省参数的分类
全缺省:a,b,c,全都有缺省值
void Func(int a = 10,int b = 20,int c = 30)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
int main()
{
Func();
Func(20,10);
return 0;
}
半/部分缺省:
//a 和 b 未给出缺省值即部分缺省
void Func(int a,int b ,int c = 30)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
int main()
{
Func(1,2);
Func(20,10,5);
return 0;
}
注意:1.缺省值只能从又往左依次给出,不能隔着给。例如 以上 代码,若 在main函数中写出这样的代码:Func(10, ,20)则会报错
2.缺省参数不能在声明和定义中同时出现
3.缺省值必须是常量或者 全局变量
3.缺省参数C语言不支持
四,函数重(chong)载
先看这样一串代码
int Add(int x, int y)
{
return x + y;
}
int main()
{
int ret1 = Add(1, 2);
double ret2 Add = (1.1, 2.2);
printf("%d ", ret1);
printf("%f ", ret2);
}
这是一串错误的代码,如果写了一个Add加法函数定义为int类型,则无法使用该函数进行浮点数的相加,这会导致加法函数不是那么的实用。而在C++中函数重载便很好的弥补了这样的不足
4.1函数重载的概念
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能相似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型的不同问题。
4.2函数重载的分类
参数个数不同
void Func(int a)
{
cout << a << endl;
}
void Func(int a, int b)
{
cout << a << ' ' << b << endl;
}
int main()
{
Func(1);
Func(2, 3);
}
参数类型不同
int Add(int x, int y)
{
return x + y;
}
double Add(double x, double y)
{
return x + y;
}
int main()
{
cout << Add(2.2, 3.3) << endl;
cout << Add(2, 3) << endl;
}
参数类型顺序不同
int Add(int x, double y)
{
return x + y;
}
double Add(double x, int y)
{
return x + y;
}
int main()
{
cout << Add(2.2, 3) << endl;
cout << Add(2, 3.3) << endl;
}