类的深浅拷贝

版权声明:本文为博主原创文章,转载请私信博主。 https://blog.csdn.net/qq_38646470/article/details/79976685

[TOC]
画个图说说深浅拷贝
深浅拷贝

举个例子:(当我们使用构造函数时,我们需要考虑使用深拷贝还是浅拷贝)

class String
{
public:
    String(const char* str = "");
    String(const String& s);
    ~String();
private:
    char* _str;
};

//s2(s1)
String s1("hello world!");
String s2(s1); 
//此时一般情况下要使用深拷贝
//(如果使用浅拷贝会带来两个问题 )
//1.修改s1的内容s2的内容也会改变
//2.会调用两次对同一块内存释放

说说深浅拷贝的优缺点:
深拷贝:
 优点:变量存储空间互不干扰。
 缺点:如果变量并不是需要改变,大量使用深拷贝会浪费空间。
浅拷贝:
 优点:节省空间
 缺点:
  1.修改一个变量会影响另一个变量。
  2.会对同一块空间释放两次。
对浅拷贝优化我们引入了引用计数:
画个图克服浅拷贝带来的问题:
浅拷贝优化
这样就解决了第2个缺点,但是第一个缺点依然没有被解决。
下面看看如何优化第一个缺点:(还是画个图,毕竟图会让人记忆深刻些)。
写时拷贝
这样就把第一个问题解决了 。

面向对象深浅拷贝问题求大神解答~

10-10

[code=java]public class Person rn protected String name;rn protected MyDate birthday;rn private static int count = 0;rn rn public Person(String name,MyDate birthday)rn rn this.name = name;rn this.birthday = birthday;rn count++;rn rn public Person(String name)rn rn this(name,new MyDate());rn rn public Person()rn rn this("",new MyDate());rn rn public Person(Person p)rn rn this(p.name,new MyDate(p.birthday));rn rn public void set(String name)rn rn this.name = name;rn rn public void set(MyDate birthday)rn rn this.birthday = new MyDate(birthday);rn rn public void set(String name,MyDate birthday)rn rn this.set(name);rn this.set(birthday);rn rn public String getName()rn rn return this.name;rn rn public MyDate getBirthday()rn rn return this.birthday;rn rn public String toString()rn rn return this.name+","+this.birthday.toString()+","+this.getAge()+"岁";rn rn public int getAge(int year)rn rn return year-this.birthday.getYear();rn rn public int getAge()rn rn return getAge(MyDate.getThisYear());rn rn public int olderThen(Person p)rn rn return p.birthday.getYear()-this.birthday.getYear();rn rn public static void howMany()rn rn System.out.println(count+"个Person对象");rn rn public void finalize()rn rn System.out.println("释放对象("+this.toString()+")");rn count--;rn rn rn rn public static void main(String args[])rn rn Person p1 = new Person("李小明",new MyDate(1979,3,15));rn Person p2 = new Person(p1);rn p2.set(p2.getName().substring(0,2)+"dong");rn MyDate d = p2.getBirthday();rn d.set(d.getYear()+2,d.getMonth(),d.getDay());rn p2.set(d);rn Person.howMany();rn System.out.println("p1: "+p1+", p2: "+p2);rn System.out.println(p1.getName()+"比"+p2.getName()+"大"+p1.olderThen(p2)+"岁");rn p1.finalize();rn Person.howMany();rn rn rnrn[/code]rnrnrn我的疑问是 我认为 Person p2 = new Person(p1); 既是通过 浅拷贝 建立一个新的 Person 类的 p2对象,其中p2的成员变量 String 指向 p1对象中的String 也就是我认为 p1与p2的String指向同一个String区域 如果我调用p2.set(p2.getName().substring(0,2)+"dong"); 我认为也会改变p1对象中的String 的值。但是结果并没有改变p1中String的值。rn实验结果如下:rnrn2个Person对象rnp1: [color=#FF9900]李小明[/color],1979年3月15日,30岁, p2: [color=#FF9900]李小dong[/color],1981年3月15日,28岁rn李小明比李小dong大2岁rn释放对象(李小明,1979年3月15日,30岁)rn1个Person对象rnrn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试