Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用公共函数访问私有变量?_C++_Function_Methods_Private_Public - Fatal编程技术网

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

C++ 如何使用公共函数访问私有变量?,c++,function,methods,private,public,C++,Function,Methods,Private,Public,所以我不知道你们有没有人上过NewBoston.Com(顺便说一下,这是一个很好的资源),但我在看这段视频,老师在说如何使用公共功能访问私人信息 以下是视频: 当然,只要跳到最后,就可以了解要点 但我不明白的是,如何使用公共函数访问私人信息。如果您创建了一个公共函数,允许任何人设置名称并获取该名称,那么它不就是公共的吗?难道任何人都不能弄乱我的代码和所需的输出吗?公共“getters/setters”(如果可以)的目的是,它们限制用户做超出您希望的事情。您可以通过将私有成员包装在公共访问器中来

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

以下是视频:

当然,只要跳到最后,就可以了解要点

但我不明白的是,如何使用公共函数访问私人信息。如果您创建了一个公共函数,允许任何人设置名称并获取该名称,那么它不就是公共的吗?难道任何人都不能弄乱我的代码和所需的输出吗?

公共“getters/setters”(如果可以)的目的是,它们限制用户做超出您希望的事情。您可以通过将私有成员包装在公共访问器中来限制它们可以/不能做的事情,而不是让它们获取/设置私有成员(在其中它们可以对其执行任何操作)。这样,在这个公共属性/函数中,您也可以限制它们可以设置的值


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

对不起,我没有在看视频,但我假设您讨论的是getter(获取属性值的函数,在本例中为私有数据成员)和setter(设置这些值的函数)


如果您将getter和setter作为纯传递函数提供,那么您是正确的,这与将成员公开没有多大区别。不过,通常的用途是为访问器函数提供智能--例如,对可以设置的值进行限制,或允许计算检索到的值,而不是仅基于纯值。

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

如果你能做到的话 class.var=值;
通过输入错误类型的变量,或者溢出一些限制,或者甚至输入一个合法值(该值与类代码中的某些逻辑相冲突),您可能会把事情搞砸。对于单个开发人员来说,这通常不是一个大问题,但是对于实际的专业代码来说,将成员变量封装在get/set对中以进行访问/写入是一个非常好的做法。

提供一个公共方法来更改私有变量的目的是,您可以添加额外的控件

两者之间没有太大区别

class A {
   public:
      int age;
}


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

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

但是,公共函数可以提供一个接口来指导类的使用,并限制对私有成员的操作。您不希望类的用户更改只有在同步步骤中更改时才有意义的单个私有成员

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

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

private:
int* backing_array_ ;
int size_;
}

现在,
increaseSize()
的实现实际上可以检查新的大小是否大于以前的大小。它还可以实际创建一个新的备份数组,并在上面复制数据。公开私有变量大小既无法检查大小的正确值,也无法分配新的备份阵列。

如果无法从公共函数访问私有数据,则只能从私有函数访问,对吗。然而,从公共功能调用私人功能也应该被禁止,所以


您到底应该如何访问私有数据?

对于实际的专业代码来说,最好不要为每个数据成员编写getter和setter。但这不是讨论这个问题的地方,所以我将进行否决表决,并在这里向您发送相应的问题,在这之后,编译器将对成员变量进行类型检查。这不是一个合理的理由。你不经常使用指针,是吗?没有要检查的类型时不进行类型检查。我仍然不知道我的答案和上面的“投票结果”有什么不同,后者说的基本上是一样的。我甚至从来没有暗示过你必须封装任何东西,或者你应该为每个成员变量封装。我想我明白你的意思了。因此,我认为这就是它的要点:您可以通过将预期的数据类型设置为私有来编辑生成的数据类型,因为您需要一致性。但是其他用户输入的数据本身应该是公共的,这对程序员来说应该无关紧要,只要他们能够控制数据的类型和流量?我想你可以用这个比喻:你想要一支钢笔有一个漏墨水的地方,一个你可以点击的按钮来弹出墨水(?)笔尖,一个框架,但确切的类型并不重要,只需要所需的部分?如果你明白的话,封装(隐藏内部细节)的好处之一就是可以有效地更改类/模块的实现细节,而不会影响(并且不需要更改)其余的代码,但它不是唯一的好处。例如,我的例子是关于维护cohe
class IntHashMap {
public:
void increaseSize(int size);
// Other stuff.

private:
int* backing_array_ ;
int size_;
}