关键词:命名空间,cout(标准输出),cin(标准输入),缺省参数。
本文章对cout,cin,缺省参数浅尝辄止。
目录
命名空间
在软件开发的过程中,我们往往会给变量取一些有意义的名字,以方便开发以及后续的维护。
但当一个软件的体量足够大的时候,就很有可能会出现变量或函数命名的冲突。当程序的体量大到一定程度的时候,抛开有些猛人可以一个人扛起整个程序的所有,大家都是普普通通的平凡人,往往都是通过多人协作,一人负责一个模块来完成的。在这种开始各自为政,最后合而为一的情况下,很有可能每个人各自的代码都通过了编译,但结合到一起的时候就出现各种各样的命名冲突。总不能每个人的变量及函数命名都写成“小组_姓名_变量名”的形式吧?于是,命名空间应运而出。
namespace name{
//variables, functions, classes
}
//name即命名空间的名字。
在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。namespace关键字的出现就是针对这种问题的。
命名空间有时也被称为名字空间、名称空间。
命名空间中可以包括变量、函数、类、typedef、#define 等。
在命名空间外使用明明空间内的变量时,通常有三种方法
1.使用域解析操作符 ::
namespace test {
int t1;
int t2;
long fun() {
return 0;
}
}
int main() {
test::t1 = 1;
test::t2 = 2;
test::fun();
return 0;
}
如果命名空间中的某个变量需要使用的次数比较多,这种方法反倒会导致很多无谓的工作量。
2.使用using关键字声明命名空间中某个变量(或函数等)
namespace test {
int t1;
int t2;
long fun() {
return 0;
}
}
using test::t1;
using test::fun;
int main() {
t1 = 1;
test::t2 = 2;
fun();
return 0;
}
这是在使用C++库提供的命名空间时,最推荐使用的。
3.使用using关键字声明整个命名空间
namespace test {
int t1;
int t2;
long fun() {
return 0;
}
}
using namespace test;
int main() {
t1 = 1;
t2 = 2;
fun();
return 0;
}
在使用C++库提供的命名空间时,其实并不是很提倡这种方法,因为C++库提供的命名空间中所定义的变量及函数等实在太过庞杂,如果直接将库提供的整个命名空间声明过来,很难保证不会出现命名冲突等问题。
简单了解C++头文件
简单了解过C++的朋友肯定都知道,C++最初版本的名字叫做C With Class,它是在C语言的基础上拓展而成的。而已经使用C++进行过一些简单编程的朋友肯定也注意到了,C++自己的头文件在命名上是没有 .h 后缀的。
实际上一开始C++自身的头文件也是有 .h 后缀的,但那时非常古远的时候了,那时候C++还没有引入命名空间这个概念的。一切都在命名空间到来的那一刻改变了。
由于命名空间的引入,开发C++的大佬们决定重新编写C++库,将类,函数,宏等整合到一个命名空间中,这个命名空间就是我们在C++编程中会普遍用到的 std ,即standard,标准命名空间。
革新往往伴随着矛盾与冲突,毕竟当时C++又不是什么初出茅庐的新语言了,有不少的项目都已经用老版的C++开发出来了,C++一旦如此革新,岂不是意味着曾经的那些代码还需要再修改一遍?
开发C++的大佬们有了一个好主意,保留原来的库和头文件,它们在 C++ 中可以继续使用,然后再把原来的库复制一份,在此基础上稍加修改,把类、函数、宏等纳入命名空间 std 下,就成了新版 C++ 标准库。这样共存在了两份功能相似的库。为了避免头文件的重名,新版的C++库取消了后缀 .h 。
既然要改,只修改整合C++的库多没有意思,大佬们对C语言的头文件也下手了,同时为了表明这个头文件的原版是来自于C语言的,大佬们再C头文件的前边还贴心地加上了一个 c ,使它们变成了cstdio、cstdlib ...
cin&cout 标准输入输出
在C语言中,我们通常使用 printf 与 scanf 进行输出输入操作。但 printf 与 scanf 的输出与输入还需要通过%d %s %c %f等指定变量的类型,一不小心就会出错,着实麻烦。
对此C++提供了一套新的输入输出库。
cin 标准输入
cout 标准输出
与之配套使用的还有
<< 流插入运算符
>> 流提取运算符
endl end of line结束一行,可以刷新缓冲区
cout 与 cin 会自行处理输入的数据信息,判断数据类型。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main() {
int i = 1;
float f = 3.5;
char s[] = "i think you can see it";
cin >> i;
cout << i << s << f << endl;
return 0;
}
使用cout输出进制转换
C++库给我们提供了一系列的转换进制输出的方法
#include <iostream>
std::dec 十进制
std::hex 十六进制
std::oct 八进制
#include <iomanip>
setbase(n) n只能取8、10、16对应八进制、十进制、十六进制。
#include <iostream>
#include <iomanip>
using std::cin;
using std::cout;
using std::endl;
using std::setbase;
int main() {
cout << std::dec << 100 << endl;
cout << std::hex << 100 << endl;
cout << std::oct << 100 << endl;
cout << setbase(10) << 100 << endl;
cout << setbase(16) << 100 << endl;
cout << setbase(8) << 100 << endl;
return 0;
}
需要注意的是,cin 与 cout 都是C++的内置对象,而不是关键字。
使用 cin 的时候需要紧跟着 >> 运算符;
使用 cout 的时候需要紧跟着 << 运算符。
同时,我们可以在 cout 或者 cerr 操作结束的时候搭配使用 endl ,其作用与 '\n' 类似。
缺省参数
所谓缺省参数,指的是在声明或者定义函数的时候,为参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
#include <iostream>
using std::cout;
using std::endl;
int add(int a = 3, int b = 2) {
return a + b;
}
int main() {
cout << endl;
cout << add() << endl;
return 0;
}
运行结果:
可见,我们在函数 add 调用时并没有传入任何参数,编译器直接按照我们设置的默认参数执行了函数体。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int add(int a = 3, int b = 2) {
return a + b;
}
int main() {
cout << endl;
cout << add(6) << endl;
return 0;
}
运行结果:
当我们只输入一个参数时,编译器默认将我们输入的参数覆盖了第一个参数的默认值。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int add(int a = 3, int b = 2);
int main() {
cout << endl;
cout << add(6) << endl;
return 0;
}
int add(int a, int b) {
return a + b;
}
运行结果:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int add(int a, int b);
int main() {
cout << endl;
cout << add() << endl;
return 0;
}
int add(int a = 3, int b = 2) {
return a + b;
}
编译报错:
int add(int a = 2, int b = 3);
int add(int a = 2, int b = 3) {
return a + b;
}
int main() {
add();
return 0;
}
编译报错:
我们可以在声明或实现处传入缺省参数,但声明与实现处的缺省参数却不能同时给出,否则会发生参数重定义报错,同时,如果函数的实现在main函数之后,也会发生报错。所以,在一般情况下,我们建议缺省参数只在声明处给出即可。
以上缺省参数方法给函数所有的参数都设置了默认值,这种缺省参数方法称之为全缺省。
我们也可以只给个别参数设置默认值,这种方法称之为半缺省。
半缺省方法的参数必须从右至左依次给出。
int add(int a, int b = 2, int c = 3) {
return a + b + c;
}
//cout << add(1) << endl;
运行结果:
int add(int a = 2, int b, int c = 3) {
return a + b + c;
}
//cout << add(1) << endl;
编译报错:
int add(int a = 2, int b = 3, int c) {
return a + b + c;
}
//cout << add(1) << endl;
编译报错: