getter和setter方法有什么用途?

4

可能是重复问题:
为什么使用getter和setter方法?

请问有谁能告诉我使用getter/setter方法的用途是什么?

在面试中,有人让我写一个简单的类...所以,我写了下面这个类:

class X
{
    int i;
public:

    void set(int ii){ i = ii;}
    int get(){ return i;}
};

现在,问题是这样的:

Q1. 为什么你把变量“i”声明为私有而不是公有的?

我的回答: 因为数据总是敏感的,通过将其声明为私有,您可以防止它暴露给外部世界。

为了反驳我的推理,面试官说:“那么,为什么你要提供一个公共的getter/setter方法呢?既然这些成员函数是公开的,所以‘i’变量仍然暴露给外部世界,任何人都可以更改'i'的值。”

此外,面试官建议我按以下方式重新编写之前的类:

class X
{
public:

    int i;
};

好的,以下是翻译的结果:

好处在于:您可以更快地修改“i”的值,因为这次不需要调用函数。

尽管面试官的推理似乎不错....通过使私有变量“i”和公共get/set方法,您可以保护您的数据。那么,我们为什么要编写get()/set()方法呢?


在这里,您可以验证新值。 - chris
如果我没记错的话,这是一个“惯例”。 - Prasanth
get()/set() 方法允许您在返回数据之前对其进行处理。例如:int get(){return i+1;} - Shmiddty
10
我的回答:因为...希望这不是一次书面面试。 - James McNellis
@Shmiddty:好的...我不想修改'i',那怎么办? - Jatin
我很惊讶没有人谈论数据同步。假设您正在使用 public: int i;,它是否是线程安全的?相反,您可以使用同步技术定义getter和setter来避免数据不一致。我说得对吗?附注:我是c++新手。以java为思考对象。 - Prasanth
5个回答

3

目的是如果需要(例如进行有效性检查),您可以始终使用更复杂的逻辑更改设置器和获取器方法。如果不使用getter/setter,您必须编写它们,然后在更改字段的所有位置更改代码,这可能会导致非常难以发现的错误。


3

拥有访问器和修改器可以隐藏访问该变量所使用的逻辑。如果逻辑发生改变,您只需在成员函数中更改它,而不是在每个访问公共变量的地方都更改它。这有助于将内部状态数据隐藏起来,使外部世界无需担心这些操作的实现细节。


1

我们使用getter/setter和私有数据变量来确保数据封装


1

嗯,你可以将这些访问器设置为私有。客户端不需要知道类型的数据表示方式——这是抽象的一个组成部分。


0

我的回答是:

我同意我们仍然可以将变量“i”声明为公共的,并且可以删除get/set方法的使用。但是,只有当您100%确定您不会在未来更改类变量时才能这样做。

因为...如果我们删除get/set方法,那么我们将直接在数百个文件中使用“i”。[例如:object.i = 10;] 如果您的变量“i”意外更改为“j”,则您的文件将开始失败。

因此,为了解决这个问题...我们使用get/set方法。唯一需要进行更改的地方是在X类内部,将“i”-->“j”。

这是我能想到的get/set方法的唯一用途。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接