C++ 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要getter和setter?
看到下面的代码,我很困惑为什么我们需要getter和setterC++ 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要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
#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;
}
};