C++;构造函数功能 所以我正在为我的第一学期C++做一个期末复习表(一般是编程),我遇到了这个问题:
使用私有成员字符串name、字符串idNum、, 除了一个班的学生,那是从一个私人继承人那里继承来的 成员字符串专业,整年。落实建设者,, 能手和二传手 最后,我复习了一些构造器,并决定观看一些YouTube视频,以澄清一些事情,澄清课堂上可能存在的一些误解。现在,据我所知,如果我只是为了成员“姓名”而这样做,它应该看起来像这样:C++;构造函数功能 所以我正在为我的第一学期C++做一个期末复习表(一般是编程),我遇到了这个问题:,c++,C++,使用私有成员字符串name、字符串idNum、, 除了一个班的学生,那是从一个私人继承人那里继承来的 成员字符串专业,整年。落实建设者,, 能手和二传手 最后,我复习了一些构造器,并决定观看一些YouTube视频,以澄清一些事情,澄清课堂上可能存在的一些误解。现在,据我所知,如果我只是为了成员“姓名”而这样做,它应该看起来像这样: class Person { public: Person(string z) { setName(z
class Person
{
public:
Person(string z)
{
setName(z);
}
void setName(string x)
{
name = x;
}
string getName()
{
return name;
}
private:
string name;
};
class Person
{
public:
Person(string z)
{
name = z;
}
string getName()
{
return name;
}
private:
string name;
};
(请让我知道我一开始是否正确)
然后我看了我教授的一些例子,在其中一个例子中,他写了以下内容:
class Shape
{
public:
void setPosition(int x, int y)
{
xpos = x; ypos = y;
}
double getArea()
{
return 0;
}//return length * width; }
private:
int xpos, ypos, name;
};
这就是我感到困惑的地方,因为如果我遵循这个惯例,我不会包括任何二传手?如果没有setter,我的答案在功能上会是一样的吗
编辑:哎呀,这个例子确实有一个setter,我一定把它和构造函数本身搞混了,除非它实际上两者都是
class Person
{
public:
Person(string z)
{
setName(z);
}
string getName()
{
return name;
}
private:
string name;
};
我知道这个问题也特别要求getter,但我只想澄清一些事情,因为似乎有一些相互冲突的信息。您可以将构造函数视为设置成员属性的实例化器。不同之处在于,对于一个对象,构造函数只被调用一次。假设你有一个不会改变的字段——如果你写了一个公共的设置程序,这将是不正确的。 以拥有社会保险号码的美国人为例。是的,所以如果你在模拟一个美国人(person),你可能不包括
set\ussn
方法
class American {
public:
American(std::string name, std::string ssn) {
name_ = name;
ssn_ = ssn;
}
void interact() { /* do my living stuff */ }
private:
std::string name_;
std::string ssn_;
};
现在您可以这样使用:
American erip("Elijah", "mysecretssn");
erip.interact();
...
如果我定期更改头发颜色,您可以在我的类中添加set\u hair\u color
方法
void set_hair_color(const std::string hair_color);
给我的私人成员发一个std::string hair\u color\u
现在我可以这样做:
American erip("Elijah", "mysecretssn");
erip.interact();
erip.set_hair_color("black");
erip.set_hair_color("red");
...
总之,如果您的个人情况发生变化,您将编写setter,但所有成员函数都可以访问私有变量,因此可以对其进行更改。setter是向代码用户“公开”成员变量的一种方法。您可以将构造函数视为设置成员属性的实例化器。不同之处在于,对于一个对象,构造函数只被调用一次。假设你有一个不会改变的字段——如果你写了一个公共的设置程序,这将是不正确的。 以拥有社会保险号码的美国人为例。是的,所以如果你在模拟一个美国人(person),你可能不包括
set\ussn
方法
class American {
public:
American(std::string name, std::string ssn) {
name_ = name;
ssn_ = ssn;
}
void interact() { /* do my living stuff */ }
private:
std::string name_;
std::string ssn_;
};
现在您可以这样使用:
American erip("Elijah", "mysecretssn");
erip.interact();
...
如果我定期更改头发颜色,您可以在我的类中添加set\u hair\u color
方法
void set_hair_color(const std::string hair_color);
给我的私人成员发一个std::string hair\u color\u
现在我可以这样做:
American erip("Elijah", "mysecretssn");
erip.interact();
erip.set_hair_color("black");
erip.set_hair_color("red");
...
总之,如果您的个人情况发生变化,您将编写setter,但所有成员函数都可以访问私有变量,因此可以对其进行更改。setter是一种向代码用户“公开”成员变量的方法。不,没有setter的示例如下所示:
class Person
{
public:
Person(string z)
{
setName(z);
}
void setName(string x)
{
name = x;
}
string getName()
{
return name;
}
private:
string name;
};
class Person
{
public:
Person(string z)
{
name = z;
}
string getName()
{
return name;
}
private:
string name;
};
您不能在编写上述函数时调用setName
,因为未定义setName(String)
函数
但如果你这样写的话,你就不能改变任何一个人的名字。
基本上,当对象内部的字段(基本类型变量或另一个对象)设置为private
时,您无法从该对象外部访问它。因此,通过像这样编写Person
,您可以使其不可变-在创建之后,您无法更改Person
实例的内容
你可以把它看作是选择:
使用public
变量或private
与setField
和getField
方法。
基本上,第二个选项是最好的,因为您总是可以向setter添加一些逻辑,即在字符串中大写字母,或者检查提供的值是否有效
在教授的示例中,您提供了setter-
void setPosition(int,int)
方法,但他并没有编写构造函数,所以编译器将添加默认的无参数构造函数,该构造函数不会设置XPO或YPO。不,您的示例中没有setter的情况如下所示:
class Person
{
public:
Person(string z)
{
setName(z);
}
void setName(string x)
{
name = x;
}
string getName()
{
return name;
}
private:
string name;
};
class Person
{
public:
Person(string z)
{
name = z;
}
string getName()
{
return name;
}
private:
string name;
};
您不能在编写上述函数时调用setName
,因为未定义setName(String)
函数
但如果你这样写的话,你就不能改变任何一个人的名字。
基本上,当对象内部的字段(基本类型变量或另一个对象)设置为private
时,您无法从该对象外部访问它。因此,通过像这样编写Person
,您可以使其不可变-在创建之后,您无法更改Person
实例的内容
你可以把它看作是选择:
使用public
变量或private
与setField
和getField
方法。
基本上,第二个选项是最好的,因为您总是可以向setter添加一些逻辑,即在字符串中大写字母,或者检查提供的值是否有效
在教授的例子中,您提供了SETTER -C++ >空设置(int,int)< />方法,但他没有编写构造函数,所以编译程序将添加默认的无参数构造函数,它不设置XPOS,也不yPOS。
< P>这不限于C++,而是一般OOP风格。< /P> 通常,您将同时拥有setter和getter,例如setFirstName(..)和getFirstName(),因为您可以更改这些状态(特别是通过婚姻获得的姓氏),或者仅仅因为创建对象时并非所有数据都可用,所以有人输入了一个拼写错误,不管怎样 如果您有一个派生属性,那么通常只有一个getter。在t