在命名空间块中定义类方法和使用 :: 定义它们有啥区别

Posted

技术标签:

【中文标题】在命名空间块中定义类方法和使用 :: 定义它们有啥区别【英文标题】:What's the difference between defining class methods in a namespace block and defining them using ::在命名空间块中定义类方法和使用 :: 定义它们有什么区别 【发布时间】:2014-05-29 01:23:16 【问题描述】:

例如:

// Example.h
namespace MyExample

     class Example
     
         void Print() const;
     ;

这样做有什么区别:

// Example.cpp
namespace MyExample

    Example::Print() const
    
        ...
    

然后这样做:

// Example.cpp
MyExample::Example::Print() const

    ...

两者的优缺点是什么?

【问题讨论】:

没有区别,只是后者更冗长。 【参考方案1】:

编译器没有区别。

但是,您会注意到某些 IDE 在生成代码时会更喜欢第二种解决方案(例如 Eclipse CDT):

读取定义时,立即清楚函数在哪个命名空间,无需向上滚动文件 避免与嵌套命名空间混淆 它限制了代码在编辑器中的嵌套(在解决方案 1 中,每个命名空间块为其中定义的代码添加了一个全新的缩进) 如果您在源文件中使用 grep 查找命名空间名称,您将更容易找到其中声明了哪些函数

【讨论】:

【参考方案2】:

两者在技术上是相同的。但是,当您要在文件中定义该命名空间的许多功能时,如果您不是特别喜欢破解您的指关节,您可以使用前者来避免额外的输入,而不是使用命名空间名称来限定每个功能。

当然,后一种形式对某些人来说可读性更好,而且是主观的。

【讨论】:

以上是关于在命名空间块中定义类方法和使用 :: 定义它们有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

类、包、命名空间和模块之间有啥区别?

在 C++ 中使用类的命名空间定义类的成员

在 Ruby 中动态定义命名类

ExtJS 3:创建自定义类的两种方式:有啥区别?

命名空间

在不同的命名空间中定义基类和派生类时的编译错误