C ++:从函数更改类成员值

时间:2016-03-28 06:33:55

标签: c++ class oop scope

我为发布这样一个基本问题而道歉,但我找不到一个合适的答案,说明为什么这不起作用,以及如何让它发挥作用。

我在这里简化了我的问题:

#include <iostream>
using namespace std;

class A {
public:
int x;
};

void otherFunction() {
A A;
cout<<"X: "<<A.x<<endl;
}

int main(){
A A;
A.x = 5;
otherFunction();

return 0;   
}

构建后,班级成员是否会变得不变?

如何扩展对课程所做的更改范围?

结构受限于这种方式吗?

提前感谢您的回答。

3 个答案:

答案 0 :(得分:3)

您未获得预期的输出,因为在otherFunction()中您正在创建一个类型A的新对象,而您之前尚未为其指定值!

在C ++中阅读scope of a variable以了解更多信息

尝试运行下面给出的代码,你应该得到输出为5。

#include <iostream>
using namespace std;

class A {
public:
    int x;
};

void otherFunction(A a) {
    cout << "X: " << a.x << endl;
}

int main(){
    A a;
    a.x = 5;
    otherFunction(a);

    return 0;   
}

或者你可以这样做,这在OOP中被认为是一种很好的做法

class A{
private:
    int x;
public:
    void update(int newx){
        x = newx;
    }
    int getX(){
        return x;
    }
};

int main(){
    A a;
    a.update(5);
    cout << a.getX() << endl;
    return 0;
}

答案 1 :(得分:0)

它正在做它应该做的事情。 您正在函数otherFunction内创建一个新对象,这个新对象将是函数的本地对象。 在main中调用函数otherFunction后打印A.x的值,您将看到A.x的值已更改。

答案 2 :(得分:0)

A中的变量mainA中的变量otherFunction不同,因此它们不会具有相同的值。

授予otherFunction访问main A值的一种方法是将其作为参数传递。例如:

void otherFunction(A p) {
    cout<<"X: "<<p.x<<endl;
}

int main(){
    A a;
    a.x = 5;
    otherFunction(a);

    return 0;   
}

我已经更改了变量的名称,使其更加清晰。 a位于主要位置,a副本传递到otherFunction。该副本在p中称为otherFunctionotherFunctionp发出的内容不会对a造成任何更改。如果您想这样做,则需要通过引用传递,这可能是一个更进一步的话题比你现在。