C++ 已跳过/未发生赋值运算符重载

C++ 已跳过/未发生赋值运算符重载,c++,operator-overloading,C++,Operator Overloading,我正在尝试为一些工作创建一个库,并且正在为赋值操作使用运算符重载。 假设X和Y是类的两个实例,它们已=重载,因此: A& A::operator=(A &rhs) { A::assign(*this, rhs); return *this; } 当我这样做时: A z; z = x + y; // x and y are other instances of class A 然而,当我做了一件事,一切都很好` A p = q + r; 重载例程不会被调用。我

我正在尝试为一些工作创建一个库,并且正在为赋值操作使用运算符重载。 假设X和Y是类的两个实例,它们已=重载,因此:

A& A::operator=(A &rhs)
{
    A::assign(*this, rhs);
    return *this;
}
当我这样做时:

A z;
z = x + y; // x and y are other instances of class A
然而,当我做了一件事,一切都很好`

A p = q + r;
重载例程不会被调用。我对运算符重载不是很有经验,有人能解释一下发生了什么吗。一种解释可能是,p只是已经创建的q+r对象的别名,然而,z创建了类a的新实例,因此当z被指定给时,操作符重载就开始了。有点像:

#include <iostream>
using namespace std; 
class X
{
    public:
    X();
};

X::X()
{
    cout<<"called"<<endl;
}

int main(int argc, char *argv[]) 
{
    X e; X f;
    X g = e;
}
调用的where只打印两次,e和f各打印一次,g不打印

如果是这样的话,有人能建议一种方法来触发p的操作符重载吗


谢谢。

怎么回事

A p = q + r;
调用的复制构造函数,而不是赋值运算符。是的,很奇怪。这与您键入的内容相同:

A p(q + r);

事情是这样的

A p = q + r;
调用的复制构造函数,而不是赋值运算符。是的,很奇怪。这与您键入的内容相同:

A p(q + r);

如果您声明一个变量并在同一行初始化它,它仍然会调用复制构造函数

以下是两种初始化语法:

X a;
X b(a);

X a;
X b = a;

它们的含义略有不同,但在大多数情况下,它们的含义是相同的。区别在于编译器是否保证避免某些构造/破坏。在任何一种情况下,都将调用复制构造函数,因为您正在构造一个对象。我不太记得保证差异的细节是什么。

如果您声明一个变量并在同一行初始化它,它仍然会调用复制构造函数

以下是两种初始化语法:

X a;
X b(a);

X a;
X b = a;

它们的含义略有不同,但在大多数情况下,它们的含义是相同的。区别在于编译器是否保证避免某些构造/破坏。在任何一种情况下,都将调用复制构造函数,因为您正在构造一个对象。我不太记得担保差异的细节是什么。

调用复制构造函数的情况:

when you return an object
when you pass an object to some function
X b(a);
X b = a;
调用赋值运算符重载函数的情况是

X b; b=a;//where a is already existing object and already intialised.

调用复制构造函数的情况:

when you return an object
when you pass an object to some function
X b(a);
X b = a;
调用赋值运算符重载函数的情况是

X b; b=a;//where a is already existing object and already intialised.

如果有人能找到解释这两种语法形式细微差异的文档,请发表评论;与参数传递、函数返回、引发异常15.1、处理异常15.3和聚合成员初始化8.5.1一样,都称为复制初始化。[注意:复制初始化可能会调用[dcl.init]节中的move 12.8.-end Note],然后继续声明初始化调用构造函数。@Ben Voigt谢谢mate。这或多或少就是我想要的。如果有人能找到解释这两种语法形式细微差异的文档,请发表评论;与参数传递、函数返回、引发异常15.1、处理异常15.3和聚合成员初始化8.5.1一样,都称为复制初始化。[注意:复制初始化可能会调用[dcl.init]节中的move 12.8.-end Note],然后继续声明初始化调用构造函数。@Ben Voigt谢谢mate。这或多或少就是我想要的。