1

我写了这段代码:

class Address{

  private:
    std::string street;
    int house;

  public:
    Address(std::string s, int h):
      street(s), house(h) {}

    void setHouse(int h) {house = h;}

    friend std::ostream &operator << (std::ostream& os, Address &a);
};

class Person{

    private:
      std::string name;
      Address A;

    public:
      Person(std::string n, std::string v, int c) :
        name(n), A(v, c) {}

      Address& getAddress(){return A;}

    friend std::ostream &operator << (std::ostream& os, Person &a);

};

std::ostream &operator << (std::ostream& os, Address &a){

  return os << "[" << a.street << ", " << a.house << "]";
}

std::ostream &operator << (std::ostream& os, Person &p){

  return os << p.name << " " << p.A;
}

int main(){

  Person pietro("Pietro", "Champs Elysees", 16);

  std::cout << pietro << std::endl;

  Address ma = pietro.getAddress();
  ma.setHouse(333); 

  std::cout << pietro << std::endl;

  return EXIT_SUCCESS;
}

我有这些问题:

  1. 为什么该行ma.setHouse(333);没有任何副作用pietro(即在第二个打印中,门牌号没有改变)?
  2. (我知道这不是正确的方法,但是)我怎样才能ma.setHouse(333);产生副作用pietro
  3. const Address& getAddress() const {return A;}如果上面的代码没有副作用,我为什么要写?
4

2 回答 2

2

为什么行 ma.setHouse(333); 对 pietro 没有任何副作用(即在第二张印刷品中,门牌号没有改变)?

  Address ma = pietro.getAddress();
  ma.setHouse(333);

创建对象 ma 并从 复制初始化它pietro.getAddress(),因此ma与对象没有任何关系pietro

(我知道这不是正确的方法,但是)我怎样才能制作 ma.setHouse(333); 对 pietro 有副作用吗?

Address& ma = pietro.getAddress();

如果上面的代码没有副作用,我为什么要写 const Address& getAddress() const {return A;}?

您应该使您的函数 const - 正确,但const-reference在大多数情况下 return 并不是一个好主意。

于 2012-09-17T10:11:34.370 回答
2

Q1。因为您正在对 's 的副本进行操作pietroAddress

Address ma = pietro.getAddress(); // ma is a copy of pietro's address
ma.setHouse(333);                 // modify copy, not pietro 

Q2。拿个参考?

Address& ma = pietro.getAddress(); // ma is a reference to pietro's Address.
ma.setHouse(333);                  // modifies pietro's Address

Q3。所以你可以有 const 正确性。如果没有 const 方法和 const 返回值,您可能会影响对象的内部结构。此外,您不能在 const 实例或引用上调用该方法。

const Address& ma = pietro.getAddress(); // Calls const method. Cannot modify pietro
Address& ma = pietro.getAddress(); // calls non-const method. Can modify pietro
于 2012-09-17T10:11:50.250 回答