【问题标题】:Accessing variable of class normally or by a function [duplicate]正常或通过函数访问类的变量[重复]
【发布时间】:2013-07-24 05:51:13
【问题描述】:
class ABC{
     public :
      int a;
     public :
      int getData(){
        return a;
      }
     }
     void main()
     { 
       ABC abc;
       cout<< abc.a;    //1
       cout<<abc.getData();//2
     }

现在,如果我正在访问变量 "a",在这种情况下,编译器访问 'a' 的时间会更少。 我猜是第一种情况,但不确定。

【问题讨论】:

  • 两者不等价。该函数为您提供数据成员a副本
  • void main 不合法。使用int main

标签: c++ class


【解决方案1】:

这两种方法并不严格等价:

  1. 直接访问成员时会读取成员本身的值
  2. get 方法返回变量的副本,因此您可以从副本中读取。

关于性能,当然#1 应该更快,因为不涉及复制,但大多数现代编译器将应用复制省略来删除正在创建的额外副本。

您应该考虑您的组织/机构所遵循的编码指南的一致性。

【讨论】:

  • 我不认为复制省略可以在这里应用,但是“as-if”规则不允许在正确的情况下进行复制。
【解决方案2】:

都是编码风格。拥有私有成员只是一种安全措施,因此任何外部实体都无法直接访问它并对其进行修改(类似于声明变量const 用作安全屏障的概念)。公共访问器是用于访问成员值的函数,公共修饰符用于通过函数更改值。它只是编码约定。直接传递成员而不是函数会更快,因为没有复制。

【讨论】:

    【解决方案3】:

    我会这样说:

    • 如果访问器中除了简单地设置/返回变量(例如范围检查)之外还有其他内容,则该变量绝对应该是私有的。这是确保这些附加代码实际执行的唯一方法。

    • 如果您只需要一个访问器,因为您不希望变量可查询或可设置,那么该变量也应该是私有的。

    • 如果您同时定义一个普通的 getter 和 setter,我认为,将变量公开并忘记访问器同样安全。无论如何,该变量实际上是公共的。在这种情况下,访问器只是冗余代码,因此不应使您的代码膨胀。稍后将公共变量设为私有很容易,因为编译器会尽职尽责地列出您需要调整的每一行代码。

    简而言之:默认使用私有变量,并且对您编写的每个访问器都三思而后行,因为它会给您的封装打一个洞。

    【讨论】:

      猜你喜欢
      • 2014-04-09
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多