C++何时将方法放在类之外

c++ when to put method out side the class

本文关键字:何时 方法 C++      更新时间:2023-10-16

我看到有时在C ++应用程序中仅使用带有头文件和源文件的命名空间声明,如下所示:

#ifndef _UT_
#define _UT_
#include <string>
#include <windows.h>
namespace UT 
{
    void setRootPath(char* program_path, char* file_path);
    char * ConvertStringToCharP(std::string str);
};
#endif
//and then in UT.cpp
#include "UT.h"
namespace UT 
{
    char * ConvertStringToCharP(std::string str)
    {
        char * writable = new char[str.size() + 1];
        std::copy(str.begin(), str.end(), writable);
        writable[str.size()] = '';  
        return writable;
    }
    void setRootPath(char* program_path, char* file_path) 
    {
        //...
    }
}

比用静态方法定义经典类更好吗?
还是只是简单的类?
这种方法对编译器链接器有更好的效果吗?

此命名空间中的方法称为 分配时间 。

巧合

的是,我碰巧在堆栈溢出中阅读了这个答案,这是一个略有不同的问题。用户 rhalbersma 给出了一个很好的链接到 Dr. Dobb 的文章,作者 Scott Meyers 解释了如何在类外部实现的方法(非友元方法),但在同一命名空间内实际上改进了封装。对我来说,今天是一个很好的学习。希望这也对您有所帮助。

在性能方面,在namespace中拥有static类成员和自由函数之间没有区别。不过,这是一个逻辑问题。你的函数是否与类相关?

问自己的一个好问题 - 您在类中创建 static 成员函数只是为了更好地组织(还是只是为了将它们组合在一起)?如果答案是肯定的,您可能应该使用 namespace .

当方法的含义与类无关时,将方法放在所有类之外。 其他语言(Java,C#)中的静态类是一种补偿无法将方法放在类之外的方法。由于C++通过命名空间提供了这种开箱即用的能力,因此使用额外的"静态类"对于代码的读者来说是违反直觉的。

使用静态class成员函数的主要原因是与类及其成员的逻辑和概念关系。

另一个原因可能是启用模板部分专用化,函数模板不允许这样做,但类允许这样做。

否则,请使用独立函数(在相应的namespace中定义)。

没有绝对规则,但一般来说,除非函数显示非常大的连贯性,你想关闭"命名空间"出于某种原因,因此客户端无法使用namespace向其添加函数通常比使用 class 更可取。 当然,除非意图是使它们可用于模板:您可以实例化模板在类上,但不在命名空间上。 (这种技术通常被称为"特征";没有非静态成员的类称为特征类。

即使使用命名空间,也应定义以下函数:

void UT::setRootPath( char const* programPath, char const* filePath)
{
    //  ...
}
char* UT::convertStringToCharP( std::string const& str )
{
    //  ...
}

这样,函数签名中的任何拼写错误都将被检测到编译器。

默认情况下,

您应该始终尝试最小化类上的方法。如果可以根据类而不是在类中实现功能,则应这样做。换句话说,如果您可以通过使用已发布的公共接口来实现所需的功能,那么您应该这样做。这大大减少了代码对实现细节的依赖。

因此,如果您可以在类外部的适当命名空间中实现它,该命名空间自然与类相关。

编辑:看起来OP实际上是在询问是否实现命名空间或静态类作为实用程序/相关函数的持有者对象。在我看来,命名空间是执行此操作的正确方法,因为这就是它们的目的。类不是必需的。