鱼C论坛

 找回密码
 立即注册
查看: 1051|回复: 7

[已解决]小白求助 没有写拷贝构造函数 却执行对象的初始化了

[复制链接]
发表于 2020-5-22 17:40:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第一个代码是测试类 TestVector类
  1. #include "iostream"
  2. #include "MyVector.cpp"
  3. using std::endl;
  4. using std::cout;
  5. using std::cin;


  6. void main()
  7. {
  8.         MyVector<int> mv1(10);
  9.         for (int i = 0; i < mv1.getLen(); i++)
  10.         {
  11.                 mv1[i] = i + 1;
  12.                 cout << mv1[i] << " ";
  13.         }
  14.         cout << endl;

  15.         MyVector<int> mv2 = mv1;

  16.         for (int i = 0; i < mv2.getLen(); i++)
  17.         {
  18.                 cout << mv2[i] << " ";
  19.         }
  20.         cout << endl;
  21.         /*cout << mv2;*/
  22.         system("pause");
  23. }
复制代码


第二个代码是MyVector.h
  1. #pragma once

  2. template <typename T>
  3. class MyVector
  4. {
  5. private:
  6.         int m_len;
  7.         T* m_space;
  8. public:
  9.         int getLen();
  10. public:
  11.         T& operator[](int index);
  12. public:
  13.         MyVector(int len);
  14.         /*MyVector(const MyVector& mv);*/
  15.         ~MyVector();
  16. };
复制代码


第三个代码是MyVector.cpp
  1. #include "MyVector.h"

  2. template <typename T>
  3. int MyVector<T>::getLen()
  4. {
  5.         return this->m_len;
  6. }

  7. template <typename T>
  8. MyVector<T>::MyVector<T>(int len)
  9. {
  10.         this->m_len = len;
  11.         this->m_space = new T[m_len];
  12. }

  13. template <typename T>
  14. MyVector<T>::~MyVector<T>()
  15. {
  16.         if (this->m_space != nullptr)
  17.         {
  18.                 delete[] this->m_space;
  19.                 this->m_space = nullptr;
  20.                 this->m_len = 0;
  21.         }
  22. }

  23. template <typename T>
  24. T& MyVector<T>::operator[](int index)
  25. {
  26.         return this->m_space[index];
  27. }

复制代码


疑问 :为什么不写拷贝构造函数 能完成测试类中 MyVector<int> mv2 = mv1;  打印的结果跟打印mv1一样 执行数据复制了 可是我没写拷贝构造啊
最佳答案
2020-5-22 18:17:18
C++中每个类一定有一个拷贝构造函数。它可以用来创建一个对象,并用另一个对象的数据初始百化新建对象。你度的代码中如果没有显示定义拷贝构造函数(用来实现你自己的一些特殊需求),则C++将为每个类隐式地提供一个缺省的拷贝构回造函数。缺省的拷贝构造函数简单地将参数对象的每个数据域复制给新建对象中相应的副本(注意如果数据域是一个指向其他对象的指针答,那么仅简单地复制指针保存的地址值,而不是复制对象的内容)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-22 17:56:54 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-22 18:17:18 | 显示全部楼层    本楼为最佳答案   
C++中每个类一定有一个拷贝构造函数。它可以用来创建一个对象,并用另一个对象的数据初始百化新建对象。你度的代码中如果没有显示定义拷贝构造函数(用来实现你自己的一些特殊需求),则C++将为每个类隐式地提供一个缺省的拷贝构回造函数。缺省的拷贝构造函数简单地将参数对象的每个数据域复制给新建对象中相应的副本(注意如果数据域是一个指向其他对象的指针答,那么仅简单地复制指针保存的地址值,而不是复制对象的内容)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 19:23:01 | 显示全部楼层
栗粒粒 发表于 2020-5-22 18:17
C++中每个类一定有一个拷贝构造函数。它可以用来创建一个对象,并用另一个对象的数据初始百化新建对象。你 ...

搞懂了 谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 15:07:06 From FishC Mobile | 显示全部楼层
可以理解为这样吗:
如果类数据成员中有指针类型的变量,那么,就不能使用隐式的复制函数。如果使用,那么类对象之间的复制,将会产生问题:原有对象中指针变量的值,是一个地址,这个地址,会简单地赋给另一个类对象的同一指针变量。此时,当原有类对象销毁时,另一个类对象还存在并要使用时,另一个类对象的指针成员就会变为野指针,访问时会导致程序崩溃。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-23 16:26:47 | 显示全部楼层
howzyao 发表于 2020-5-23 15:07
可以理解为这样吗:
如果类数据成员中有指针类型的变量,那么,就不能使用隐式的复制函数。如果使用,那么 ...

是这样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 16:29:23 | 显示全部楼层
howzyao 发表于 2020-5-23 15:07
可以理解为这样吗:
如果类数据成员中有指针类型的变量,那么,就不能使用隐式的复制函数。如果使用,那么 ...

delete 释放指针所指向的空间
假如有个对象 t2= t1
浅拷贝时  后面t2指针所指向的空间释放 t1再释放这个空间就会出错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-27 22:00:59 From FishC Mobile | 显示全部楼层
深复制的函数,又哪些呢?
如memcpy,还有什么的?能否统一贴出来归纳?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 10:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表