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番目の印刷では家番号は変更されません)?
  2. (私はそれが正しい方法ではないことを知っていますが)どうすればma.setHouse(333);副作用を起こすことができpietroますか?
  3. const Address& getAddress() const {return A;}上記のコードに副作用がないのに、なぜ書く必要があるのですか?
4

2 に答える 2

2

行ma.setHouse(333); ピエトロに副作用はありませんか (つまり、2 番目の印刷では家番号は変更されません)?

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

オブジェクト ma を作成し、それを からコピーして初期化するpietro.getAddress()ため、オブジェクトmaとは何の関係もありませんpietro

(正しい方法ではないことはわかっていますが) ma.setHouse(333); を作成するにはどうすればよいですか? ピエトロに副作用がありますか?

Address& ma = pietro.getAddress();

上記のコードに副作用がないのに、なぜ const Address& getAddress() const {return A;} と書く必要があるのでしょうか?

関数を const にする必要があります-正しいですがconst-reference、ほとんどの場合、戻り値はあまり良い考えではありません。

于 2012-09-17T10:11:34.370 に答える
2

Q1. の のコピーを操作しているため: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 に答える