琴长不过时光 发表于 2020-5-22 17:40:49

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

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


void main()
{
        MyVector<int> mv1(10);
        for (int i = 0; i < mv1.getLen(); i++)
        {
                mv1 = i + 1;
                cout << mv1 << " ";
        }
        cout << endl;

        MyVector<int> mv2 = mv1;

        for (int i = 0; i < mv2.getLen(); i++)
        {
                cout << mv2 << " ";
        }
        cout << endl;
        /*cout << mv2;*/
        system("pause");
}

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

template <typename T>
class MyVector
{
private:
        int m_len;
        T* m_space;
public:
        int getLen();
public:
        T& operator[](int index);
public:
        MyVector(int len);
        /*MyVector(const MyVector& mv);*/
        ~MyVector();
};

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

template <typename T>
int MyVector<T>::getLen()
{
        return this->m_len;
}

template <typename T>
MyVector<T>::MyVector<T>(int len)
{
        this->m_len = len;
        this->m_space = new T;
}

template <typename T>
MyVector<T>::~MyVector<T>()
{
        if (this->m_space != nullptr)
        {
                delete[] this->m_space;
                this->m_space = nullptr;
                this->m_len = 0;
        }
}

template <typename T>
T& MyVector<T>::operator[](int index)
{
        return this->m_space;
}



疑问 :为什么不写拷贝构造函数 能完成测试类中 MyVector<int> mv2 = mv1;打印的结果跟打印mv1一样 执行数据复制了 可是我没写拷贝构造啊

琴长不过时光 发表于 2020-5-22 17:56:54

栗粒粒 发表于 2020-5-22 18:17:18

C++中每个类一定有一个拷贝构造函数。它可以用来创建一个对象,并用另一个对象的数据初始百化新建对象。你度的代码中如果没有显示定义拷贝构造函数(用来实现你自己的一些特殊需求),则C++将为每个类隐式地提供一个缺省的拷贝构回造函数。缺省的拷贝构造函数简单地将参数对象的每个数据域复制给新建对象中相应的副本(注意如果数据域是一个指向其他对象的指针答,那么仅简单地复制指针保存的地址值,而不是复制对象的内容)

琴长不过时光 发表于 2020-5-22 19:23:01

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

搞懂了 谢谢大佬

howzyao 发表于 2020-5-23 15:07:06

可以理解为这样吗:
如果类数据成员中有指针类型的变量,那么,就不能使用隐式的复制函数。如果使用,那么类对象之间的复制,将会产生问题:原有对象中指针变量的值,是一个地址,这个地址,会简单地赋给另一个类对象的同一指针变量。此时,当原有类对象销毁时,另一个类对象还存在并要使用时,另一个类对象的指针成员就会变为野指针,访问时会导致程序崩溃。

琴长不过时光 发表于 2020-5-23 16:26:47

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

是这样的

琴长不过时光 发表于 2020-5-24 16:29:23

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

delete 释放指针所指向的空间
假如有个对象 t2= t1
浅拷贝时后面t2指针所指向的空间释放 t1再释放这个空间就会出错

howzyao 发表于 2020-5-27 22:00:59

深复制的函数,又哪些呢?
如memcpy,还有什么的?能否统一贴出来归纳?
页: [1]
查看完整版本: 小白求助 没有写拷贝构造函数 却执行对象的初始化了