为什么需要使用 const A& 而不仅仅是 A&?
Why it is needed to use const A& instead of just A&?
我想知道为什么在这种情况下需要使用const A&,为什么我不能只使用A&?根据我读到的是因为它指定它不会改变对象。还有其他原因吗?我想要一个更好的解释。
代码:
#include<iostream>
#include<set>
class A{
public:
int x;
A(int x=0): x{x} {std::cout<<"Construct"<<std::endl;};
A(const A& rhs) {x=rhs.x;std::cout<<"Copy"<<std::endl;}
};
bool operator < (const A& lhs,const A& rhs) {return lhs.x<rhs.x;}
int main(){
std::set<A> Set;
A a(10);
Set.insert(a);
Set.emplace(10);
return 0;
}
A&
是一个左值引用,这意味着它可以改变它正在看的东西。有
A(A& rhs)
你可以这样称呼它
int x = 10;
A a(x);
然后在构造函数中对 rhs
的任何更改都会更改 实际 变量 x
。这很好。但是当你这样做时
A a(10);
这是个问题。因为如果有人在构造函数中更改 rhs
,那意味着我们必须“更改”数字 10
,而这甚至不是一件有意义的事情。例如,10 += 1
在 C++ 中是无稽之谈。
const A&
保证我们不会 更改 所指向的东西,因此传递 [=17 这样的临时值变得安全=] 到函数。
如果我们知道它总是像 int
这样的“小”数据类型,我们可能会按值接受它,但我们不想接受 A
作为参数,因为某些类型(如矢量)的复制成本很高,而其他(如 unique_ptr
)则完全不可能复制。
根据您的用例,您可以考虑使用 A&&
,一个右值引用。如果您打算将值 移动 到您正在构建的 class 而不是复制它,这将很有用。您可以在 this question 上阅读更多关于移动语义的信息,但如果您刚刚开始使用 C++,最好远离右值引用。不过,很高兴知道它们的存在。
我想知道为什么在这种情况下需要使用const A&,为什么我不能只使用A&?根据我读到的是因为它指定它不会改变对象。还有其他原因吗?我想要一个更好的解释。
代码:
#include<iostream>
#include<set>
class A{
public:
int x;
A(int x=0): x{x} {std::cout<<"Construct"<<std::endl;};
A(const A& rhs) {x=rhs.x;std::cout<<"Copy"<<std::endl;}
};
bool operator < (const A& lhs,const A& rhs) {return lhs.x<rhs.x;}
int main(){
std::set<A> Set;
A a(10);
Set.insert(a);
Set.emplace(10);
return 0;
}
A&
是一个左值引用,这意味着它可以改变它正在看的东西。有
A(A& rhs)
你可以这样称呼它
int x = 10;
A a(x);
然后在构造函数中对 rhs
的任何更改都会更改 实际 变量 x
。这很好。但是当你这样做时
A a(10);
这是个问题。因为如果有人在构造函数中更改 rhs
,那意味着我们必须“更改”数字 10
,而这甚至不是一件有意义的事情。例如,10 += 1
在 C++ 中是无稽之谈。
const A&
保证我们不会 更改 所指向的东西,因此传递 [=17 这样的临时值变得安全=] 到函数。
如果我们知道它总是像 int
这样的“小”数据类型,我们可能会按值接受它,但我们不想接受 A
作为参数,因为某些类型(如矢量)的复制成本很高,而其他(如 unique_ptr
)则完全不可能复制。
根据您的用例,您可以考虑使用 A&&
,一个右值引用。如果您打算将值 移动 到您正在构建的 class 而不是复制它,这将很有用。您可以在 this question 上阅读更多关于移动语义的信息,但如果您刚刚开始使用 C++,最好远离右值引用。不过,很高兴知道它们的存在。