笔记范围:2.7节
对于大多数人而言,学习编程的第一步就是模仿,说的直接点就是从教材上抄几段代码(比如那个知名的hello world)到机器上,然后慢慢的习惯,不错,这是一个学习语言的好方法。但是这里有个问题,人们对于已经成为习惯的东西往往不会给以思考,导致很长时间以后对于自己几乎每天都在写的句子却不知道它的具体涵义,举个例子:只要你用的是c++,那么相信你每次都少不了写这样的句子:“using namespace std;“,很多第一次见到c++源程序的初学者多数会问:what is it?而真正学了一段时间的人对于这个问题却没感觉了,然而真正该思考这个问题的却是后者,这不能不说是这个学习方法的一个大弊端,这也是我一直坚持先搞清基本概念再动手的原因。
正如我在上篇笔记中所说的:为了合作的需要使得编程成为了这个世界上最不具备个性化的行为之一,因此程序员在命名组件的时候选择的名字往往都差不多。而全局名字又不可避免,那么名字污染的概率也就非常大,理解了这些,相信对于namespac的概念的理解应该不是问题了,无非是改变了名字的可视性,当然,这不是我们最关心的,我们更想知道的是如何用好它。这样就要解决下面两个个问题。
第一:如何定义?书上给出一个比较明确的回答,形如这样:
namespace owl {
int x;
char y;
class obj { ….. };
void max( const int* );
}
但是这样的回答,我们并不是很满意,比如,我们都知道,为了减少编译时间和避免重复函数定义。往往把函数的声明放在头文件中(abc.h),而把实现放在相应的源文件中(abc.cpp)。那么名字空间该如何定义呢?难道一个”{“在abc.h,一个“}“在abc,.cpp中吗?如果真的能这样,多个头文件又该如何呢?显然这是不可能的,这个我们可以到8.5节中得到解释。现在我们只要提出这样的问题,并把它留在脑子里,不要让这个概念成为麻木的习惯,
第二:怎么用它?本节给出了三种用法,下面我们通过那个hello world 程序,作一个简单的比较。
1. using提示符:
#include <iostream>
#include <cstdib>
using namespace std;
int main()
{
cout << "hello world!" << endl;
system( "pause" );
return 0;
}
呵呵。很舒服?是吧?是的。大多数人是这个用法,但是正如书上所说,这个做法让名字空间形同虚设,我就遇到过这样的事情。有一次我写main()所在文件的时候忘了写using提示符,编译器居然给我通过了。当时真的吓了一跳的。后来才发现我include的文件已经写了。可见这个写法的弊端,万一我在不想用此名字空间的时候include了该文件,后果是有点麻烦的,当然对于std来说,这样的忧虑有些多余了,因为没人会去和ISO抢名字(恩,某些特殊人士除外)
2. 名字空间修饰符
#include <iostream>
#include <cstdlib>
int main()
{
std::cout << "hello world!" << std::endl;
system( "pause" );
return 0;
}
这个写法好是好。就是太烦,每次都得写std ,程序越长写的越多,老板又不加工资,咱不干。(什么?设别名?namespac A = std; ? 你干吧。咱还是不干)
3. using声明。
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
int main()
{
cout << "hello world!" << endl;
system("pause");
return 0;
}
恩。只声明要用的,这样不错。尽管多写了些,程序越长写的越值,呵呵。等等,这样的话。如果声明在头文件中,岂不是又回到第一个问题上去了,可以再改下,
#include <iostream>
#include <cstdlib>
int main()
{
using std::cout;
using std::endl;
cout << "hello world!" << endl;
system("pause");
return 0;
}
啊哈,妙极了,using 可以进一步改变名字的域,这个时候你肯定会问,using提示符可以这样用吗? 如果能,岂不更省事?很遗憾,不能的,你在8.5节中会找到答案,