有人能为我澄清C++中的操作符重载吗?

有人能为我澄清C++中的操作符重载吗?,c++,C++,是否可以在运算符重载函数中创建新对象 { // Create an object to return Height h3; 创建第一个对象是否会自动将其与height类的第一个成员构造函数关联 // Perform addition of feet and inches h3.feet = feet + d2.feet; h3.inch = inch + d2.inch; // Return the resulting object return h3; } }; in

是否可以在运算符重载函数中创建新对象

{
// Create an object to return 
Height h3;   
创建第一个对象是否会自动将其与height类的第一个成员构造函数关联

// Perform addition of feet and inches 
h3.feet = feet + d2.feet; 
h3.inch = inch + d2.inch; 
// Return the resulting object 
return h3; 
} 
};  
int main() 
{ 
Height h1(3, 7);   
Height h2(6, 1); 
创建第二个对象是否会自动将其与height类的第二个成员构造函数关联

// Perform addition of feet and inches 
h3.feet = feet + d2.feet; 
h3.inch = inch + d2.inch; 
// Return the resulting object 
return h3; 
} 
};  
int main() 
{ 
Height h1(3, 7);   
Height h2(6, 1); 
运算符重载函数的参数d2只是+表达式中的任何右侧

h3是一个全新的高度对象。是的,您可以在重载运算符中创建新对象。您可以在重载运算符中使用所需的任何有效代码

高度h13,7使用将两个int作为参数的构造函数,而省略参数将使用第一个无参数构造函数,就像运算符+中的h3一样

高度H26,1使用与H13相同的构造函数,7做:一个以两个int作为参数。

< P>运算符+已经在C++中有意义。但问题是,默认情况下,当它的操作数是您刚刚声明的某种类型时,它不知道该做什么! 运算符重载是该问题的解决方案。当运算符的操作数是您在示例中声明的类型时,它可以帮助您定义运算符的行为

运算符重载函数的参数是什么?h3对象是否作为参数发送

不!h3不是操作数! 在下面的代码片段中:

Height h3;   
//Use overloaded operator 
h3 = h1 + h2; 
cout << "Sum of  Feet & Inches: " << h3.feet << "'" << h3.inch << endl; 
return 0; 
} 
h1和h2是运算符的操作数,它们位于运算符的两侧,因为+是二进制运算符;它需要两个操作数 h2是参数。h1是调用其运算符函数的对象

是否可以在运算符重载函数中创建新对象

对!!这是可能的,事实上,这是发生在大多数情况下! 您的代码不包括重载函数的实现。但我猜是这样的:

Height h3 = h1 + h2 // h1 and h2 are instances of the Height class
您询问的另一件事是关于如何指定应称为实例化的构造函数。构造函数的签名决定了!
假设您调用传递两个int变量作为参数的构造函数,那么接受两个int类型参数的构造函数称为

重载运算符与普通成员函数没有任何不同

事实上,写作

Height operator+(Height& d2)
{
    Height result;
    result.inch = d2.inch + inch; // inch is a member of the first operand        
    result.feet = d2.feet + feet;
    return result
}
相当于写作

h1 + h2
第一个版本只是语法糖,第二个版本更清楚地向您展示了到底发生了什么

由于运算符与普通成员函数没有任何不同,因此您可以在函数内创建一个新对象。如前所述,这是操作员+的预期行为

创建第一个对象是否会自动将其与height类的第一个成员构造函数关联

// Perform addition of feet and inches 
h3.feet = feet + d2.feet; 
h3.inch = inch + d2.inch; 
// Return the resulting object 
return h3; 
} 
};  
int main() 
{ 
Height h1(3, 7);   
Height h2(6, 1); 
创建第二个对象是否会自动将其与height类的第二个成员构造函数关联

// Perform addition of feet and inches 
h3.feet = feet + d2.feet; 
h3.inch = inch + d2.inch; 
// Return the resulting object 
return h3; 
} 
};  
int main() 
{ 
Height h1(3, 7);   
Height h2(6, 1); 
我真的不明白你在问什么。 高度h13,7;将调用Heightint f,int i构造函数,因为参数匹配。
高度h3;出于同样的原因,将调用Height构造函数。

您应该使用常量引用作为运算符+的参数,因为您不需要修改参数。这是否回答了您的问题@WhozCraig如果你把这个问题标记为一个潜在的重复项,它现在应该已经关闭了。所以我们为操作符函数输入的参数作为参数,它本身就是类类型的所有成员。也就是说,构造器。在那之后,任何时候我们创建一个类高的对象并给它一些值,它就会作为一个参数传递给操作符函数,对吗?但是在这里,重载操作符不是应该用来添加两个对象吗?在这里,我们只有一个接受参数的对象,因此只有一个对象同时被添加到自身中。但是操作符函数接受的参数是什么?它是用于传递任何高度类(即构造函数)的高度对象吗?或者是别的什么。那么d2英寸和d2英尺是从哪里来的呢?d2是否用于表示它们属于高度构造函数,该构造函数接受参数为int f,而在i中?构造函数是一个独立于运算符重载的概念,它与发送给运算符函数的参数没有直接关系。运算符函数,接受两个操作数,都是高度类的对象。其签名显示的运算符函数只获取一个参数。但是运算符需要两个操作数。另一个操作数是其MetNodeOperator函数被调用的对象:h1。operator+h2正如其他人所提到的,您可以这样编写代码行:h1+h2在h1+h2中,调用了h1的运算符函数,并将h2作为参数传递。我仍然不明白运算符函数的参数以及d2.feet和d2.inch在这里表示什么?是d2.ft=f whi
ch等于等于0的英尺,这允许改变值f,因此f和英尺不会相互缠绕并强制为相同的值,因为它们彼此相等,但也等于0?这与inch类似吗?d2是对h2的引用,因为h2是通过引用传递给函数的。因此,d2.feet的值与h2.feet的值相同。所以它的值是6。请注意,每个实例都有自己的脚!那么h2/d2是否使用与h1相同的高度构造函数?最早的构造师。高度h2呢?它会调用与h1相同的构造函数吗?如果是的话,这不会改变将两个对象添加在一起的整个概念,因为这是运算符重载的主要目标,因为这里我们只使用一个成员构造函数来添加4个值。我还不明白运算符函数中参数的用法。是否所有高度构造函数都作为参数发送给运算符函数?那么什么是d2英尺和d2英寸呢?他们两人的d2是什么?施工人员与操作员的工作方式无关。我还是不明白你想说什么。如示例h1.operator+h2所示,h1是当前对象,h2是传递给名为d2的函数的参数。d2.脚指h2,脚指h1。与任何成员函数中的完全相同。根据我的理解,运算符函数中的参数是我们在主函数中创建的第二个对象,即h2和d2。feet是第二个对象中的feet吗?