DynamicMemoryAndCopyConstructor.cpp,RUN
//拷贝构造函数的用法 #include <iostream> class Vector { private: double *arr; int len; public: Vector()//不带参数的普通构造函数 { arr = nullptr; //指针初始化。要不nullptr,要不new的结果,要不某变量地址&something len = 0; } ~Vector()//析构函数,清理 { if (arr) delete[] arr; //配上初始化arr = nullptr; 加上if (arr) delete[] arr; 指针的标准初始化的清除用法 } Vector(const Vector& v)//拷贝构造函数:const & {//类成员有动态内存申请,必须写正确拷贝构造函数,内存需要深拷贝 //1申请内存;2复制数据 len = v.len; arr = new double[len]; for (auto i = 0; i < len; i++) { arr[i] = v.arr[i]; } //memcpy(arr, v.arr, sizeof(double) * len); //或者 } Vector(const double *arrs, int n) {//类成员有动态内存申请,内存需要深拷贝 //1申请内存;2复制数据 len = n; arr = new double[len]; for (auto i = 0; i < len; i++) { arr[i] = arrs[i]; } } Vector & operator= (const Vector & v)//赋值函数 {//类成员有动态内存申请,必须写正确赋值操作运算,内存需要深拷贝 if (this == &v) return *this;//自己赋值给自己,直接返回;否则可能内存首先释放,无法完成 //0.清除现有内存 1申请内存;2复制数据 if (arr)delete[] arr; len = v.len; arr = new double[len]; for (auto i = 0; i < len; i++) { arr[i] = v.arr[i]; } return *this; } double operator[](int i)const //const 函数,不修改数据成员 { return arr[i]; } double & operator[](int i) //返回引用,可以类似obj[i] = 1.0; 给obj对象赋值 { return arr[i]; } friend std::ostream& operator<<(std::ostream& os, const Vector& v) { for (auto i = 0; i < v.len; i++) os << v.arr[i] << "\t"; return os; } }; void FunByValue(Vector v) {//v通过实参拷贝构造函数得到的副本 std::cout << v << std::endl; } void FunByRef(const Vector & v) {//v,引用,就是实参本身。实参的别名方式存在 std::cout << v << std::endl; } Vector CreateVector() {//返回值以拷贝构造函数的形式返回 //但是,Microsoft C++(返回值出现拷贝构造函数调用)和GCC(没有)表现不一致 double arr[] = { 1.1, 2.2 }; Vector v(arr, 2); return v; } int main() { double arr[] = { 1.1, 2.2 }; Vector v1, v2(arr, 2);//构造函数 Vector v3(v2);//拷贝构造函数 std::cout << v3 << std::endl; Vector v4 = v2;//拷贝构造函数,不是赋值,v4创建并且初值 v4 = v2;// 现在是赋值运算符了,因为v4已经存在 std::cout << v4 << std::endl; //函数(按值)参数传递,出现拷贝构造函数调用 FunByValue(v4); //引用方式调用,什么都不发生 FunByRef(v4); std::cout << "CreateVector\n"; //函数值返回,Microsoft C++(返回值出现拷贝构造函数调用)和GCC(没有)表现不一致 Vector v5 = CreateVector(); std::cout << v5 << std::endl; return 0; }