zoukankan      html  css  js  c++  java
  • C++关于构造函数的深拷贝与浅拷贝

    首先拷贝构造函数的声明方法:

    类名::类名(const 类名&)

    1、浅拷贝的实现程序:

    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
    using namespace std;
    class  Person
    {
    public:
    	//构造函数
    	Person(const char *name, double hei, double wei, 
    		int age0):height(hei),weight(wei),age(age0){
    		cout << "Person ctor called .
    ";
    		pName = new char[strlen(name) + 1];
    		strcpy(pName, name);
    	}
    	//析构函数
    	~Person(){
    		cout << "deleting pName";
    		delete[] pName;
    
    	}
    	//类Person的拷贝构造函数
    	Person(const Person &person){
    		cout << "Person copy ctor called";
    		pName = person.pName;
    		height = person.height;
    		weight = person.weight;
    		age = person.age;
    	}
    private:
    	char *pName;
    	double height;
    	double weight;
    	int age;
    };
    
    int main()
    {
    	Person p1("Leekin",175,185,25);
    	Person p2(p1);
    	return 0;
    }
    

      首先这个程序在VS2013上面编译不通过;是因为浅拷贝存在风险:非法操作内存,究其原因是因为“拷贝不充分”导致堆中的某一块内存被不同对象的指针属性同时指向,该内存不可避免的被释放多次,这是不应许。第一次被释放的空间已经属于操作系统,当在一次释放时那一片空间已经不属于程序了。

    以下是浅拷贝的内存模型:

    2、深拷贝可以避免由于浅拷贝带来的问题,即让拷贝函数做好充分的拷贝,程序如下:

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    class  Person
    {
    public:
    	//构造函数
    	Person(const char *name, double hei, double wei, 
    		int age0):height(hei),weight(wei),age(age0){
    		cout << "Person ctor called .
    ";
    		pName = new char[strlen(name) + 1];
    		strcpy(pName, name);
    	}
    	//析构函数
    	~Person(){
    		cout << "deleting pName";
    		delete[] pName;
    
    	}
    	//类Person的拷贝构造函数
    	Person(const Person &person){
    		cout << "Person copy ctor called";
    		pName = person.pName;
    		height = person.height;
    		weight = person.weight;
    		age = person.age;
    		//深拷贝:重新申请一块内存
    		pName = new char[strlen(person.pName) + 1];
    		strcpy(pName, person.pName);
    	}
    private:
    	char *pName;
    	double height;
    	double weight;
    	int age;
    };
    
    int main()
    {
    	Person p1("Leekin",17.5,18.5,25);
    	Person p2(p1);
    	return 0;
    }
    

      深拷贝的内存模型:

  • 相关阅读:
    SQL-LINQ-Lambda 语法对照
    C#.NET面向对象(语法点)
    4.5 基于STM32+MC20远程短信控制开关
    4.4 使用STM32控制MC20进行GPS帧数据解析
    4.3 使用STM32控制MC20进行GPRS通讯
    4.2 使用STM32控制MC20发送短信
    4.1 使用STM32控制MC20拨打电话
    3.6.使用STC89C52控制MC20解析GPS的经纬度数据上传到指定服务器
    3.5.基于STC89C52+MC20的短信远程控制开关LCD1602显示
    3.4 使用STC89C52控制MC20解析GPS的经纬度数据在LCD1602上显示
  • 原文地址:https://www.cnblogs.com/Leekin/p/4589792.html
Copyright © 2011-2022 走看看