为什么我的c ++对象不会影响另一个c ++对象?

时间:2014-02-06 08:31:07

标签: c++

我有一个简单的c ++类intHolder,它只包含一个int。它也可以添加到那个工作的int,或者将自己添加到另一个intHolder中包含的另一个int,这不起作用。这与我在Java中遇到的情况完全不同。发生了什么事?

class intHolder{
private:
    int i;
public:
    intHolder(int myInt){i = myInt;}
    void addToInt(int inc){ i = i + inc;}
    void printInt(){cout << i << endl;}
    void addToOtherInt(intHolder other){other.addToInt(i);}
};

主要方法

int main () {
    intHolder ih1(1);
    ih1.printInt();//Should be 1, is 1
    ih1.addToInt(3);
    ih1.printInt();//Should be 4, is 4
    intHolder ih2(2);
    ih2.printInt();//Should be 2, is 2
    ih1.addToOtherInt(ih2);
    ih1.printInt();//Should be 4, is 4
    ih2.printInt();//Should be 6, is 2
};

1 个答案:

答案 0 :(得分:13)

您按价值传递intHolder。这意味着该函数作用于本地副本,因此对调用方没有影响。您需要传递参考:

void addToOtherInt(intHolder& other) { other.addToInt(i); }
                            ^

请注意,通常当您拥有包含支持算术运算的其他类型的类型时,您会提供重载运算符,以便您可以执行以下操作:

intHolder a = 5;
intHolder b = 10;
intHolder c = a + b;
c += 42;
a = 42 - b;

等等。有关详细信息,请参阅this extensive discussion on operator overloading

此外,对于&#34;打印&#34;,通常会重载ostream& operator<<,然后允许您流式传输到各种流,包括但不限于std::cout。例如:

struct Foo
{
  int i;
};

std::ostream& operator<<(std::ostream& o, const Foo& f)
{
  return o << f.i;
}

允许你说

Foo f;
std::cout << f;
std::cerr << f;
std::ofstream tmp("foo.txt");
tmp << f;