如何在c++;作品 我正在学习C++赋值运算符的一些理论。
比方说如何在c++;作品 我正在学习C++赋值运算符的一些理论。,c++,assignment-operator,C++,Assignment Operator,比方说 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
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
但是,如果我的代码有点像这样:
int a=12;
int &b=a;
int c=&b; //error::invalid conversion from ‘int*’ to ‘int’
为什么这与上述情况不同???声明
int& b = a;
int c = &b;
将b
声明为引用,并使其引用变量a
宣言
int& b = a;
int c = &b;
将c
声明为正常的int
变量,然后尝试将其初始化为指向int
的指针。符号&
根据上下文做不同的事情
至于复制赋值运算符,在声明中初始化变量时不会调用它,而是调用复制构造函数
当您有一个复制赋值运算符,并执行以下操作时,例如
MyClass a, b;
a = b; // Copy-assignment operator called
编译器基本上用以下调用替换赋值
a.operator=(b);
换句话说,它是一个普通的成员函数调用,就像任何其他调用一样。声明
int& b = a;
int c = &b;
将b
声明为引用,并使其引用变量a
宣言
int& b = a;
int c = &b;
将c
声明为正常的int
变量,然后尝试将其初始化为指向int
的指针。符号&
根据上下文做不同的事情
至于复制赋值运算符,在声明中初始化变量时不会调用它,而是调用复制构造函数
当您有一个复制赋值运算符,并执行以下操作时,例如
MyClass a, b;
a = b; // Copy-assignment operator called
编译器基本上用以下调用替换赋值
a.operator=(b);
换句话说,这是一个普通的成员函数调用,就像其他调用一样。运算符重载不合适。假设这是运算符重载代码-
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;
这里我们只是重载运算符(=),其他运算符也可以以相同的方式重载。您的运算符重载不合适。假设这是运算符重载代码-
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;
};
c7 = c6; //member wise copy assignment.
现在您可以执行以下操作-
ABC x,y;
// do new or other operations.
if (x==y)
{return true;}
else return false;
这里我们只是重载运算符(=),其他运算符也可以以相同的方式重载
c7 = c6; //member wise copy assignment.
你说:
在这里,我们将在调用过程中返回对对象的引用
分配操作并将其分配给新对象c7
这不是返回引用并将其分配给c7。它正在调用c7上的operator=
,带有引用c6的rhs
参数
运算符=
需要返回引用的原因是,赋值的结果可以用在另一个表达式中(通常是另一个赋值,但可以是任何表达式)。所以你可以
c8 = c7 = c6;
它将调用c7上的operator=
,其中一个rhs
引用c6,然后调用c8上的operator=
,并带有该赋值的结果(根据您的代码,它将返回对c7的引用)
你说:
在这里,我们将在调用过程中返回对对象的引用
分配操作并将其分配给新对象c7
这不是返回引用并将其分配给c7。它正在调用c7上的operator=
,带有引用c6的rhs
参数
运算符=
需要返回引用的原因是,赋值的结果可以用在另一个表达式中(通常是另一个赋值,但可以是任何表达式)。所以你可以
c8 = c7 = c6;
它将调用c7上的
operator=
,其中一个rhs
引用c6,然后调用c8上的operator=
,以及该赋值的结果(根据您的代码,它将返回对c7的引用).@Pileborg您能简要说明操作员分配情况下会发生什么吗?谢谢。@Pileborg您能简要说明操作员分配情况下会发生什么吗?谢谢。