C++ 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要getter和setter?

C++ 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要getter和setter?,c++,C++,看到下面的代码,我很困惑为什么我们需要getter和setter #include<iostream> #include<cstring> using namespace std; class car { char name[30]; int price; public: void get_data(char* n,int p) { strcp

看到下面的代码,我很困惑为什么我们需要getter和setter

 #include<iostream>
    #include<cstring>
    using namespace std;
    class car
    {
        char name[30];
        int price;
    public:
        void get_data(char* n,int p)
        {
            strcpy(name,n);
            price=p;

        }
        void set_data()
        {
            cout<<"Name: "<<name<<endl;
            cout<<"Price:"<<price<<endl;
        }
        ///Lets add the idea of constructor
        car()
        {
            cout<<"constructor has been called"<<endl;
        }
        car(char *n, int p)
        {
            cout<<"2nd constructor has been called"<<endl;
            strcpy(name,n);
            price=p;
        }
        ~car()
        {
            cout<<"Name: "<<name<<endl;
            cout<<"Price:"<<price<<endl;
        }

    };
    int main()
    {
        car A("BMW",1000);

        car B("Audi",2000);


    }
#包括
#包括
使用名称空间std;
班车
{
字符名[30];
国际价格;
公众:
void get_数据(字符*n,整数p)
{
strcpy(名称,n);
价格=p;
}
void set_data()
{

确实,构造函数可以设置类变量的值。但是,这只能在每个对象的生存期内发生一次,因为构造函数仅在对象实例化时调用。如果用户希望在程序中稍后更改变量的值怎么办?这就是setter的作用。setter允许变量您还需要一个getter在程序运行时的任何时候访问该变量


至于析构函数,它们通常是为垃圾收集而保留的,不应该用于获取和设置变量。

构造函数确实可以设置类变量的值。但是,这只能在每个对象的生命周期内发生一次,因为只有在实例化对象时才调用构造函数。如果用户希望稍后在程序中更改变量的值?这就是setter的作用。setter允许更改类中的变量。您还希望getter在程序运行时的任何时候访问变量

至于析构函数,它们通常是为垃圾收集保留的,不应该用于获取和设置变量

  • get_数据不允许用户获取数据,而是设置对象的数据。更好的命名方法是getName()、setName(char*n)、getPrice()和setPrice(int p)
  • 考虑重载构造函数,现在您希望对代码进行一些更改,例如price不能为负或name不能为null
  • 更好的编码风格是:

    班车 { 字符名[30]; 国际价格; 公众: 无效集合名(字符*n) { 如果(n==NULL)n=“”; strcpy(名称,n)

    }
    无效设定价格(INTP)
    {
    如果(p
    
  • get_数据不允许用户获取数据,而是设置对象的数据。更好的命名方法是getName()、setName(char*n)、getPrice()和setPrice(int p)
  • 考虑重载构造函数,现在您希望对代码进行一些更改,例如price不能为负或name不能为null
  • 更好的编码风格是:

    班车 { 字符名[30]; 国际价格; 公众: 无效集合名(字符*n) { 如果(n==NULL)n=“”; strcpy(名称,n)

    }
    无效设定价格(INTP)
    {
    
    如果(p你是对的,getter和setter通常是非常糟糕的想法,这表明你的类的抽象被破坏/不存在。但是你强调的原因并不是它

    您需要仔细考虑每个类应该做什么。目标是每个类都应该做一件事,而且完全一样,然后它们应该是可组合的。这使您可以更轻松地创建新功能和维护现有代码

    例如,你的汽车类不是很好,因为它不允许我有我不想随机打印内容的汽车。这实际上是两个类-一个汽车类和一个随机打印内容

    但是再说一遍,Car类根本不是一个真正的类。它没有什么真正的功能。它只是两个字段的一个方便的聚合。而且有一堆糟糕的C字符串和缓冲区溢出,即使将其描述为方便也太慷慨了


    类很有用,因为它们可以具有抽象接口,允许您隐藏其数据成员的状态。这几乎直接排除了仅为所有内容提供getter和setter,因为这样就不会隐藏任何内容。不提供getter(或更常见的setter)是一个非常强大的工具,也是使用类的一个要点。

    你是对的,getter和setter通常是非常糟糕的想法,这表明你的类的抽象被破坏了/不存在。但是你强调的原因并不是它

    您需要仔细考虑每个类应该做什么。目标是每个类都应该做一件事,而且完全一样,然后它们应该是可组合的。这使您可以更轻松地创建新功能和维护现有代码

    例如,你的汽车类不是很好,因为它不允许我有我不想随机打印内容的汽车。这实际上是两个类-一个汽车类和一个随机打印内容

    但是再说一遍,Car类根本不是一个真正的类。它没有什么真正的功能。它只是两个字段的一个方便的聚合。而且有一堆糟糕的C字符串和缓冲区溢出,即使将其描述为方便也太慷慨了


    类很有用,因为它们可以具有抽象接口,允许您隐藏其数据成员的状态。这几乎直接排除了仅为所有内容提供getter和setter,因为这样就不会隐藏任何内容。不提供getter(或更常见的setter)是一个非常强大的工具,也是使用类的要点之一。

    目前正在形成一个解释getter/setter函数重要性的答案。请记住,当我们可以说二进制时,为什么我们需要一种语言?目前正在形成一个解释getter/setter函数重要性的答案。请记住,为什么我们需要一种语言w我们什么时候能说二进制?
        }
        void setPrice(int p)
        {
                if(p <0) p = 0;
                price = p;
        }
        int getPrice()
        {
               return price;
        }
        char * getName()
        {
                  return name;
        }
    
        ///Lets add the idea of constructor with default values
        car()
        {
            cout<<"constructor has been called"<<endl;
            setPrice(0);
            setName(""):
    
        }
        car(char *n, int p)
        {
            cout<<"2nd constructor has been called"<<endl;
            setName(n);
            setPrice(p);
        }
        ~car()
        {
            cout<<"Name: "<<name<<endl;
            cout<<"Price:"<<price<<endl;
        }
    
    };