z__y 2022-11-09 12:58 采纳率: 88.9%
浏览 22
已结题

有关深拷贝和浅拷贝的问题,对于非指针类型而言,有影响吗

有关深拷贝和浅拷贝的问题,对于非指针类型而言,有影响吗

#include<iostream>
using namespace std;
#include<string>
class student
{
public:
    student()         //主动写的默认构造函数
    {
        m_name = "阿伟";
        m_age = 18;
    }
    student(string name, int age)//含参构造函数
    {
        m_name = name;
        m_age = age;
    }
    void change()
    {
        m_name = "asdfasdf";
        m_age = 345;
    }
    void display()
    {
        cout << "name:" << m_name << endl;
        cout << "age:" << m_age << endl;
    }
    //student(const student& stu);    //复制构造函数
private:
    string m_name;
    int m_age;


};

/*student::student(const student& stu)
{
    m_name = stu.m_name;
    m_age = stu.m_age;
    cout << "这里是复制构造函数" << endl;
}*/

int main()
{
    student a("阿斌", 23);
    student b = a;
    //cout << "这是赋值之前的b" << endl;
    //b.display();
    student c;
    c = a;
    cout << "使用了自带的赋值运算符"<<endl;
        cout << "c的值为"<<endl;
        c.display();
    //这里用的不是复制构造函数,而是C++自动重载好的赋值运算符
    cout << "初始化后的b" << endl;
    b.display();
    b.change();
    cout << "b的值改变之后"<<endl;
        b.display();
    cout << "此时a的值" << endl;
    a.display();
    c.change();
    cout << "c的值改变之后" << endl;
    c.display();
    cout << "此时a的值" << endl;
    a.display();
    return 0;



}

运行的结果是改变b和c的值,a的值都没有改变

那么,是C++自带的重载赋值运算符和复制构造函数都是浅拷贝,还是因为,深浅拷贝只对于指针而言有区别?

  • 写回答

3条回答 默认 最新

  • CSDN专家-link 2022-11-09 13:07
    关注

    确实和指针类型有较大关系,只是复制指针就是浅拷贝。浅拷贝后两个对象还有共享信息。深拷贝是所有内容完全复制,使两个对象毫无关系。
    当类对象中的成员变量均支持=操作符时,两个对象就可以直接赋值。代码中 c = a;实际是将a的成员赋值给b的成员,string类型的=操作时深拷贝。如果类中有指针变量,那么默认只是进行指针的赋值,使得两个指针指向同一块内存。除非你给这个类重载=操作符,然后为当前类开辟新的内存空间,实现指针指向空间数据的复制,这样用=操作符就变为深拷贝了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月17日
  • 已采纳回答 11月9日
  • 创建了问题 11月9日

悬赏问题

  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 MATLAB中streamslice问题
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序