c – 为什么要编写two()运算符

前端之家收集整理的这篇文章主要介绍了c – 为什么要编写two()运算符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么要两次?
这2行,为什么这样做?一个够吗?
inline T& operator() (int row,int col) { return this->m_data[row*NC + col]; }

const inline T& operator() (int row,int col) const { return this->m_data[row*NC + col]; }

谢谢

*
 * 2-DIMENSIONAL ARRAY
 *
 * Simulated by 1-dimension array.
 ******************************************************************************/

#ifndef __2D_ARRAY_H__
#define __2D_ARRAY_H__
#include <stdint.h>
#include <stdlib.h>

namespace alg {
    /**
     * 2D Array definition
     */
    template <typename T=char>
        class Array2D {
            private:
                uint32_t NR;        // num of rows
                uint32_t NC;        // num of columns
                T * m_data;         // the place where the array resides.

            public:
                /**
                 * construct an array of size [nrow,col]
                 */
                Array2D(uint32_t nrow,uint32_t ncol) {
                    NR = nrow;
                    NC = ncol;  
                    m_data = new T[nrow*ncol];
                }

                /**
                 * destructor
                 */ 
                ~Array2D() {
                    delete [] m_data;
                }

            private:
                Array2D(const Array2D&);    
                Array2D& operator=(const Array2D&); 

            public:

                /**
                 * return number of rows of this array
                 */
                inline const uint32_t row() const { return NR; }
                /**
                 * return number of columns of this array
                 */
                inline const uint32_t col() const { return NC; }

                /**
                 * return the value by the given (row,col);
                 */
                inline T& operator() (int row,int col) { return this->m_data[row*NC + col]; }
                const inline T& operator() (int row,int col) const { return this->m_data[row*NC + col]; }

                inline T* operator[] (int row) { return &(m_data[row * NC]); }
                inline const T* operator[] (int row) const { return &(m_data[row * NC]); }

                /**
                 * clear the array by a given value
                 */
                void clear(const T & value) {
                    for(uint32_t i=0; i<NR*NC;i++){
                        m_data[i] = value;
                    }
                }
        };
}

#endif //

解决方法

一个是常量而另一个不是.

不同之处在于,当你有一个对Array2D的const引用时,你只能调用标记为const的成员函数.在这种情况下,这意味着第二个版本,它必须返回对它所拥有的元素的const引用.

但是,如果您有非const引用,则第二个版本意味着您不能使用operator()对Array2D进行任何更改.

如果你看一下像std :: vector这样的标准库容器,你会看到它们做同样的事情.你可以从begin()获得一个迭代器,从begin()const获得一个const_iterator.

猜你在找的C&C++相关文章