深层复制构造函数--初识

浅层复制构造函数会产生迷途指针,进而造成程序崩溃,所以,我们需要用深层复制构造函数来解决这个问题

#include <iostream>

using namespace std;

class A

{

public:

A() { x = new int; *x = 5; }

~A() { delete x; x = NULL; }         //删除指针后,紧接着就要把指针设置为 NULL,养成这样的习惯

A(const A&a) //深层复制构造函数

{

cout << "复制构造函数执行...\n" << endl;

x = new int;                 //为成员变量创建一个新的内存(堆)区域

                      //x是在堆中有别于原指针的新的空间,所以原对象被删除,不影响复制出来的新对象

*x = *(a.x); //把旧对象内容赋值给新的对象

/*深层复制构造函数有别于浅层复制构造函数,在于一:复制构造函数为新的指针成员变量提供新的内存空间(可以是堆,也可以是栈),同时把指针成员变量的值赋给新的指针,作为新的指针所指向地址的内容*/

}

void print()const { cout << *x << endl; }

void set(int i) { *x = i; }

private:

int *x;

};

int main()

{

A *a = new A();

cout << "a:";

a->print();

A b = (*a);                 //在栈中复制一个a的对象 b

cout << "a:";

a->print();

cout << "b:";

b.print();

a->set(998);

b.set(43);

a->print();

b.print();

A *c = new A(*a);            //在堆中复制一个a的对象c

c->set(76);

c->print();

delete c;

delete a;

system("pause");

return 0;

}

时间: 2024-10-22 14:55:36

深层复制构造函数--初识的相关文章

复制构造函数的用法及出现迷途指针问题

复制构造函数利用下面这行语句来复制一个对象:   A (A &a) 从上面这句话可以看出,所有的复制构造函数均只有一个参数,及对同一个类的对象的引用 比如说我们有一个类A,定义如下: ? 1 2 3 4 5 6 7 8 9 10 class A { public: A(int i,int j){n=i;m=j;} //构造函数带两个参数,并将参数的值分别赋给两个私有成员 A(A &t); //我们自己定义一个默认构造函数 void print(){cout<<n<<

浅谈c++中的复制构造函数

3. 复制构造函数 3.1 复制构造函数作用 它是一种特殊的构造函数,其形参为本类对象的引用.作用是用一个已存在的对象去初始化同类型的新对象. 3.2 声明和实现复制构造函数的一般方法 Class Clock{ Public: Clock(int newH,int newM,int newS);//构造函数 Clock(const Clock &a); //复制构造函数声明 ........... Private: Int x,y; } Clock::Clock(const Clock &

剑指offer 复制构造函数

复制构造函数: A(const A &other){value=other.value;} 也就是传值参数改为常量引用. #include<iostream> using namespace std; class A { private: int value; public: A(int n){value=n;} A(const A &other){value=other.value;} void print(){ cout<<value<<endl;

复制构造函数

// 复制构造函数.cpp : 定义控制台应用程序的入口点.//复制构造函数:类(const 类&对象(随便起))/*Box(const Box&box){length = box.length;width = box.width;height = box.height;}*/ #include "stdafx.h"#include<iostream>using namespace std;class Box{private:    int length; 

C++复制构造函数和赋值符的区别

From  http://blog.csdn.net/randyjiawenjie/article/details/6666937 感谢原作者分享. class CTest{public: CTest(); //构造函数 CTest(const CTest &); //复制构造函数 CTest & operator = (const CTest &); //赋值符}; CTest::CTest(){ cout<<"Constructor of CTest&qu

复制构造函数的调用

1 #include <iostream> 2 using namespace std; 3 4 class Test 5 { 6 public: 7 Test(int n = 1) 8 { 9 val = n; 10 cout << "Con." << endl; 11 } 12 13 Test(const Test& t) 14 { 15 val = t.val; 16 cout << "Copy con."

C++类的复制构造函数和赋值运算符

前言: C++面向对象的编程过程中,凡是在类中运用到动态内存分配的时候总是会写一个显示的复制构造函数和赋值重载运算符,本文将结合C++ Primer Plus一书的内容分析下原因: 一.在C++编程中如果没有编写下列成员函数,系统会自动的提供: (1)构造函数 (2)析构函数 (3)地址运算符 (4)赋值构造函数 (5)赋值运算符 其中(1)-(3)在编程中不会产生什么影响,但是(4)(5)会造成较大的影响 二.赋值构造函数 1.函数原型  Class_name(const Class_name

一段代码引起的对C++构造函数、析构函数,复制构造函数,运算符重载的深度理解

代码和解释: #include "stdafx.h" #include <stdio.h> #include <string> #include <iostream> using namespace std; class test{ int *p; public: test(int value){ p = new int(value); cout<<"Execute Constructor>>"<&l

对象 &amp;&amp; 复制构造函数

复制构造函数必须将形参指定为 const 引用 若复制构造函数写成如下: CBox(CBox initB); 由于是按值传递,所以编译器会首先创建对象的副本,而创建对象的副本需要调用复制构造函数,又会创建新的对象,新对象又会调用复制构造函数 会持续不休,最终得到对复制构造函数的无穷调用. 解决方法如下: CBox(const CBox & initB); 由于是引用形参,因此没有复制发生,const 限定符用来确保该函数不能修改实参. class CMessage { private: char