C++ 已跳过/未发生赋值运算符重载
我正在尝试为一些工作创建一个库,并且正在为赋值操作使用运算符重载。 假设X和Y是类的两个实例,它们已=重载,因此: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; 重载例程不会被调用。我
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。这或多或少就是我想要的。