使用常量,获取参数表而不是复制

Use of const, get paremeter NOT by-copy

本文关键字:复制 参数 常量 获取      更新时间:2023-10-16

我写了这段代码:

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;}

Q1。因为您正在对pietro Address的副本进行操作:

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

问题 2.参考一下?

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

问题 3.所以你可以有常量的正确性。如果没有 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

为什么 ma.setHouse(333); 行对 彼得罗(即在第二次打印中门牌号没有改变)?

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

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

(我知道这不是正确的方法,但是)我怎么能做出 马塞特豪斯(333);对皮埃特罗有副作用?

Address& ma = pietro.getAddress();

为什么我应该写 const Address& getAddress() const {return A;} if 上面的代码没有副作用吗?

你应该让你的函数 const - 正确,但在大多数情况下,返回const-reference并不是一个好主意。