gpt4 book ai didi

c++ - 命名空间 + 函数与类上的静态方法

转载 作者:行者123 更新时间:2023-12-04 17:06:46 26 4
gpt4 key购买 nike

假设我有或将要编写一组相关的函数。假设它们与数学有关。在组织上,我应该:

  • 编写这些函数并将它们放入我的 MyMath命名空间并通过 MyMath::XYZ() 引用它们
  • 创建一个名为 MyMath 的类并将这些方法设为静态并引用类似的 MyMath::XYZ()

  • 为什么我会选择一个而不是另一个作为组织我的软件的方式?

    最佳答案

    默认情况下,使用命名空间函数。
    类是用来构建对象的,而不是用来替换命名空间的。
    在面向对象的代码中
    Scott Meyers 为他关于这个主题的 Effective C++ 一书写了一个完整的条目,“Prefer non-member non-friend functions to member functions”。我在 Herb Sutter 的一篇文章中找到了对该原则的在线引用:http://www.gotw.ca/gotw/084.htm
    需要知道的重要一点是:在 C++ 中,与类在同一命名空间中的函数,并且具有该类作为参数的函数属于该类的接口(interface)(因为 ADL 将在解析函数时搜索这些函数电话)。

    For example:

    • let's say you have a namespace N
    • let's say you have a class C, declared in namespace N (in other words, its full name is N::C)
    • let's say you have a function F, declared in namespace N (in other words, its full name is N::F)
    • let's say that function F has, among its parameters, a parameter of type C

    ... Then N::F is part of N::C's public interface.


    命名空间函数,除非声明为“ friend ”,否则无法访问类的内部结构,而静态方法则可以。
    这意味着,例如,在维护类时,如果需要更改类的内部结构,则需要在其所有方法中搜索副作用,包括静态方法。
    扩展一
    将代码添加到类的接口(interface)。
    在 C# 中,即使您无法访问类,也可以向类添加方法。但在 C++ 中,这是不可能的。
    但是,仍然在 C++ 中,您仍然可以添加命名空间函数,甚至可以添加到某人为您编写的类中。
    从另一方面看,这在设计代码时很重要,因为通过将函数放在命名空间中,您将授权用户增加/完成类的接口(interface)。
    扩展二
    上一点的副作用是,不可能在多个 header 中声明静态方法。每个方法都必须在同一个类中声明。
    对于命名空间,来自同一命名空间的函数可以在多个头文件中声明(几乎标准的交换函数是最好的例子)。
    扩展三
    命名空间的基本优势在于,在某些代码中,如果使用关键字 using,就可以避免提及它。 :
    #include <string>
    #include <vector>

    // Etc.
    {
    using namespace std ;
    // Now, everything from std is accessible without qualification
    string s ; // Ok
    vector v ; // Ok
    }

    string ss ; // COMPILATION ERROR
    vector vv ; // COMPILATION ERROR
    您甚至可以将“污染”限制为一类:
    #include <string>
    #include <vector>

    {
    using std::string ;
    string s ; // Ok
    vector v ; // COMPILATION ERROR
    }

    string ss ; // COMPILATION ERROR
    vector vv ; // COMPILATION ERROR
    这种“模式”对于正确使用几乎标准的交换习语是强制性的。
    这对于类中的静态方法是不可能的。
    因此,C++ 命名空间有自己的语义。
    但它更进一步,因为您可以以类似于继承的方式组合命名空间。
    例如,如果您有一个命名空间 A带功能 AAA , 命名空间 B带功能 BBB ,你可以声明一个命名空间 C , 并带上 AAABBB在此命名空间中使用关键字 using .
    您甚至可以使用 using namespace 将一个 namespace 的完整内容带入另一个 namespace 中。 ,如命名空间 D!
    namespace A
    {
    void AAA();
    void AAA2();
    }

    namespace B
    {
    void BBB();
    }

    namespace C
    {
    using A::AAA;
    using B::BBB;
    }

    namespace D
    {
    using namespace A;
    using namespace B;
    }

    void foo()
    {
    C::AAA();
    // C::AAA2(); // ERROR, won't compile
    C::BBB();
    }

    void bar()
    {
    D::AAA();
    D::AAA2();
    D::BBB();
    }
    结论
    命名空间用于命名空间。
    类(class)是为了类(class)。
    C++ 被设计成每个概念都是不同的,并且在不同的情况下以不同的方式用作不同问题的解决方案。
    需要命名空间时不要使用类。
    在您的情况下,您需要命名空间。

    关于c++ - 命名空间 + 函数与类上的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49214918/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com