C++ 运算符重载C++;对于操作员+;和操作员=
对于运算符重载,我整天都在挠头,运算符+函数正确地计算数据,但我需要将temp class的数据传递给operator=以将其分配给类的一个单独实例,并且返回的temp不起作用(我想数据在退出时会被销毁?) 整个想法是从main调用x=y+z,将y和z的两个向量的数据相加,并将其赋值到x,我得到了y+z的正确计算结果,但将它传递到x,我碰到了一堵砖墙,怎么了?或者有人知道吗? 这是我班上的一段代码C++ 运算符重载C++;对于操作员+;和操作员=,c++,vector,operators,overloading,C++,Vector,Operators,Overloading,对于运算符重载,我整天都在挠头,运算符+函数正确地计算数据,但我需要将temp class的数据传递给operator=以将其分配给类的一个单独实例,并且返回的temp不起作用(我想数据在退出时会被销毁?) 整个想法是从main调用x=y+z,将y和z的两个向量的数据相加,并将其赋值到x,我得到了y+z的正确计算结果,但将它传递到x,我碰到了一堵砖墙,怎么了?或者有人知道吗? 这是我班上的一段代码 VecXd& operator=(const VecXd& rhs) {
VecXd& operator=(const VecXd& rhs)
{
VecXd<V> temp;
temp.dimension = rhs.dimension;
cout << "operator= check dimension is..." << temp.dimension << endl;
for(int i = 0; i < rhs.dimension; i++) //Passing data to x?
{
cout << "test" << endl;
temp.vecArr[i] = rhs.vecArr[i];
cout << temp.vecArr[i] << " our new value" << endl;
}
}
friend VecXd& operator+(VecXd& lhs, VecXd& rhs){
VecXd<V> temp;
cout << lhs.dimension << "-lhs d-" << rhs.dimension << "-rhs d-" << endl; //works
if(lhs.dimension == rhs.dimension) //dimension level check
{
temp.vecArr = new V[lhs.dimension];
for(int i = 0; i < lhs.dimension; i++)
{
temp.vecArr[i] = lhs.vecArr[i] + rhs.vecArr[i];
cout << temp.vecArr[i] << " our new value" << endl;
}
//return *temp.vecArr;
return temp; //***? how to pass data?
}
else{
cout << "Dimensions do not match!!! Error!" << endl;
}
}
VecXd&operator=(常量VecXd&rhs)
{
VecXd温度;
温度尺寸=右侧尺寸;
cout这应该有你所需要的一切,并对所涉及的逻辑有一个相对清晰的解释。无论如何,你都不需要遵循这里列出的规则和指导方针,但它们在一般情况下很有效
在算术运算符的特定情况下,该运算通常是根据+=运算符定义的,正如chris在您的原始帖子上的评论所述。这意味着您通常会传入右参数和左参数,复制lhs,并使用lhs_copy+=rhs查找结果;使用thi更容易避免代码重复记住,您只需在+=中创建一次加法逻辑,然后在++中调用它
您返回的结果不能是引用-函数中创建的任何内容都不会持久,但lhs或rhs参数都不应更改。相反,您只需返回作为实例递增的重复lhs-在您的情况下,函数签名为:
const VecXd operator+(const VecXd& lhs, const VecXd& rhs).
您的输入可以而且应该是常量,因为函数中的任何一项都不会更改,加州理工学院网页建议返回类型为常量实例,以禁止某些奇怪的操作,这在许多情况下也是一种很好的做法。这应该包含您需要的所有内容,并对所涉及的逻辑进行相对清晰的解释。这不是通过任何方式,你都必须遵守这里列出的规则和指导方针,但它们在一般情况下都很有效
在算术运算符的特定情况下,该运算通常是根据+=运算符定义的,正如chris在您的原始帖子上的评论所述。这意味着您通常会传入右参数和左参数,复制lhs,并使用lhs_copy+=rhs查找结果;使用thi更容易避免代码重复记住,您只需在+=中创建一次加法逻辑,然后在++中调用它
您返回的结果不能是引用-函数中创建的任何内容都不会持久,但lhs或rhs参数都不应更改。相反,您只需返回作为实例递增的重复lhs-在您的情况下,函数签名为:
const VecXd operator+(const VecXd& lhs, const VecXd& rhs).
您的输入可以而且应该是常量,因为函数中的任何一项都不会更改,加州理工学院页面建议返回类型为常量实例,以禁止某些奇数操作,这在许多情况下也是一种很好的做法。您的赋值运算符是假的:赋值应该执行的操作是使对象成为常量通过指向此
的对象与右侧的对象相同。赋值运算符创建一个临时对象并设置此对象。但是,退出赋值运算符时它会消失。此外,您声明赋值运算符返回一个引用,该引用通常返回对*此
的引用,但这里没有退路
声明
除非我有很好的理由去做不同的事情,否则我会用复制构造函数、析构函数和一个swap()
函数来实现赋值运算符:
VecXd& VecXd::operator=(VecXd rhs)
{
this->swap(rhs);
return *this;
}
调用复制构造函数来创建要运行的参数,很好地复制对象。然后,新创建的副本与分配给它的对象的内容进行交换,并且在返回*此后,为rhs
创建的临时对象的析构函数将释放原始内容。所需的一切红色是一个相对的函数swap()
:
swap()
函数假定这两个成员当然可以交换。因为我还没有看到您对VecXd
的声明,所以我无法判断这是否可行,但通常应该可以
我还没有真正看过你的加法操作符。你的赋值操作符是假的:赋值应该做的操作是使这个
指向的对象与右边的对象相同。赋值操作符创建一个临时对象并设置这个对象。但是,当正在使用赋值运算符。此外,您声明赋值运算符返回一个引用,该引用通常返回对*this
的引用,但没有返回
声明
除非我有很好的理由去做不同的事情,否则我会用复制构造函数、析构函数和一个swap()
函数来实现赋值运算符:
VecXd& VecXd::operator=(VecXd rhs)
{
this->swap(rhs);
return *this;
}
调用复制构造函数来创建要运行的参数,很好地复制对象。然后,新创建的副本与分配给它的对象的内容进行交换,并且在返回*此后,为rhs
创建的临时对象的析构函数将释放原始内容。所需的一切红色是一个相对的函数swap()
:
swap()
函数假定这两个成员当然可以交换。因为我还没有看到您对VecXd
的声明,所以我无法判断这是否可行,但通常应该可以
我还没有真正研究过你的加法运算符。运算符+
应该是用运算符+=
来表示的。我有+=用于单独的操作,按照你说的做,编译器就可以了