【发布时间】:2012-03-04 10:18:39
【问题描述】:
我正在为矩阵算术编写一个类,我正在实现的一个功能是您可以“切片”一个矩阵并获取另一个矩阵,但这样做是为了让返回的矩阵引用父级的内存。如果您想要获取矩阵的子部分或将向量添加到列或类似的事情,这非常有用。
但是,我想实现它,这样如果返回的矩阵被分配或复制,别名就会被破坏并复制内存,这样你就不能轻易地永远传递一个别名矩阵。
在玩这个时,我有这样的事情:
matrix B = A.slice(1,1);
A.slice(1,1) 返回 A 的子矩阵(偏移 1 行和 1 列)。我实现了 = 运算符来打破别名,但令我懊恼的是,即使打开 -O0 也不会在执行此操作时调用它。同样:
matrix B(A.slice(1,1));
不调用复制构造函数(也是为了中断别名而编写的)。唯一有效的是:
matrix B; B = A.slice(1,1);
我的问题是,很明显,因为我在前两个示例中直接从 A 初始化 B,所以它采取了某种捷径,而我在最后一个示例中首先显式创建 B,然后 然后 分配A.slice(1,1) 到它。
有人可以告诉我在调用复制构造函数和赋值运算符时的规则吗?
【问题讨论】:
-
您是否尝试过使用调试器单步执行代码?如果是这样,前两个示例的名称是什么?在这两种情况下,我都希望复制构造函数......
-
另外,您是否返回了对
Matrix的 const 引用?如果没有,我会推荐它。 -
@BenHocking:我不建议返回对临时对象的引用。
-
我尝试单步执行代码,我的 Matrix::slice 方法使用私有构造函数直接构建并返回别名矩阵,这是我看到的唯一调用的构造函数。没有复制构造函数或赋值运算符。
标签: c++