与具有私有成员函数的类相比,未命名命名空间中的自由函数有什么好处?

2024-02-08

与拥有不带任何参数的私有类成员函数并直接访问成员变量相比,拥有自由函数(在匿名命名空间中并且只能在单个源文件中访问)并将所有变量作为参数发送有什么优势?

header:

 class A {
    int myVariable;
    void DoSomething() {
       myVariable = 1;
    }
 };

source:

 namespace {
    void DoSomething2(int &a) {
        a = 1;
    }
 }

 int A::SomeFunction() {
    DoSomething2(myVariable); // calling free function
    DoSomething(); // calling member function
 }

如果您更喜欢让它们成为成员,那么如果我首先调用一个不访问任何成员变量的函数,但该函数调用另一个函数,该怎么办?is访问会员。它们都应该是会员功能还是免费的?


看到这个问题:有效的 C++ 第 23 条 优先选择非成员非友元函数而不是成员函数 https://stackoverflow.com/questions/5989734/effective-c-item-23-prefer-non-member-non-friend-functions-to-member-functions并且C++ 成员函数与自由函数 https://stackoverflow.com/questions/967538/c-member-functions-vs-free-functions?rq=1

您应该更喜欢自由函数,因为它可以促进松散耦合。

仅当它有效时才考虑将其设为成员函数在你们班的胆量上,并且您认为它确实与您的班级息息相关。

这是本书的一个要点101 个 C++ 编码标准,它指出比成员函数更喜欢自由函数和静态函数。

尽管这可能被认为是基于意见的,但它允许保持班级规模较小,并分离关注点。

This answer https://stackoverflow.com/a/5989854/356440声明:“这条规则的原因是,通过使用成员函数,您可能会意外地过度依赖类的内部结构。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与具有私有成员函数的类相比,未命名命名空间中的自由函数有什么好处? 的相关文章

  • 这种双重实例是否有害,或者根本没有必要?

    在仔细阅读遗留资源时 我发现了这一点 DataSet myUPC new DataSet myUPC dbconn getDataSet dynSQL Resharper 正确地将其中的 new Dataset 部分 灰显 并建议 删除多余
  • 如何使用带有进度条的 HttpClient 下载文件?

    我创建了一个名为SiteDownload并添加了一些下载图像的链接 using System Collections Generic using System Linq using System Net using System Threa
  • 井字游戏代码有助于改进

    这是我必须检查玩家在井字棋游戏中获胜的代码 这是一个很长的 if 语句 可以改进 该板由 9 个图片框组成 我是一名 C 初学者 pBox Image Player players Player playerTurn getImage ch
  • 如何在 C# 中启动文件

    编辑 我觉得自己像个白痴 我有一种感觉 像下面的答案会起作用 但没有看到任何与下面的答案类似的谷歌结果 所以当我看到这段复杂的代码时 我想它一定是这样的 我搜索并找到了这个Windows 列出并启动与扩展关联的应用程序 https stac
  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • 找不到 HttpContextBase 命名空间

    public string GetCartId HttpContextBase context if context Session CartSessionKey null if string IsNullOrWhiteSpace cont
  • 子进程中的变量修改

    我正在研究科比和奥哈拉伦的作品Computer Systems A Programmer s Perspective 练习 8 16 要求程序的输出如下 我更改了它 因为他们使用了一个你可以在他们的网站上下载的头文件 include
  • 用C#发送USSD?

    我想编写一个在 Windows Mobile 6 上运行的简单 C 应用程序 它可以发送 USSD 消息 有没有任何图书馆可以帮助我做到这一点 或者是否有任何示例解释如何使用线路发送USSD http msdn microsoft com
  • 析构函数、dispose 和 Finalize 方法之间的区别

    我正在研究垃圾收集器在 C 中的工作原理 我对使用感到困惑Destructor Dispose and Finalize方法 根据我的研究和理解 在我的类中拥有析构函数方法将告诉垃圾收集器以析构函数方法中提到的方式执行垃圾收集 该方法不能在
  • const_iterators 更快吗?

    我们的编码指南更喜欢const iterator 因为它们比正常的要快一点iterator 当您使用时 编译器似乎会优化代码const iterator 这真的正确吗 如果是的话 内部到底发生了什么使得const iterator快点 编辑
  • 有没有办法关闭 Hangfire 使用 Serilog 进行的日志记录?

    有没有办法关闭 Hangfire 使用 Serilog 进行的日志记录 我们正在使用我们自己的抽象 我不希望在使用 Serilog 时来自 Hangfire 记录器的所有额外噪音 INIT call under web project na
  • 泛型类上的 DebuggerDisplay

    我在应用时遇到问题DebuggerDisplay泛型类的属性 DebuggerDisplay foo class Foo DebuggerDisplay Bar t class Bar
  • 谷歌基准迭代的意义是什么?

    我正在使用 Google Benchmark 来测量某些代码的执行时间 例如 我编写了以下代码来测量其执行时间性能 include
  • 如何在 C# 中停止程序进一步执行

    string FirstName Console ReadLine if FirstName Length gt 12 Console WriteLine if FirstName Length lt 3 Console WriteLine
  • 使用可变参数模板函数计算多个值的平均值

    我正在尝试编写一个函数来确定任意数量参数的平均值 所有参数都具有相同的类型 出于学习目的 我尝试使用可变参数模板函数来做到这一点 这是我到目前为止所拥有的 template
  • 如何将此 Boost ASIO 示例应用到我的应用程序中

    我已经阅读了很多 ASIO 示例 但我仍然对如何在我的应用程序中使用它们感到困惑 基本上 我的服务器端需要接受超过100个连接 客户端 这部分是通过使用线程池 通常每个CPU核心2 4个线程 来完成的 为简单起见 我们假设只有一个连接 为了
  • 在 C++17 中编译具有非固定基础类型的 constexpr 从 int 静态转换为作用域枚举的未定义行为

    我想知道以下内容是否应该在 C 17 中编译 enum class E A B constexpr E x static cast
  • 在运行时将项目添加到 ToolStrip

    您好 我有一个带有 收藏夹 菜单的 ToolStripMenu 我想在运行时在 WinForms 应用程序中添加子项目 我有一个 datagridview 右键单击它会显示一个包含 添加到收藏夹 选项的上下文菜单 当该事件被触发时 我想使用
  • 恐怖分子已弃用

    正在接听另一个问题 https stackoverflow com q 11830514 1468366 我偶然发现了man page http linux die net man 3 herror一个名为的函数herror 看起来很像pe
  • 返回右值 - 这段代码有什么问题? [复制]

    这个问题在这里已经有答案了 我遇到了以下代码片段 std string test std string m Hello return std move m int main std string m test 我知道上面的代码是不正确且不安

随机推荐

  • 是否可以同时使用线程并发和并行性?

    对于我的一个项目 这是一种内容聚合器 我想引入并发性 如果可能的话 引入并行性 乍一看 这似乎毫无意义 因为并发和并行采用不同的方法 通过线程的并发引入了即时并发 而并行性提供了潜力 因此 为了更好地解释我的问题 让我总结一下我的问题集 由
  • 离子错误:在 FontFamilyFont 中,无法找到属性 android:fontVariationSettings [重复]

    这个问题在这里已经有答案了 当我跑步时 ionic cordova 构建 android prod 它显示以下错误 ERROR In
  • 如何多次绑定同一个向量?

    我怎样才能绑定相同的载体o c 1 2 3 4 多次得到一个矩阵 如 o array c 1 2 3 4 1 2 3 4 1 2 3 4 dim c 4 3 1 2 3 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 以比以
  • 如何让浏览器导航到 JavaScript 中的 URL [重复]

    这个问题在这里已经有答案了 让 Web 浏览器使用 JavaScript 导航到您选择的 URL 的最佳 正确 现代 跨浏览器 安全 方法是什么 这适用于所有浏览器 window location href 如果您想更改页面而不反映在浏览器
  • LINQ to Entities 中的临时表

    我有一个很大的用户 ID 表 我有一组我想要的用户 ID 我有两个具有外部用户 id 键的表 明智地获取此信息性能的最佳方法是什么 理想情况下 在 SQL 中 最终结果有点像这样 如果一个表中没有用户 ID 而另一个表中没有用户 ID 则为
  • 使用 JsonProperty 将 JSON 绑定到模型属性

    我受我方和客户之间协议的约束 必须使用包含破折号的 json 参数 由于无法在 C 中的属性名称中使用它 因此我需要映射到所需的属性 我现在应该做什么 为了方便起见 下面的代码被简化了 Model public class MyReques
  • Maven-Release-Plugin:强制使用 scm 提供程序的特定版本

    我正在尝试将我们的存储库从 SVN 迁移到 Git 但在一个非常大的项目上使用发布插件时遇到了问题 Problem 该项目大约有 50 多个子模块 它尝试将所有修改后的 poms 添加为一个 git add 这打破了Windows命令行的限
  • 慢速 SQL 查询:在两个不同的连接中使用同一个表会导致查询速度变慢 10 倍!

    真的希望某种性能专家可以向我解释为什么单个连接会导致查询速度慢 10 倍 另外 请不要嘲笑这个查询的大小 我想取出数据库中的整个目录以通过一个查询输出 我不确定将其分解为较小的查询是否会更快 但是似乎不对 SELECT c category
  • 如何在yii2中使用if语句正确查看表数据

    我正在研究yii2 我有一个页面 我在其中创建了一个表 现在我想通过数据库查询将一些数据放入其中if else陈述 tbody style text align center line height 12px tbody
  • 在 Windows 上从 bash 脚本运行 Openssl - 主题不以“/”开头

    在我的脚本中我有 openssl req x509 new nodes key certs ca my root ca key pem days 3652 out certs ca my root ca crt pem subj C GB
  • WinForm CRUD 应用程序的 UI 设计,有什么作用?

    我正在设计一个 WinForms CRUD 类似 应用程序 供一大群护士和社会工作者与客户信息进行交互 有很多种不同的形式 大约30ish 他们需要 可能 与任何给定的客户进行交互 并且他们 可能 需要为特定的人从一个客户跳到另一个客户 我
  • 按字节截断字符串

    我创建以下内容 用于将 java 中的字符串截断为具有给定字节数的新字符串 String truncatedValue String currentValue string int pivotIndex int Math round dou
  • 我如何用更少的node_modules创建react-app

    我用过create react app
  • RegExp 和 String 组合导致 Chrome 崩溃

    我有以下正则表达式来验证电子邮件地址 A Za z0 9 a zA Z0 9 A Za z0 9 a zA Z0 9 A Za z 2 在基本电子邮件上运行它效果很好 A Za z0 9 a zA Z0 9 A Za z0 9 a zA Z
  • 使用 *args 和 **kwargs [重复]

    这个问题在这里已经有答案了 所以我对这个概念有困难 args and kwargs 到目前为止我了解到 args 参数列表 作为位置参数 kwargs 字典 其键成为单独的关键字参数 值成为这些参数的值 我不明白这对什么编程任务有帮助 Ma
  • 如何同时使用 telegram bot python

    我不知道如何使用 python 在电报中使用机器人进行多进程 我创建了一个线程 但如果该线程未完成 机器人将无法回复消息 horaPurga now replace hour 23 minute 36 second 59 microseco
  • RESTEasy - javax.ws.rs.NotFoundException:找不到完整路径的资源

    我尝试在 GWT 项目中使用 RESTEasy 实现 REST 服务 但是当我进入相应的 URI 时 应用程序返回 Grave failed to execute javax ws rs NotFoundException Could no
  • 不活动后会话自动注销

    快速会话中是否有内置功能 可以在给定的不活动时间后启用自动注销 我如下使用它 并希望它在会话半小时不活动时注销 app use session key sessid secret This is secret resave true sav
  • C#“使用”块

    我有类似下面的代码 这里有人提到 WebClient Stream 和 StreamReader 对象都可以从使用块中受益 两个简单的问题 1 这个小片段在使用块时会是什么样子 我自己做研究没有问题 所以资源链接很好 但只看一个例子会更快更
  • 与具有私有成员函数的类相比,未命名命名空间中的自由函数有什么好处?

    与拥有不带任何参数的私有类成员函数并直接访问成员变量相比 拥有自由函数 在匿名命名空间中并且只能在单个源文件中访问 并将所有变量作为参数发送有什么优势 header class A int myVariable void DoSomethi