1

如果有人能启发我,我有一个关于命名空间的问题:D

不知道标题对不对,希望是这样xD

“.cpp”文件中的代码称为命名空间的实现, “.h”文件中的代码称为命名空间的声明?正确的?:/

无论如何,我的问题是:

命名空间成员的显式或隐式实现有什么区别(在“.cpp”文件中)?

我的意思是,假设我在“ MyNamespace.h ”中有这个命名空间:

namespace MyNamespace {

    void fun_one(int a);

    void fun_two(int b);

}

如果在“ MyNamespace.cpp ”中执行此操作(隐式实现) ,则有任何区别

namespace MyNamespace {

    void fun_one(int a){
        // CODE HERE...
    }

    void fun_two(int b){
        // CODE HERE...
    }

}

或者这个(显式实现)

void MyNamespace::fun_one(int a){
    // CODE HERE...
}

void MyNamespace::fun_two(int b){
    // CODE HERE...
}

?

非常感谢你:D

有一个美好的一天和一个漂亮的编码!(:

4

2 回答 2

1

...称为命名空间的实现...命名空间的声明...

没有。命名空间只是...范围名称。它们没有像函数那样独特的声明和实现。

你所拥有的是两个函数的声明,然后是这两个函数的定义。函数具有名称,并且这些名称由包含名称空间限定,但与名称在文件范围内的函数没有什么不同。

您选择哪种语法来引用这些函数,以及它们的作用域名称 - 即使在函数定义中 - 就是这样,语法。它只影响代码的外观,对它的作用没有影响。

于 2020-06-22T22:38:46.937 回答
1

一般来说,您展示的两个版本之间没有区别,您可以使用您喜欢的任何一个。

对于它的价值,这是一个略有不同的案例:

namespace A 
{ 
  struct S{};
  S f();        // declare f
}

接着:

namespace A 
{
  S f() { return S{}; }   // define f, ok
}

很好,但以下不是:

S A::f() { return S{}; }

因为S在引入命名空间之前使用A。这可以通过执行以下操作来解决:

A::S A::f() { return S{}; }

或者

auto A::f() -> S { return S{}; }
于 2020-06-22T22:28:10.853 回答