在很简单的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的意思。不管怎么说,这一点是需要继续学习的。