为什么这个运算符重载有效?
Why does this operator overloading work?
我正在尝试通过在线教程学习 C++ OOP 概念,在该教程中我遇到了说明运算符重载的代码片段。
代码如下:
class MyClass{
int var;
public:
Myclass(int value=0){
var = value;
}
Myclass operator+(Myclass &obj){
Myclass newobj;
newobj.var = this->var + obj.var;
return newobj;
}
};
假设我像这样在主函数中调用运算符:
int main(){
...
obj3 = obj2 + obj1;
...
}
在 类 的早期教程中,我了解了为什么复制构造函数要求所有参数都通过引用传递,因为它们本身就是如何复制两个 class 对象的定义。因此,据我所知,当必须复制 class 的对象时,复制构造函数是必须的。
在上面的代码片段中,在我看来,编译器将尝试 "copy" newobj 的值到 main() 函数 (obj3) 中的 L_value。但是,如果没有定义复制构造函数,这怎么可能呢。我是不是误解了什么?
感谢您的帮助!
http://en.cppreference.com/w/cpp/language/copy_constructor#Implicitly-declared_copy_constructor
如果您使用的是标准 C++ 2003 或更早版本的复制构造函数,则始终为任何 class T
隐式定义(由编译器生成),除非:
- T 具有无法复制的非静态数据成员(具有已删除、不可访问或不明确的复制构造函数);
- T 具有无法复制的直接或虚拟基 class(具有已删除、不可访问或不明确的复制构造函数);
- T 有直接或虚拟基 class,带有已删除或不可访问的析构函数;
如果您使用的是标准 C++ 2011 或更新的复制构造函数,则始终为任何 class T
隐式定义(由编译器生成),除非:
- T 具有无法复制的非静态数据成员(具有已删除、不可访问或不明确的复制构造函数);
- T 具有无法复制的直接或虚拟基 class(具有已删除、不可访问或不明确的复制构造函数);
- T 有直接或虚拟基 class,带有已删除或不可访问的析构函数;
- T 具有用户定义的移动构造函数或移动赋值运算符;
- T 是一个联合并且有一个带有非平凡复制构造函数的变体成员;
- T 有一个右值引用类型的数据成员。
还要记住
a = b;
主要不是调用复制构造函数,而是复制赋值。如果你的 class if suitable.
我正在尝试通过在线教程学习 C++ OOP 概念,在该教程中我遇到了说明运算符重载的代码片段。
代码如下:
class MyClass{
int var;
public:
Myclass(int value=0){
var = value;
}
Myclass operator+(Myclass &obj){
Myclass newobj;
newobj.var = this->var + obj.var;
return newobj;
}
};
假设我像这样在主函数中调用运算符:
int main(){
...
obj3 = obj2 + obj1;
...
}
在 类 的早期教程中,我了解了为什么复制构造函数要求所有参数都通过引用传递,因为它们本身就是如何复制两个 class 对象的定义。因此,据我所知,当必须复制 class 的对象时,复制构造函数是必须的。
在上面的代码片段中,在我看来,编译器将尝试 "copy" newobj 的值到 main() 函数 (obj3) 中的 L_value。但是,如果没有定义复制构造函数,这怎么可能呢。我是不是误解了什么?
感谢您的帮助!
http://en.cppreference.com/w/cpp/language/copy_constructor#Implicitly-declared_copy_constructor
如果您使用的是标准 C++ 2003 或更早版本的复制构造函数,则始终为任何 class T
隐式定义(由编译器生成),除非:
- T 具有无法复制的非静态数据成员(具有已删除、不可访问或不明确的复制构造函数);
- T 具有无法复制的直接或虚拟基 class(具有已删除、不可访问或不明确的复制构造函数);
- T 有直接或虚拟基 class,带有已删除或不可访问的析构函数;
如果您使用的是标准 C++ 2011 或更新的复制构造函数,则始终为任何 class T
隐式定义(由编译器生成),除非:
- T 具有无法复制的非静态数据成员(具有已删除、不可访问或不明确的复制构造函数);
- T 具有无法复制的直接或虚拟基 class(具有已删除、不可访问或不明确的复制构造函数);
- T 有直接或虚拟基 class,带有已删除或不可访问的析构函数;
- T 具有用户定义的移动构造函数或移动赋值运算符;
- T 是一个联合并且有一个带有非平凡复制构造函数的变体成员;
- T 有一个右值引用类型的数据成员。
还要记住
a = b;
主要不是调用复制构造函数,而是复制赋值。如果你的 class if suitable.