运算符 + 和运算符 = 的运算符重载C++
Operator overloading C++ for operator+ and operator=
我整天都在挠头,刚开始接触运算符重载,我的运算符+函数正确计算数据,但是我需要将temp类的数据传递给operator=以将其分配给我的类的单独实例并且返回temp不起作用(我想数据在退出时被销毁了?整个想法是从主 x = y + z 调用以将 y 和 z 中的两个向量的数据相加并将其分配给 x,我正确计算了 y + z,但将其传递给 x 我撞到了砖墙有什么问题?还是有人知道?这是我的班级代码
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;
}
}
知道吗?不要苛刻...哈哈..... :L
你的赋值运算符是假的:赋值应该做的操作是使this
指向的对象与右侧的对象相同。赋值运算符会创建一个临时对象并设置此对象。但是,当退出分配运算符时,它会消失。此外,您声明了赋值运算符以返回一个引用,该引用通常返回对*this
的引用,但没有返回陈述。
除非我有很好的理由以不同的方式执行此操作,否则我会根据复制构造函数、析构函数和swap()
函数来实现我的赋值运算符:
VecXd& VecXd::operator=(VecXd rhs)
{
this->swap(rhs);
return *this;
}
调用复制构造函数以创建要运行的参数,从而很好地复制对象。然后,新创建的副本与要分配给的对象的内容进行交换,并且在返回*this
原始内容后,由为rhs
创建的临时对象的析构函数释放。所需要的只是一个相对函数swap()
:
void VecXd::swap(VecXd& other)
{
std::swap(this->dimension, other.dimension);
std::swap(this->vecArr, other.vecArr);
}
当然,swap()
函数假定两个成员可以交换。由于我没有看到您的VecXd
声明,因此我无法判断这是否有效,但通常应该有效。
我还没有真正看过你的加法运算符。
这个加州理工学院C++运算符重载页面应该有你需要的一切,并对所涉及的逻辑有一个相对清晰的解释。绝不要求您遵循那里列出的规则和准则,但它们在一般情况下效果很好。
在算术运算符的特定情况下,运算通常根据 += 运算符定义,如 chris对原始帖子的评论中所述。这意味着您通常会传入左右参数,复制 lhs,并使用 lhs_copy += rhs 查找结果;考虑到这一点,更容易避免代码重复;您只需在 += 中创建一次加法逻辑,然后在 + 中调用它。
您返回的结果不能是引用 - 函数中创建的任何内容都不会保留,但不应更改 lhs 或 rhs 参数。相反,您只需返回作为实例递增的重复 lhs - 在您的情况下,函数签名为:
const VecXd operator+(const VecXd& lhs, const VecXd& rhs).
您的输入可以而且应该是 const,因为函数中不会更改任何项目,加州理工学院页面建议返回类型是 const 实例以禁止某些奇数操作,这在许多情况下也是很好的做法。
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板