一个简单std::cout 引出的学习

来源:互联网 发布:淘宝客双十一怎么赚钱 编辑:程序博客网 时间:2024/06/06 02:39

在很简单的window console程序中,我写出了cout<< 语句。结果给出了错误的提示。Compiler Error C2065

 

cout没有定义。我也Includes <iostream>了,这是为何?

 

原来这里边涉及到了命名空间的问题。

 

在命名函数,类,全局变量,等等的时候,我们常常担心,自己的命名会和别人的发生冲突,这也是对于大型程序设计的一个困扰,如果两个程序员给出两个库,结果用到了一样的函数命名,那么就会造成很头疼的事情。是让谁去改名字,还是不用库了呢?所以需要在自己的函数定义之前,加入新的命名空间。比如:

 

namespace myname

{

    int Add(int, int);

}

 

那么在以后的调用过程中就可以 myname::Add,这样就消除了和别人命名同样的函数了。

 

当然,也可以在程序的一开始就 using namespace myname,但是,这样与引入命名空间的初衷有些抵触。

 

1.  命名空间可以嵌套使用。

2.  可以给命名空间赋值,生成别名的名字空间;

3.  Koening查找算法

其思想就类似与this指针的味道。比如 std::cout<< ,我们的std::cout是已经声明了命名空间,那么调用<<,就是调用了

std::operator<<(std::ostream&, const char* ). 再比如:

 

namespace personal{

          class employee {};

          void paycheck(employee *emp)

          {

          .....

           }

 

int main()

{

      personal::employee  empl;

      paycheck(&empl);

}

 

虽然paycheck是在personal中声明,只要paycheck函数的实参中包含了命名空间的信息,函数名称前就可以不用指定名字空间。

但是,如果paycheck(0), 编译器就无从选择要调用的函数了。

 

我的另外一个思考是:命名空间是和动态库的关系需要区分的,动态库的调用是有隐式调用,和显式调用的区分。显示调用不用说了,

有它的调用规则。那么隐式调用和命名空间有哪些关联呢?我觉得可以思考,是不是在import中可以加入namespace呢?当然不可以

它会不知道namespace的意思。不管怎么说,这一点是需要继续学习的。

原创粉丝点击