返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >带你粗略了解C++中的深浅拷贝
  • 488
分享到

带你粗略了解C++中的深浅拷贝

2024-04-02 19:04:59 488人浏览 安东尼
摘要

目录一. 背景二. 代码实现三. 问题四. 解决方法总结一. 背景 首先看这样一个问题,在Car类中聚合了Engine类 二. 代码实现 下面给出类Car与类Engine的定义 C

一. 背景

首先看这样一个问题,在Car类中聚合了Engine类

二. 代码实现

下面给出类Car与类Engine的定义

Car.h


#ifndef COPY__CAR_H_
#define COPY__CAR_H_
#include "Engine.h"
#include <string>
using namespace std;
class Car {
 public:
  // 构造函数
  Car();
  Car(string brand, int version);
  ~Car();
  // 添加或者修改一个引擎
  void setEngine(string engine_brand, int engine_version);
  // 对汽车信息进行描述
  string description() const;
 private:
  string brand; // 品牌
  int version; // 型号
  Engine *engine; // 引擎
};
#endif //COPY__CAR_H_

Car.cpp


#include "Car.h"
#include <sstream>
Car::Car() {
  this->brand = "无";
  this->version = 0;
  this->engine = nullptr;
}
Car::Car(string brand, int version) {
  engine = nullptr;
  this->brand = brand;
  this->version = version;
}
Car::~Car() {
}
void Car::setEngine(string engine_brand, int engine_version) {
  if (engine) {
    delete engine;
  }
  engine = new Engine(engine_brand, engine_version);
}
string Car::description() const {
  stringstream result;
  result << "品牌:" << brand << " 版本:" << version << engine->description();
  return result.str();
}

Engine.h


#ifndef COPY__ENGINE_H_
#define COPY__ENGINE_H_
#include <string>
using namespace std;
class Engine {
 public:
  Engine();
  Engine(string brand, int version);
  ~Engine();
  string description() const;
 private:
  string brand;
  int version;
};
#endif //COPY__ENGINE_H_

Engine.cpp


#include "Engine.h"
#include <sstream>
Engine::Engine() {
  this->brand = "无";
  this->version = 0;
}
Engine::Engine(string brand, int version) {
  this->brand = brand;
  this->version = version;
}
Engine::~Engine() {
}
string Engine::description() const {
  stringstream result;
  result << " 发动机品牌:" << brand << " 发动机版本:" << version;
  return result.str();
}

在大部分情况下,在类中不去实现拷贝构造函数是可行的,c++编译器会帮助我们自动生成一个拷贝构造函数. 并且这个拷贝构造函数足以应对很多问题,但是当遇到指针的时候情况变得不同.下面给一个示例代码:


#include "Car.h"
#include <iOStream>
using namespace std;
int main() {
  // 创建car_1对象
  Car car_1("宝马", 1);
  // 为car_1对象添加一个引擎
  car_1.setEngine("宝马", 1);
  // 创建car_2对象, 并且拷贝自car_1
  Car car_2(car_1);
  // 输出修改引擎前的两个对象信息
  cout << car_1.description() << endl;
  cout << car_2.description() << endl;
  // 修改引擎
  car_2.setEngine("奔驰", 1);
  // 输出修改引擎以后的两个对象信息
  cout << car_1.description() << endl;
  cout << car_2.description() << endl;
  return 0;
}

三. 问题

当我们对car_2对象的引擎进行修改时, 我们所期望的结果是仅仅只有car_2对象的引擎被修改,可是事实如此吗?

结果显示,并不是这样,car_1对象的引擎和car_2对象的引擎都被改变了.

原因就是C++编译器帮我们合成的拷贝构造函数是一个浅拷贝,只是将变量的值拷贝过来,在Car类中的成员变量engine是一个指针变量,存放的是一个地址.在进行拷贝构造时,就意味着car_1对象中engine变量和car_2对象中的engine变量存放的是同一个地址值(由于是new出来的对象, 所以地址engine变量中存放的值处于堆空间). 如图所示.(地址是瞎编的)

四. 解决方法

解决方法就是:手动实现拷贝构造函数,实现深拷贝,如图所示.

在Car.cpp文件中添加如下代码 :


Car::Car(const Car &other) {
  this->brand = other.brand;
  this->version = other.version;
  engine = new Engine(other.brand, other.version);
}

主函数不变,得到如下结果:

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 带你粗略了解C++中的深浅拷贝

本文链接: https://lsjlt.com/news/133017.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 带你粗略了解C++中的深浅拷贝
    目录一. 背景二. 代码实现三. 问题四. 解决方法总结一. 背景 首先看这样一个问题,在Car类中聚合了Engine类 二. 代码实现 下面给出类Car与类Engine的定义 C...
    99+
    2024-04-02
  • C++的深浅拷贝和写时拷贝你了解吗
    目录1.浅拷贝2.深拷贝3.引用计数+写时拷贝总结1.浅拷贝 浅拷贝:对于有申请空间的对象的类来说,是按照字节序依次拷贝过去的,并没有另外申请一块空间。因此,在调用析构函数的时候会造...
    99+
    2024-04-02
  • 一文带你了解JavaScript基础之深拷贝和浅拷贝
    目录浅拷贝深拷贝补充总结拷贝(又名克隆,复制等),但是又分深拷贝和钱拷贝。 其实这个问题有时候想通了就很简单,如果想不通可能会有点绕,不过其难度比闭包等好理解的多。 为什么又这个概念...
    99+
    2024-04-02
  • 一文带你搞懂Numpy中的深拷贝和浅拷贝
    目录1. 引言2. 浅拷贝2.1 问题引入2.2 问题剖析3. 深拷贝3.1 举个栗子3.2 探究原因4. 技巧总结4.1 判断是否指向同一内存4.2 其他数据类型5. 总结1. 引...
    99+
    2024-04-02
  • Java的深拷贝和浅拷贝深入了解
    关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的...
    99+
    2024-04-02
  • c++中深拷贝和浅拷贝的区别
    深度拷贝和浅拷贝是 c++ 中复制对象的方法,它们在复制对象的行为上有着本质的区别:浅拷贝仅复制对象的指针或引用,原始对象的数据可能会受到影响。深拷贝复制对象的所有数据,创建新的对象,不...
    99+
    2024-05-12
    c++
  • Python中的深拷贝浅拷贝
    什么是浅拷贝,什么是深拷贝? 一、浅拷贝 浅拷贝就是:拷贝了引用,并没有拷贝内容,和在Linux中的硬链接有些类似,在python中,使用=赋值的动作就是一个浅拷贝 浅拷贝中的新旧对象,共用一个内存地...
    99+
    2023-09-08
    python 开发语言
  • 深入理解python中的浅拷贝和深拷贝
    在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b 为什么我只对...
    99+
    2022-06-04
    和深 python
  • C++拷贝构造函数(深拷贝与浅拷贝)详解
    对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝...
    99+
    2022-11-15
    拷贝构造函数 深拷贝 浅拷贝
  • JavaScript中深拷贝与浅拷贝详解
    目录1 浅拷贝概念2 深拷贝概念3 浅拷贝的实现方式3.1 Object.assign()3.2 Array.prototype.concat()3.3 Array.pro...
    99+
    2024-04-02
  • Golang中深拷贝与浅拷贝详解
    目录什么是深拷贝?什么是浅拷贝?示例代码小结什么是深拷贝? 深拷贝(Deep Copy)是指原对象与拷贝的新对象互相独立,对其中任何一个对象的改动都不会对另外一个对象造成影响。值类型...
    99+
    2023-05-19
    Golang 深拷贝与浅拷贝 Golang深拷贝 Golang浅拷贝 Golang拷贝
  • Java中浅拷贝和深拷贝详解
    目录Java浅拷贝深拷贝实现浅拷贝实现深拷贝Java浅拷贝深拷贝 浅拷贝和深拷贝涉及到了Object类中的clone()方法 实现浅拷贝 浅拷贝的实现需要类重写clone()方法 ...
    99+
    2024-04-02
  • java中的浅拷贝与深拷贝
    1、什么叫Java浅拷贝?浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。2、什么叫Java深拷贝?深拷贝复制变量值,对于引用数据,则递归至基本类型后,再复制。深...
    99+
    2021-10-17
    java教程 java 浅拷贝 深拷贝
  • 带你粗略了解C++回文链表
    目录请判断一个链表是否为回文链表。思路总结请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2...
    99+
    2024-04-02
  • c++中深拷贝和浅拷贝的应用时间
    浅拷贝复制对象指针或引用,仅适用于不含动态分配内存或简单数据结构的对象;深拷贝复制实际数据,包括动态分配内存,适用于包含动态分配内存或复杂数据结构的对象。 浅拷贝和深拷贝的应用时间 在...
    99+
    2024-05-14
    c++
  • 带你粗略了解c++的最大乘积
    目录今天给大家讲最大乘积这道题目样例思路代码总结今天给大家讲最大乘积这道题目 最大乘积 内存限制:256 MiB 时间限制:1000 ms 输入文件:maximum.in 输...
    99+
    2024-04-02
  • js深拷贝和浅拷贝的深入讲解
    目录浅拷贝实现方法方法一:Object.assign方法二:扩展运算符方式方法三:concat和slice 浅拷贝数组深拷贝实现方法方法一:乞丐版(JSON.stringify和JS...
    99+
    2024-04-02
  • C++深浅拷贝和写时拷贝图文详解
    前言 之前我们在浅谈6个成员函数中有提到深浅拷贝的问题,现在再回首掏一把。 一、深浅拷贝哪家强? 先给出代码理一理 #define _CRT_SECURE_NO_WARNINGS...
    99+
    2024-04-02
  • C++简明图解分析浅拷贝与深拷贝
    目录浅拷贝(单纯值拷贝)深拷贝总结拷贝构造函数的调用时机类中有指针成员 才会讨论 浅拷贝 和深拷贝问题。 浅拷贝(单纯值拷贝) #include <iostream> ...
    99+
    2024-04-02
  • Python中Numpy的深拷贝和浅拷贝
    目录1. 引言2. 浅拷贝2.1 问题引入2.2 问题剖析3. 深拷贝3.1 举个栗子3.2 探究原因4. 技巧总结4.1 判断是否指向同一内存4.2 其他数据类型5. 总结1. 引...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作