<细节>关于namespace(二)

kiffa 2008-11-19 03:38:07
下面代码有什么结果:

#include <string>
#include <iostream>
using namespace std;

class string
{
public:
size_t size(){return 3;}
};

int main()
{
string s;
cout << s.size() << endl;
}

...全文
91 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiffa 2008-11-19
  • 打赏
  • 举报
回复
帮助肯定会有的。懂的多大部分时候都是无害的。细节不是主要的,但有些细节是必要的。了解细节和死钻细节毕竟是有区别的。这些细节来自TC++PL,教主对此有很好的把握。知道“为什么”总比背诵“不要那样做”好,我个人以为。

若牵涉到第三方库,如果程序员不小心的话,很容易遇到这个帖子所提到的以及将要提到的问题。同时,理解了这些,有助于你了解何时使用using namespace XXX;何时使用using XXX::YYY;何时使用XXX::YYY.它也可以让你了解C++语言本身所提倡的某些设计风格。

而我第一篇帖子所提到的参数依赖查找(ADL,argument-dependent lookup),在设计类的非成员函数接口时有着非常重要的意义(比如cout << X,它为X调用了非成员operator<<;另一个典型的例子是operator+)。理解了这些,有助于合理使用名字空间,避免无意的ADL,在使用标准库时也可能会遇到由ADL引起的微妙问题,你不能保证你永远不会遇到这些问题。

正如Herb Sutter所说:你应该不必知道这些东西,你可以通过背诵准则来避免这些问题;但如果你透彻的了解了它们,你就能更好地运用它们。

Google在其C++编程规范中大力提倡使用匿名namespace,然而我们之中又有多少人知道匿名namespace这种东西呢?

如果你在平时的编程中完全不使用namespace,那么这些东西自然没有什么用。
cyj626 2008-11-19
  • 打赏
  • 举报
回复
jf
frank_ll 2008-11-19
  • 打赏
  • 举报
回复
帮顶,挺有意思
taodm 2008-11-19
  • 打赏
  • 举报
回复
哦,那就继续语言律师贴吧。祝你以后工作中,这些律师细节对你有实际帮助。
kiffa 2008-11-19
  • 打赏
  • 举报
回复
因为我在看书学C++,刚好看到namespace这一章,所以用发帖的这种方法来加深自己的印象。因为我自己的经验,看书要高效,第一,写代码;第二,写读书笔记;第三,把看到的东西讲给别人听。所以我才发这几个帖子,讲一些我自己也不熟悉的内容。

如同上面几位所说,有两个string,无法得知用哪个来 string s。

这帖的本意是说明全局对象和namespace相比,并没有优先权。之所以会这样,教主的解释是尽力打压全局对象,减少全局对象的使用,避免污染全局空间。因此了解这些细节还是有些意义的。

再试试下面代码:
#include <string>
#include <iostream>

using std::string;

class string
{
public:
size_t size(){return 3;}
};
int main()
{
string s;
std::cout << s.size() << std::endl;
}
liumingrong 2008-11-19
  • 打赏
  • 举报
回复
可查找的名字空间内有两个可用的string类,编译不能通过
太乙 2008-11-19
  • 打赏
  • 举报
回复
lz
真有聊!

就呆在云上 2008-11-19
  • 打赏
  • 举报
回复
这样把
呵呵
#include <string>
#include <iostream>
//using namespace std;
class string
{
public:
size_t size(){return 3;}
};
int main()
{
string s;
std::cout << s.size() << std::endl;
}


名字空间的引入,导致的二义性
lbh2001 2008-11-19
  • 打赏
  • 举报
回复
编译错误,因为那一点上可以引用两个size函数,编译器将傻眼
taodm 2008-11-19
  • 打赏
  • 举报
回复
嗯?你不是说不要做语言律师的嘛?
怎么持续发语言律师贴?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧