C#和C++中浅拷贝的异同

#include <iostream>
using namespace std;
class Person {
public:
    int* myInt;
};

int main() {

    Person p1;
    p1.myInt = new int(10);
    Person p2 = p1; //这句代码相当于在栈上新建了一个p2对象,采用默认的拷贝构造函数,属于浅拷贝。
    cout << "p1.myInt地址:" << p1.myInt << " p1.myInt的值:" << *p1.myInt << endl;
    delete p1.myInt;
    p1.myInt = NULL;

    //此时p2.myInt不为NULL,但是p2.myInt指向的内存已经被释放了。
    //(注意指针指向的内存已经被释放不代表指针会自动置为NULL)

    cout << "p2.myInt地址:" << p2.myInt << " p2.myInt的值:" << *p2.myInt << endl;
    //delete p2.m_height; 若p2再次释放会报错,双重释放

    system("pause");
    return 0;
}
//输出
//p1.myInt地址:0000024506977A10   p1.myInt的值:10
//p2.myInt地址:0000024506977A10   p2.myInt的值: -572662307​
public class Person
{
    public object myInt;

    public static void Main()
    {
        Person p1 = new Person();
        p1.myInt = 10;
        Person p2 = p1; //与C++中不同,这句代码相当于在栈上新建了一个引用p2,p2和p1都指向堆中的同一个Person对象,这不属于拷贝。
        Person p3 = new Person();//这句代码,相当于在堆中新建一个Person对象,栈上新建一个引用p3指向该对象。
        p3.myInt = p1.myInt;//将p3.myInt指向p1.myInt所指向的内存,类似C++的浅拷贝。
        p1.myInt = null;
        Console.WriteLine(p1.myInt);
        Console.WriteLine(p2.myInt);
        Console.WriteLine(p3.myInt);
    }
}
//输出
//空行(null)
//空行(null)
//10

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值