C++ 中的 Getter 和 Setter

这个小指南将首先简要介绍面向对象编程中的封装和数据隐藏的概念。然后将继续使用 C++ 中的 getter 和 setter。

什么是封装

封装是将所有相关事物绑定在一起的概念。C++ 中的一个类可以将所有相关数据组合到一个胶囊中。

例如,假设我们有一个带有一些属性和属性的对象或实体 Rectangle。我们可以将它的所有属性和属性组合在一个类中。

因此,众所周知,封装将相关数据和方法组合在一个类中。它经常与数据隐藏的概念相混淆。

数据隐藏是一个概念,属于一个类的属性不应该被类外的每个人访问。这是因为它违反了数据安全性。

如果将一个类的数据成员设为私有,则该类外的任何用户都无法访问它,因此我们可以实现数据安全。

通过这样做,虽然我们无法从类外部设置或获取数据成员的值,但我们可以创建可用于访问成员的方法,这些方法可以确保一些不需要的数据不会放在数据成员中.

这种设置或获取数据成员值的方法称为 gettersetter

C++ 中的 Getter 和 Setter

这是一个很好的编程实践,可以将类的数据成员设为私有,这样就不能将无效数据分配给类的数据成员。有了这个,你可以在将数据存储在数据成员中之前检查数据成员中的数据。

例如,我们有一个类 Shape。任何形状的长度属性都不能为负数。

因此,在设置长度的值时,我们会检查提供的值是否大于零。

同样,如果我们有一个 Employee 类,它的属性是 salary。该属性既没有负值也没有很大的正值。

因此,必须在设置 salary 的值之前放置一个验证器。让我们看看下面的例子。

class Emp{
    private:
        int empSalary;
    public:
        void setEmpSalary(int sal)
        {
            if (sal > 0 and sal < 10000000)
                empSalary = sal;
        }
        int getEmpSalary()
        {
            return empSalary;
        }
};

在这个代码片段中,我们有数据成员 salary,它是私有的,用于实现数据隐藏。此外,我们为此数据成员提供了一个 getter 和 setter,以便在需要时可以设置和检索值。

在 setter 函数中,我们还创建了一个检查来控制在 salary 数据成员中输入的无效值。这是为你需要的任何数据成员创建 setter 和 getter 的方法。

让我们看一下上面示例的完整代码。

#include<iostream>#include<string>using namespace std;
class Emp{
    private:
        int empSalary;
        string empName;
    public:
        Emp(string n, int s){
            setEmpName(n);
            setEmpSalary(s);
        }
        void setEmpName(string s){
            empName = s;
        }
        string getEmpName(){
            return empName;
        }
        void setEmpSalary(int sal){
            if (sal > 0 and sal < 10000000)
                empSalary = sal;
        }
        int getEmpSalary(){
            return empSalary;
        }
};
int main(){
    Emp e ("John", 50000);
    cout<<"Name: "<<e.getEmpName()<<endl;
    cout<<"Salary: "<<e.getEmpSalary()<<endl;
}

输出:

Name: John
Salary: 50000

结论

向类接口添加 getter 和 setter 方法至关重要。因为类的成员变量将被声明为私有的,所以你的类的用户将需要一种方法来检索和设置他们的值。

因为 setter 方法可以包含数据验证代码以确保将成员变量设置为合法值,所以 getter 和 setter 函数可以安全地启用此访问。

当然,有时你不想为类的所有成员变量提供 getter、setter 或这两种方法。只读成员变量是可以获取但不能更改的变量。

一个这样的例子可以是一些静态数据成员,也可以是一些只读数据成员;对于这样的成员,我们需要一个 getter 函数,而不是一个 setter 函数。