【More Effective C++】条款1:指针和引用区别

区别:

  • 引用定义必须初始化,不能为null,意味着不需要测试有效性;且不能改变指向;
  • 实现一个操作符重载,只能用引用实现

结论:除了上述情况,应该优先使用指针实现

#ifndef __ITEM_H__
#define __ITEM_H__
#include 
#include  // 用于抛出异常

void printDouble(const double& rd) {
    std::cout << rd << std::endl;
}
void printDouble(const double* pd) {
    if (pd) std::cout << *pd << std::endl;
}
template
class MyVector {
public:
    MyVector() : _size(0), _capacity(0), data(nullptr) {
        resize();
    }
    explicit MyVector(size_t size) : _size(size) {
        _capacity = 1;
        while (_capacity < _size) _capacity *= 2;
        data = new T[_capacity];
        for (size_t i = 0; i < size; i++) {
            data[i] = T(); // 如果T是基本类型,这将初始化为0;如果T是类类型,则调用默认构造函数
        }
    }
    T& operator[](size_t index) {
        if (index >= _size) std::out_of_range("Index out of range");
        return data[index];
    }
    ~MyVector() {
        delete [] data;
    }

private:
    size_t _size;
    size_t _capacity;
    T* data;
    void resize();
};

template 
void MyVector::resize() {
    _capacity = (_capacity == 0) ? 1 : _capacity*2;
    T* newData = new T[_capacity];
    for (size_t i = 0; i < _size; i++) {
        newData[i] = data[i];
    }
    delete [] data;
    data = newData;
}

#endif

int main() {
    MyVector v(10); // 0 0 0 0 0 0 0 0 0 0 
    for (size_t i = 0; i < 10; i++) {
        std::cout << v[i] << " ";
    }
    std::cout << "\n";
    
    v[5] = 10; // 0 0 0 0 0 10 0 0 0 0
    // *v[5] = 10; // 如果返回的时指针,必须改写成这样
    for (size_t i = 0; i < 10; i++) {
        std::cout << v[i] << " ";
    }
    std::cout << "\n";
    return 0;
}

你可能感兴趣的:(More,Effective,C++,c++)