C++复习我爱编程C++

C++深拷贝浅拷贝

2018-04-17  本文已影响14人  凉拌姨妈好吃

Q:什么时候会调用拷贝构造函数?

A:1.一个对象以值传递的形式传入函数体(实参传递给形参的实际上是实参的拷贝对象)

      2.一个对象以值传递的形式从函数返回(该对象是函数里对象的拷贝)

      3.一个对象通过另一个对象初始化

Q:如果我们没有定义拷贝构造函数会出现什么结果?

A:编译器将会生成一个默认的拷贝构造函数,这个拷贝构造函数完成对象的位拷贝(也就是浅拷贝)

Q:什么是浅拷贝?

A:当类A通过类B初始化,类B已经申请了内存,那么类A就会指向类B所申请的内存。如果类B释放掉内存,那么类A中的指针就是野指针了。简单来说就是浅拷贝没有重新申请资源

为了避免内存泄露,我们应该在拥有指针成员的对象进行拷贝的时候,需要自己定义拷贝构造函数,使拷贝后的对象指针成员拥有自己的内存地址。

Q:什么是深拷贝?

A:一个类拥有资源,当该类的对象发生复制过程,资源重新分配。

Q:如何定义一个构造函数?

A:类A的构造函数需要与类A同名,且不存在返回值(连void也不行)

Q:构造函数如何调用?

A:每创建一个对象都会自动调用构造函数

Q:谈一谈对结构体拷贝的理解

A:创建结构体Student,定义Student型的结构变量t1,t2。

      如果使用t1=t2;进行拷贝,那么就是浅拷贝,此时如果结构体内存在指针变量,依旧是指向同一个内存块。

      如果使用copy(&t1,&t2),此时为深拷贝,为t1创建了新的内存。

Q:如果存在某结构体A与某结构体B,它们的内部结构是完全一致的,只是内部结构名和结构体名不一样,用哪种方法能最快速实现拷贝?

A:一开始想到的是一个一个字段进行赋值,后来想想如果这个结构体字段非常多,这样做就没有效率。两个结构体内部结构一致,那么它们的存储方式也是一致的,那么可以使用内存复制的方式实现结构体之间的拷贝。即memcpy(&test1,&test2,sizeof(test2的结构体名))

上一篇下一篇

猜你喜欢

热点阅读