使用常量,获取参数表而不是复制
Use of const, get paremeter NOT by-copy
我写了这段代码:
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;
}
我有这些问题:
- 为什么行
ma.setHouse(333);
对pietro
没有任何副作用(即在第二次打印中门牌号没有改变)? - (我知道这不是正确的方法,但是)我怎样才能使
ma.setHouse(333);
对pietro
有副作用? - 如果上面的代码没有副作用,我为什么要写
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()
复制初始化它,因此,ma
与pietro
对象没有任何关系。
(我知道这不是正确的方法,但是)我怎么能做出 马塞特豪斯(333);对皮埃特罗有副作用?
Address& ma = pietro.getAddress();
为什么我应该写 const Address& getAddress() const {return A;} if 上面的代码没有副作用吗?
你应该让你的函数 const - 正确,但在大多数情况下,返回const-reference
并不是一个好主意。
相关文章:
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么默认复制函数在按值发送参数时不调用?
- std::p ackaged_task 应该删除带有 const 参数的复制 c'tor
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 如何确定捕获不可复制参数的 lambda 的类型?
- 复制 avcodec 参数
- 从函数参数 [C++] 复制整数数组
- 候选构造函数(隐式复制构造函数)不可行:第一个参数需要 l 值
- 将参数的省略复制为返回值
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 复制构造函数参数为0
- 函数指针,可以采用具有常量引用或复制参数的函数
- 标准::函数复制参数
- 使用 std::string 参数和不可移动/可复制参数构建 std::map
- 在矢量中插入元素时,请避免复制参数
- 无意中复制参数
- std::bind 和 std::thread 总是复制参数背后的基本原理是什么?
- std::带可移动、不可复制参数的线程
- boost::bind()是否通过引用或值复制参数