8年前读大一的时候上过《C++基础》,才了解到当时所学的C++距今已发生了很多变化。
1. namespace
namespace,命名空间,是一种将程序库名称封装起来的办法。怎么理解呢?就是我要定义相同的类、函数时,可能会出现类名、函数名相同的情况,但是我不想因此造成重写@override,怎么办?我们采用namespace定义类和函数的作用范围。
namespace firstplace{
public:
class A{ ... };
}
namespace secondplace{
public:
class A{ ... };
}
这有点像java中的package用法,但是java规定了public class A只能有一个。而C++来说,我用不同的命名空间,虽然使用的类名字相同A,也都是public,但却是不同的类。
# include <iostream>
namespace firstplace{
int main(){
A* a = new A(); //firstplace中的class A
... ...
delete a;
}
}
... ...
namespace secondplace{
int main(){
A *a2 =new A(); //secondplace中的class A
... ...
delete a2;
}
}
如上的例子,如果不使用namespace那将变成如下,用::声明调用区域。
# include <iostream>
int main(){
firstplace :: A* a = new firstplace::A(); //firstplace中的class A
secondplace :: A *a2 =new secondplace::A(); //secondplace中的class A
... ...
delete a;
delete a2;
}
2. iostream
iostream是C++的标准输入/输出库,可以理解为java语言中的import java.util.*一样。不同的是java需要import的包特别多:例如java.lang.*; java.collection....。iostream对于C++来说,囊括了很多功能函数。
# include <iostream>
# include <iostream.h>
需要注意的是,早前C++和C共用点很多,例如“# include <iostream.h>”其实导入的是C库,使用的是全局命名空间。全局的意思就是只要导入该库,库函数就可以被任意地call,但是不可修改或定义和库函数同名的函数。
#include <iostream>导入的是STL库,没有后缀,和#include <iostream.h>是两个不同的文件。而且#include <iostream>不是全局命名空间,则需要声明命名空间, 如"firstplace :: A",或者一劳永逸,“using namespace firstplace”。这样我可以正常使用iostream里面库函数,例如cout, cin。