我正在学习c ++的赋值运算符的一些理论。
让我们说
class MyClass {
private:
T1 member1;
T2 member2;
public:
// The default copy assignment operator which assigns an object via memberwise copy
MyClass & operator=(const MyClass & rhs) {
member1 = rhs.member1;
member2 = rhs.member2;
return *this;
}
......
}
和
c7 = c6; //member wise copy assignment.
这里我们在赋值操作期间返回对象的引用,并为其指定新对象c7
。
但是,如果我的代码有点像这样:
int a=12;
int &b=a;
int c=&b; //error::invalid conversion from ‘int*’ to ‘int’
为什么这与上述案例不同?
答案 0 :(得分:6)
声明
int& b = a;
声明b
为参考,并使其引用变量a
。
声明
int c = &b;
将c
声明为普通int
变量,然后尝试将其初始化为指向int
的指针。 &符号&
根据上下文执行不同的操作。
对于复制赋值运算符,在初始化声明中的变量时调用 ,而不是调用复制构造函数。
当你有一个拷贝赋值运算符时,例如
MyClass a, b;
a = b; // Copy-assignment operator called
编译器基本上用以下调用替换赋值
a.operator=(b);
换句话说,它是一个普通的成员函数调用,就像任何其他函数一样。
答案 1 :(得分:2)
c7 = c6; //member wise copy assignment.
你说:
这里我们将返回对象的引用 赋值操作并为其指定新对象c7。
这不会返回引用并将其分配给c7。它使用引用c6的operator =
参数在c7上调用rhs
。
你的operator =
需要返回引用的原因是,赋值的结果可以用在另一个表达式中(通常是另一个赋值,但它可以是任何表达式)。所以你可以做到
c8 = c7 = c6;
将在c7上调用operator =
,rhs
引用c6,然后使用该分配的结果在c8上调用operator =
(这将是对c7的返回引用,基于在你的代码上。)
答案 2 :(得分:0)
您的运营商超载不合适。假设这是您的运营商重载代码 -
class ABC:
{
public:
ABC();
bool operator==(const ABC& ip) const
{
if( (this->a == ip.a) &&
(this->b == ip.b))
{
return true;
}
return false;
}
~ABC();
int a,b;
};
现在您可以执行以下操作 -
ABC x,y;
// do new or other operations.
if (x==y)
{return true;}
else return false;
这里我们只重载运算符(==),其他运算符可以以相同的方式重载。