template <typename T>
class Table {
public:
Table();
Table(int m, int n);
Table(int m, int n, const T& value);
Table(const Table<T>& rhs);
~Table();
Table<T>& operator=(const Table& rhs);
T& operator()(int i, int j);
int numRows()const;
int numCols()const;
void resize(int m, int n);
void resize(int m, int n, const T& value);
private:
// Make private because this method should only be used
// internally by the class.
void destroy();
private:
int mNumRows;
int mNumCols;
T** mDataMatrix;
};
template <typename T>
void Table<T>::destroy() {
// Does the matrix exist?
if (mDataMatrix) {
for (int i = 0; i < _m; ++i) {
// Does the ith row exist?
if (mDataMatrix[i]) {
// Yes, delete it.
delete[]mDataMatrix[i];
mDataMatrix[i] = 0;
}
}
// Delete the row-array.
delete[] mDataMatrix;
mDataMatrix = 0;
}
mNumRows = 0;
mNumCols = 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我从一本书中获得的代码示例.它演示了如何破坏或释放2x2矩阵,其中mDataMatrix是指向指针数组的指针.
我不明白的是这一部分:
for(int i = 0; i < _m; ++i) {
// Does the ith row exist?
if (mDataMatrix[i]) {
//.….
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么这本书使用_m作为最大行数-ptr.它甚至不是课堂上的变量定义; max row的变量是mNumRows.也许它是一些编译器预定义的变量?我很困惑的另一件事是为什么它是++ i?前算子,为什么不是i ++?如果我将它改成i ++,它会有所不同吗?
我很困惑的另一件事是为什么它是++ i?前算子,为什么不是i ++?如果我将它改成i ++,它会有所不同吗?
因为++i更自然,更容易理解:增加i然后产生变量i.i++另一方面,意味着复制i某处的当前值(让我们称之为temp),递增i,然后temp作为结果产生值.
此外,对于用户定义的类型,i++可能比慢++i.
需要注意的是++i作为循环增量并不能意味着增量进入循环体或东西之前发生.(这似乎是初学者中常见的误解.)如果你没有使用++i或i++作为更大表达式的一部分,语义完全相同,因为前缀和后缀增量仅在结果上不同(递增变量与旧值),不是他们的副作用(递增变量).