我有一个类,其中包含一些boost :: numeric :: ublas :: matrix。我想重载类的运算符(+ - * / =),以便我可以使用一个语句对矩阵集进行操作。
然而,这似乎要求我的类的临时实例在不修改原始类的情况下携带值。这对我来说很有意义,但是,当我在函数中创建一个新实例并返回它时,我得到:
警告:引用本地变量'temp'返回
我对c ++很陌生,运算符重载的例子似乎都返回了新的临时对象。我还想避免实例化新矩阵的开销,这导致我循环遍历所有元素。我该怎么办呢?表现是一个问题。
答案 0 :(得分:3)
如果您已经使用了强化功能,我强烈建议您使用boost::operators和您的示例。
您将获得以下好处:
答案 1 :(得分:1)
传统的运算符重载方式如下。 (我认为)
您的就地操作员被定义为成员,例如:
foo& operator+=(const foo& rhs);
foo& operator*=(const foo& rhs);
// etc.
只需在*this
上执行所需操作:
foo& operator+=(const foo& rhs)
{
// add elements together
return *this;
}
然后创建自由函数,并在参数中完成复制:
const foo operator+(foo lhs, const foo& rhs)
{
return lhs += rhs;
}
返回值为const
,因为它很奇怪:
foo a, b, c;
(a + b) = c;
以同样的方式做起来很奇怪:
int a, b, c;
(a + b) = c;
虽然你会对此有不同的看法。这是您重用代码的方式,并自动为您完成复制。非常简洁易读。
就像Neil和我上面所说的那样,如果您正在创建新数据,那么在某些时候数据需要有一个新的位置。在可以避免这种情况时使用变异运算符,但有些东西根本无法转义。
它甚至可能不是问题。如果是,请尝试优化您拥有的内存分配;这些可能是最慢的部分。我不确定,但我认为大多数boost类允许你指定一个分配器。增强内存池库在这里可能很有用。