如何使用公共函数访问私有变量?

时间:2013-12-12 18:20:49

标签: c++ function methods private public

所以我不知道你们有没有/曾经去过NewBoston.Com(顺便说一句,这是一个很好的资源),但是我正在看这个视频而老师说你如何使用公共信息访问私人信息功能...

这是视频: http://www.youtube.com/watch?v=jTS7JTud1qQ

当然,只需跳到最后就可以了解它的主旨。

我不知道的是,如何使用公共功能访问私人信息。如果你创建一个公共的功能,允许任何人设置名称,并获得该名称,那么它不仅仅是公共的吗?,是否有人能够弄乱我的代码和我想要的输出?

6 个答案:

答案 0 :(得分:8)

提供更改私有变量的公共方法的关键是您可以添加其他控件。

之间没有太大区别
class A {
   public:
      int age;
}

class B {
   private:
      int age;
   public:
      void setAge(int _age);
}

B::setAge(int _age) {
   this->age = _age;
}

但是,在第二种情况下,您可以添加拒绝某些数据的逻辑(例如负值)或更新其他字段。因此,您可以确保对象的数据保持一致。如果您遵循第一种方法,那么每次直接访问该属性时都应该复制该逻辑(注意:许多程序员将忘记这样做)。

答案 1 :(得分:2)

在我看来,创建琐碎的getter和setter(公共函数)有点徒劳。如果您的类功能完全由私有变量表示,那么琐碎的getter和setter是一种浪费,而且有些代码味道。也许你应该使用结构。

但是,公共函数可以提供指导类的使用的界面,并限制您可以对私有成员执行的操作。您不希望类的用户更改仅在同步步骤中更改时才有意义的个人私有成员。

它还可以在不更改界面的情况下更改实现。例如,假设您想增加哈希映射的大小。伪代码:

class IntHashMap {
public:
void increaseSize(int size);
// Other stuff.

private:
int* backing_array_ ;
int size_;
}

现在,increaseSize()的实施可以实际检查新尺寸是否大于前一尺寸。它实际上也可以创建一个新的backing_array并复制数据。公开私有变量大小既不会检查大小的正确值,也不会分配新的后备数组。

答案 2 :(得分:1)

对不起,我不是在看视频,但我假设你在谈论像getter这样的东西(获取属性值的函数 - 在这种情况下是一个私有数据成员)和setters(用于设置这些的函数)值)。

如果你提供getter和setter作为纯粹的传递函数,那么你是正确的,它实际上与仅仅公开成员没有多大区别。正常用途是为您的访问者功能提供智能 - 例如,允许您对可以设置的值设置限制或者让计算检索的值而不是仅基于纯值。

答案 3 :(得分:1)

如果您无法从公共函数访问私有数据,那么您只能从私有函数访问它。但是,因此也应该禁止从公共职能部门调用私人职能,所以......

你应该如何访问私人数据?

答案 4 :(得分:0)

如果愿意的话,公共“getter / setters”的目的是限制用户做出比你想要的更多的事情。他们可以通过将私有成员包装在公共访问者中来限制他们能做什么/不能做什么,而不是让他们获得/设置私有成员(他们可以对其做任何事情)。这样,在这个公共属性/函数中,您可以限制它们可以设置的值。

您也可以让公共属性/函数获取私有成员,但阻止用户设置它。

答案 5 :(得分:-2)

具有getter / setter的代码被认为比直接私有成员访问“更好”,因为这些函数可以控制这些变量的所有输入/输出,并确保它具有类所期望的类型,范围或任何类型。这是类创建者在返回数据之前对其进行错误检查或对其进行操作的一种方法。

如果你能做到的话     class.var = value; 你可以通过输入错误类型的变量,或者溢出一些限制,甚至放入类的代码中的某些逻辑打破的合法值来解决问题。对于单个开发人员而言,简单的事情通常不是一个大问题,但对于实际的专业代码,将成员变量封装在get / set对中以进行访问/写入是非常好的做法。