C++ C++;调用成员对象';什么是重载运算符? #包括 类内一{ 国际货币基金组织; 公众: InnerOne(int-iDummy){ m_iDummy=iDummy; } InnerOne和运算符=(InnerOne和obj){ printf(“在InnerOne运算符中=\n”); m_iDummy=对象m_iDummy; 归还*这个; } }; 外酮类{ InnerOne m_InnerOne; 公众: 外层(国际雪级):内层(国际雪级){ } }; int main(){ 外酮a(1); 外酮b(2); a=b; 返回1; }

C++ C++;调用成员对象';什么是重载运算符? #包括 类内一{ 国际货币基金组织; 公众: InnerOne(int-iDummy){ m_iDummy=iDummy; } InnerOne和运算符=(InnerOne和obj){ printf(“在InnerOne运算符中=\n”); m_iDummy=对象m_iDummy; 归还*这个; } }; 外酮类{ InnerOne m_InnerOne; 公众: 外层(国际雪级):内层(国际雪级){ } }; int main(){ 外酮a(1); 外酮b(2); a=b; 返回1; },c++,C++,InnerOne的运算符=是否会被调用? 如果是,那么如何以及为什么?是。为OuterOne自动生成的赋值运算符将调用InnerOne的赋值运算符。编译器为OuterOne生成的复制赋值将调用InnerOne的操作符= 作为旁注,如果您将InnerOnecopy assignment编写为: #include <stdio.h> class InnerOne { int m_iDummy; public: InnerOne(int iDummy)

InnerOne的运算符=是否会被调用?
如果是,那么如何以及为什么?

是。为
OuterOne
自动生成的赋值运算符将调用
InnerOne
的赋值运算符。编译器为
OuterOne
生成的复制赋值将调用
InnerOne
操作符=

作为旁注,如果您将
InnerOne
copy assignment编写为:

 #include <stdio.h>

 class InnerOne {
     int m_iDummy;
     public:
     InnerOne(int iDummy) {
         m_iDummy=iDummy;
     }   

     InnerOne& operator=(InnerOne &obj) {
         printf("In InnerOne Operator=\n");
         m_iDummy = obj.m_iDummy;
         return *this;
     }   

 };  

 class OuterOne {
     InnerOne m_innerOne;
     public:
     OuterOne(int iVal) : m_innerOne(iVal) {
     }   

 };  

 int main() {
     OuterOne a(1);
     OuterOne b(2);
     a = b;
     return 1;
 }   
const
是必需的,否则您的代码将无法用于以下情况:

InnerOne& operator=(const InnerOne &obj)
                  //^^^^ add this!
请参见此处的错误:


一旦按照我的建议添加了
const
,它就会编译。请参见:

编译并试用?!我们不是你的个人编译器。如果您当前没有访问权限,请尝试。另外,main()函数应该返回一个int。请不要在代码中添加行号-这会防止代码被轻松复制和编译。这有保证吗?我认为,如果在OuterOne中既没有声明a=运算符也没有声明copy构造函数,那么它就可以执行按位复制。这是为了回答下面的问题。@Xeo:仅仅因为某些东西在一个编译器/平台上工作,并不意味着它是定义良好的行为。这是一个有效的问题。这有保证吗?我认为,如果在OuterOne中既没有声明a=运算符也没有声明copy构造函数,那么它就可以执行按位复制。i、 已定义e实现。@eyesathousand:如果OuterOne是POD类型,它将只执行按位复制。由于InnerOne有一个重载的赋值运算符,它不是POD,因此OuterOne也不是POD,因为它包含一个非POD成员。@eyesathousand:如果不能保证这一点,您将被迫对任何包含本身实现了
运算符=
的对象的类型实现
运算符=
。即
struct test{std::string name;};测试a={“Hi”},b={“there”};a=b是不正确的。那么,C++并不像我在那种情况下所想的那么危险。我总是在C++中用代码防御,我总是创建复制构造函数和操作符=,尽管现在看起来我不需要。
const InnerOne x(10);
InnerOne y(10);

y = x; //compilation error - if you use your code