1. main() {
    2. CArray a;
    3. for(int i = 0; i < 5; ++i)
    4. a.push_pack(i); // 动态分配内存
    5. CArray a2, a3;
    6. a2 = a; // 重载 "="
    7. for(int i = 0; i < a.length(); ++i)
    8. cout << a2[i] << " ";
    9. a2 = a3; // a2是空的
    10. for(int i = 0; i < a2.length(); ++i) // a2.length() == 0
    11. cout << a2[i] << " "; // 重载 "[]"
    12. cout << endl;
    13. a[3] = 100;
    14. CArray a4(a); // 复制构造函数
    15. for(int i = 0; i < a4.length(); ++i)
    16. cout << a4[i] << " ";
    17. }
    1. class CArray {
    2. int size; // 元素个数
    3. int *ptr; // 动态分配指针
    4. public:
    5. CArray(int s = 0); // s代表元素个数
    6. CArray(CArray & a);
    7. ~CArray();
    8. void push_back(int v);
    9. CArray & operator = (const CArray & a);
    10. int length() { return size; }
    11. int & CArray::operator[](int i) { return ptr[i]; } // 注意返回值类型
    12. };
    13. CArray::CArray(int s):size(s) {
    14. if(s == 0)
    15. ptr = NULL;
    16. else
    17. ptr = new int[s];
    18. }
    19. CArray::CArray(CArray & a) {
    20. if(!a.ptr) {
    21. ptr = NULL;
    22. size = 0;
    23. return;
    24. }
    25. ptr = new int[a.size];
    26. memcpy(ptr, a.ptr, sizeof(int) * a.size);
    27. size = a.size;
    28. }
    29. CArray::~CArray() {
    30. if(ptr)
    31. delete ptr;
    32. }
    33. CArray & CArray::operator=(const CArray & a) {
    34. if (ptr == a.ptr) // 防止a=a这样的赋值
    35. return * this;
    36. if(a.ptr = NULL) {
    37. if(ptr)
    38. delete []ptr;
    39. ptr = NULL;
    40. size = 0;
    41. }
    42. if(size < a.size) { // 如果原来空间不够大,重新申请
    43. if(ptr)
    44. delete []ptr;
    45. ptr = new int[a.size];
    46. }
    47. memcpy(ptr, a.ptr, sizeof(int)*a.size);
    48. size = a.size;
    49. return *this;
    50. }
    51. void CArray::push_back(int v) {
    52. if(ptr) {
    53. int * tmpPtr = new int[size+1];
    54. memcpy(tmpPtr, ptr, sizeof(int)*size);
    55. delete ptr;
    56. ptr = tmpPtr;
    57. } else
    58. ptr = new int[1];
    59. ptr[size++] = v;
    60. }
    • 实际上,push_back()可以一次性多申请一些空间,提高效率