这本书错了吗?

use*_*261 2 c++

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 ++,它会有所不同吗?

fre*_*low 5

我很困惑的另一件事是为什么它是++ i?前算子,为什么不是i ++?如果我将它改成i ++,它会有所不同吗?

因为++i更自然,更容易理解:增加i然后产生变量i.i++另一方面,意味着复制i某处的当前值(让我们称之为temp),递增i,然后temp作为结果产生值.

此外,对于用户定义的类型,i++可能比慢++i.

需要注意的是++i作为循环增量并不能意味着增量进入循环体或东西之前发生.(这似乎是初学者中常见的误解.)如果你没有使用++ii++作为更大表达式的一部分,语义完全相同,因为前缀和后缀增量仅在结果上不同(递增变量与旧值),不是他们的副作用(递增变量).

  • 值得注意的是,"i ++"和"++ i"之间任何理论性能差异很重要的_real-world_个案的数量是非常小的. (4认同)
  • @Greg:但是`++ i`永远不会比`i ++'慢.前缀*更容易理解*和*可能比后缀更快*.为什么我想要更喜欢后缀形式?`i ++;`优于`++ i;`的优点是什么? (2认同)