C++;构造函数功能 所以我正在为我的第一学期C++做一个期末复习表(一般是编程),我遇到了这个问题:

C++;构造函数功能 所以我正在为我的第一学期C++做一个期末复习表(一般是编程),我遇到了这个问题:,c++,C++,使用私有成员字符串name、字符串idNum、, 除了一个班的学生,那是从一个私人继承人那里继承来的 成员字符串专业,整年。落实建设者,, 能手和二传手 最后,我复习了一些构造器,并决定观看一些YouTube视频,以澄清一些事情,澄清课堂上可能存在的一些误解。现在,据我所知,如果我只是为了成员“姓名”而这样做,它应该看起来像这样: class Person { public: Person(string z) { setName(z

使用私有成员字符串name、字符串idNum、, 除了一个班的学生,那是从一个私人继承人那里继承来的 成员字符串专业,整年。落实建设者,, 能手和二传手

最后,我复习了一些构造器,并决定观看一些YouTube视频,以澄清一些事情,澄清课堂上可能存在的一些误解。现在,据我所知,如果我只是为了成员“姓名”而这样做,它应该看起来像这样:

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