C++ 定义只调用私有函数的公共函数有什么好处

C++ 定义只调用私有函数的公共函数有什么好处,c++,C++,不久前,我正在阅读我的一位教授编写的一些代码,我注意到他在封装类中从不使用公共函数。即使公共函数是一行程序,它唯一的任务就是将参数传递给私有函数。所以他所有的课都是这样的 class A{ public: void do_work(Some_object& obj){ m_do_work(obj); } private: void m_do_work(Some_object& obj){ // actual work is

不久前,我正在阅读我的一位教授编写的一些代码,我注意到他在封装类中从不使用公共函数。即使公共函数是一行程序,它唯一的任务就是将参数传递给私有函数。所以他所有的课都是这样的

class A{
public:
    void do_work(Some_object& obj){
        m_do_work(obj);
    }

private:
   void m_do_work(Some_object& obj){
        // actual work is done here
   }

};

这似乎既浪费了开发时间,也浪费了运行时间,因为额外的间接层次会带来额外的开销。那么这种风格的实际好处是什么呢

公共函数是一个公共接口,定义类用户查看类的方式

你的教授将实现的细节隐藏在一个私有函数中,通过这种额外的间接性,他可能打算保留公共函数的原始实现,而在以后只修改私有函数的内部。 它以牺牲性能为代价使事情更加模块化


撇开教学示例不谈,如果此类调用影响应用程序的关键路径,则必须通过分析性能来做出决定。

公共函数是一个公共接口,定义类用户查看类的方式

你的教授将实现的细节隐藏在一个私有函数中,通过这种额外的间接性,他可能打算保留公共函数的原始实现,而在以后只修改私有函数的内部。 它以牺牲性能为代价使事情更加模块化


撇开教学示例不谈,如果此类调用影响应用程序的关键路径,则必须通过分析性能来做出决定。

我曾经这样做过,在类内外调用私有函数。因为我的公共函数在调用这个函数之前必须锁定一个互斥锁,而我的私有函数则不能,所以它很有用。是这样的,

public:
    void set_configuration()
    {
        std::lock_guard<std::mutex> lg(m);
        reconfigure_output();
    }

private:
    void reconfigure_output()
    {
        ...
    }
    void some_other_function()
    {
        ...
        reconfigure_output();
    }
公共:
void set_配置()
{
标准:锁紧装置lg(m);
重新配置_输出();
}
私人:
无效重新配置_输出()
{
...
}
void some_other_函数()
{
...
重新配置_输出();
}

我曾经这样做过,在类内部和外部调用私有函数。因为我的公共函数在调用这个函数之前必须锁定一个互斥锁,而我的私有函数则不能,所以它很有用。是这样的,

public:
    void set_configuration()
    {
        std::lock_guard<std::mutex> lg(m);
        reconfigure_output();
    }

private:
    void reconfigure_output()
    {
        ...
    }
    void some_other_function()
    {
        ...
        reconfigure_output();
    }
公共:
void set_配置()
{
标准:锁紧装置lg(m);
重新配置_输出();
}
私人:
无效重新配置_输出()
{
...
}
void some_other_函数()
{
...
重新配置_输出();
}

可能会问代码的作者?不幸的是,我不再与他联系。启用优化后,“浪费[…]运行时间”是错误的。他不使用pimpl习惯用法吗,所以
void do_work(Some_object&obj){mImpl->do_work(obj)}
为什么投反对票?我只是想知道,作为一名未来的软件开发人员,这种风格是否有好处。如果你认为这种风格确实是一种浪费,那么请投票结束问题,而不是向下投票,这意味着这是一个糟糕的问题。也许可以问代码的作者?不幸的是,我不再与他联系。启用优化后,“浪费[…]运行时间”是错误的。他不使用pimpl成语吗,因此,
void do_-work(Some_-object&obj){mImpl->do_-work(obj)}
?为什么要投反对票?我只是想知道,作为一名未来的软件开发人员,这种风格是否有好处。如果你认为这种风格确实是一种浪费,那么请投票结束这个问题,而不是投反对票,这意味着这是一个糟糕的问题。我怀疑会有更多的间接性。优化编译器几乎肯定会完全省略额外的函数调用。事实上我也不明白这是如何隐藏任何实现细节的。函数体不是其公共接口的一部分。除非使用PIMPL习惯用法,否则额外的私有方法不会使任何东西变得更模块化。我指的是代码中引入的间接方法,而不是编译器的行为方式。你说的没有任何意义。我并没有说函数的主体是它的公共接口的一部分,我确信C++标准委员会无意改变对私人习语的定义,我怀疑会有额外的间接性。优化编译器几乎肯定会完全省略额外的函数调用。事实上我也不明白这是如何隐藏任何实现细节的。函数体不是其公共接口的一部分。除非使用PIMPL习惯用法,否则额外的私有方法不会使任何东西变得更模块化。我指的是代码中引入的间接方法,而不是编译器的行为方式。你说的没有任何意义。我并没有说函数的主体是它的公共接口的一部分,我确信C++标准委员会无意改变私有习语的定义,但是你做的更多,仅仅是调用私有函数。但事实并非如此。但是私有部分是私有的,即使它们很丑陋,只要它们没有暴露出来,也没有什么好羞愧的:)但是你所做的不仅仅是调用私有函数。但事实并非如此。但私人部分是私人的,即使它们很丑,只要它们不暴露在外,也没有什么可羞耻的:)