需要帮助来理解C ++中的组成和类函数

时间:2019-02-17 04:10:48

标签: c++

我刚刚开始学习c ++,需要帮助来了解这些类和函数之间的情况。如果classA有一个classB,那么如果我为B类使用了setter,则直到A类,它都没有改变。

如果我直接使用classB setter,它可以正常工作。我还发现,如果我使用指针,可以使函数正常工作,但是我想了解为什么它不起作用。

#include <iostream>

ClassA
{
private:
    ClassB test;
public:
    ClassB getTest(){return test;}
};

ClassB
{
private:
    int a = 10;
public:
    int getA(){return a;}
    void setA(int b){a += b;}
};

int main()
{
    ClassA myClass;
    myClass.getTest().setA(20);
    std::cout << myClass.getTest().getA(); // Will return 10 still
}

我认为这会将int in test修改为30,但不会,并且int仍为10。

2 个答案:

答案 0 :(得分:2)

ClassB getTest(){return test;}

这将返回test副本。您修改副本,而不是成员test本身。因此,稍后您发现test中没有变化。

要允许用户修改它,您需要通过引用返回:

ClassB& getTest(){return test;}

答案 1 :(得分:0)

好的,您会喜欢上它的。 C ++不是Java。您在ClassA上的访问方法返回的是ClassB对象的COPY,而不是对其的某种引用。这是一个完全不同的ClassB对象,因此,如果您摆弄它,就不会再爱A中的对象了。

您需要使用如下访问方法:

ClassB & getTest(){return test;}

请注意,&表示“参考”。这是一个指针,但是您可以使用点表示法而不是箭头表示法。

之后,您编写的代码应该可以工作。但是请注意,如果您调用myClass.getTest()然后进行操作,它将看起来像:

ClassB & myClassB = myClass.getTest();
myClassB.setA(20);

现在,作为警告,此代码将编译:

ClassB myClassB = myClass.getTest();
myClassB.setA(20);

这段代码说的是:“ myClass-给我一个对您的ClassB对象的引用。但是,我接下来将构造一个新的ClassB对象并将其复制到其中。”换句话说,它的工作方式与getTest()不返回引用相同。