构建在类中的“public:”函数可以改变它调用的类对象吗?

时间:2014-03-17 05:15:24

标签: c++

提前道歉,我觉得我在这里缺少一些重要的东西。每当我以这种方式调用函数时,它都无法改变对象成员变量。 我解释的最简单方法是举个例子:

class herp
{
private:
string derp;

public:
void mderp(herp x, string y) {x.derp = y;}
}

herp object_0;
string temp = "asdf";
object_0.mderp(object0, temp); 

5 个答案:

答案 0 :(得分:2)

您正在将herp x作为值类型传递。在这种情况下,x是您传入的内容的副本。如果您想直接访问x.derp,则应将x作为参考传递:

void mderp(herp& x, string y) {x.derp = y;}

这应该允许修改x.derp

答案 1 :(得分:1)

参数herp to按值传递,这意味着它是原始object_0的副本。 mderp函数修改副本,但该副本立即被丢弃。试试参考。我可能会这样做:

class herp  
{
    private:
    string derp;

    public:
    static void mderp(herp &x, string y) {x.derp = y;}
}

herp object_0;
string temp = "asdf";
object_0.mderp(object0, temp); 

这里重要的是改变herp x -> herp& x,这意味着参数是"对herp的引用"而不是实际的herp值。

在这种情况下,我也将方法设为静态,因为它可以但不是必需的。

答案 2 :(得分:1)

替换

x.derp = y;

this->derp = y;

答案 3 :(得分:0)

我从您的问题中得到的是,您想要初始化您班级的私有变量。但这里有一些错误。你应该阅读更多关于课程的内容。

一种方式:

class herp
{
   private:
     string derp;

   public:
      void mderp(string y) {derp = y;}
 };


    herp object_0;
    string temp = "asdf";
    object_0.mderp(temp); 

答案 4 :(得分:0)

你应该知道两件事。

首先,您的对象的成员变量不会因为您编写代码的方式而更改,您的函数mdepr会创建对象herp的副本。然后它会更改其成员变量并在离开函数时销毁该对象。因此,如果你想保持你的功能,你应该使用引用或指针。例如:

void mderp(herp& x, string y) {x.derp = y;}
void mderp(herp* x, string y) {x->derp = y;} 

第二件事是,根据你对函数的使用示例,你可能不需要这样的函数。成员函数用于对象并允许对其进行修改(除非它们是const函数)。所以你可以写下以下内容:

class herp
{
private:
string derp;

public:
void mderp(string y) {derp = y;}
}

herp object_0;
string temp = "asdf";
object_0.mderp(temp);

希望这会有所帮助:)