如何在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您能简要说明操作员分配情况下会发生什么吗?谢谢。