c++:当我在构造函数中设置对象变量并且对象更改其值时,为什么看不到对象变量的变化

c++: why can't I see changes of an object variable, when I set it in the constructor and the object changes the value of it

提问人:user3137385 提问时间:7/12/2023 更新时间:7/12/2023 访问量:47

问:

也许最好显示代码,然后最好了解我的问题是什么。

类:

Cls::Cls() {}
Cls::Cls(int &var) : m_var(var){
    std::cout << "constructor: " << m_var << std::endl;
}
Cls::~Cls() {}

void Cls::setVar() const {
    m_var = 5;
    std::cout << "setVar: " << m_var << std::endl;
}

页眉:

class Cls {

public:
    Cls();
    Cls(int &var);
    virtual ~Cls();
    
    void setVar() const;
    
private:
    mutable int m_var;
};

主要:

int main() {

    int var = 1;

    Cls *cls;
    cls = new Cls(var);
    cls->setVar();
    
    std::cout << "var: " << var << std::endl;
}

因此,我使用自定义构造函数传递了。在它之后,我调用一个函数来更改变量的值。我预计,我会看到 .我错了。我怎样才能做到这一点?我不想将变量作为函数参数传递。varCls(int &var)main

C++ 构造函数 按引用传递

评论

0赞 user207421 7/12/2023
它应该是“可变的 int &m_var”,确定吗?目前,您只是在复制值。
0赞 Some programmer dude 7/12/2023
是的,您将引用传递给构造函数。但不是参考。初始化或赋值时,会将值复制到 .varCls::m_varm_var
0赞 john 7/12/2023
这里有两个变量,分别是 和 。它们是不同的变量,改变一个不会改变另一个。varmainm_varCls
1赞 Some programmer dude 7/12/2023
此外,这里不需要指针。您是否来自像 C# 或 Java 这样的语言,您必须使用这些语言来创建对象?这在 C++ 中是不需要的。我建议你投资一些好的C++初学者书籍new
1赞 john 7/12/2023
为了实现你想要的,你需要改变成为一个参考。但这不太可能是一个好主意,课堂上的参考资料并不常见,尤其是对于初学者来说。m_varint& m_var;

答:

0赞 CaptainHb 7/12/2023 #1

虽然将 in main 作为引用传递给构造函数,但在构造函数中,它会将参数的值复制到 data 成员。也许您必须将数据成员声明为:varClsClsvarm_varm_var

mutable int& m_var;
1赞 mugiseyebrows 7/12/2023 #2
private:
    mutable int m_var;

这不是一个参考,这是一个int,你需要:

private:
    int& m_var;

由于您的类具有作为成员的引用,因此必须初始化该成员,因此您不能有默认构造函数。

0赞 user3137385 7/12/2023 #3

好的,我找到了解决方案。它实际上很容易安静。

类:

Cls::Cls() {}
Cls::Cls(int &var) : m_var(&var){
    std::cout << "constructor: " << *m_var << std::endl;
}
Cls::~Cls() {}

void Cls::setVar() const {
    *m_var = 5;
    std::cout << "setVar(): " << *m_var << std::endl;
}

页眉:

class Cls {

public:
    Cls();
    Cls(int &var);
    virtual ~Cls();
    
    void setVar() const;
    
private:
    int *m_var;
};

主要:

    int var = 1;

    Cls *cls;
    cls = new Cls(var);
    cls->setVar();
    std::cout << "main var 1: " << var << std::endl;
}

对于那些问为什么以及如何...这不是我的实际代码。这是一个非常简短的示例,显示了我在代码中遇到的问题。

评论

0赞 Some programmer dude 7/12/2023
也不要使用指针!在某种程度上,它实际上比引用更糟糕。这应该解决的实际和根本问题是什么?请删除这个问题,并发布一个新问题,直接询问实际和潜在的问题,而不是让它成为 XY 问题。然后,我们可以帮助您解决这个问题,提供更好、更合适的解决方案。