欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

帶你粗略了解C++中的深淺拷貝

 更新時間:2021年08月19日 10:37:08   作者:supermario19  
這篇文章主要給大家介紹了關于c++中深淺拷貝以及寫時拷貝實現(xiàn)的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧

一. 背景

首先看這樣一個問題,在Car類中聚合了Engine類

二. 代碼實現(xiàn)

下面給出類Car與類Engine的定義

Car.h

#ifndef COPY__CAR_H_
#define COPY__CAR_H_
#include "Engine.h"
#include <string>
using namespace std;
class Car {
 public:
  // 構造函數(shù)
  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 << " 發(fā)動機品牌:" << brand << " 發(fā)動機版本:" << version;
  return result.str();
}

在大部分情況下,在類中不去實現(xiàn)拷貝構造函數(shù)是可行的,C++編譯器會幫助我們自動生成一個拷貝構造函數(shù). 并且這個拷貝構造函數(shù)足以應對很多問題,但是當遇到指針的時候情況變得不同.下面給一個示例代碼:

#include "Car.h"
#include <iostream>
using namespace std;
int main() {
  // 創(chuàng)建car_1對象
  Car car_1("寶馬", 1);
  // 為car_1對象添加一個引擎
  car_1.setEngine("寶馬", 1);
  // 創(chuàng)建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++編譯器幫我們合成的拷貝構造函數(shù)是一個淺拷貝,只是將變量的值拷貝過來,在Car類中的成員變量engine是一個指針變量,存放的是一個地址.在進行拷貝構造時,就意味著car_1對象中engine變量和car_2對象中的engine變量存放的是同一個地址值(由于是new出來的對象, 所以地址engine變量中存放的值處于堆空間). 如圖所示.(地址是瞎編的)

四. 解決方法

解決方法就是:手動實現(xiàn)拷貝構造函數(shù),實現(xiàn)深拷貝,如圖所示.

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

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

主函數(shù)不變,得到如下結果:

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • C語言中函數(shù)參數(shù)的入棧順序詳解及實例

    C語言中函數(shù)參數(shù)的入棧順序詳解及實例

    這篇文章主要介紹了C語言中函數(shù)參數(shù)的入棧順序詳解及實例的相關資料,需要的朋友可以參考下
    2017-02-02
  • C++ 內存管理原理分析

    C++ 內存管理原理分析

    本章主要介紹C++的內存管理,以C++的內存分布作為引入,介紹C++不同于C語言的內存管理方式(new delete對比 malloc free),最后為了加深讀者的理解,會介紹new和delete的底層實現(xiàn)原理
    2021-11-11
  • 深入解析C++中的指針數(shù)組與指向指針的指針

    深入解析C++中的指針數(shù)組與指向指針的指針

    以下是對C++中的指針數(shù)組與指向指針的指針進行了詳細的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C語言實現(xiàn)房屋管理系統(tǒng)

    C語言實現(xiàn)房屋管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)房屋管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++ vector的介紹及常見功能實現(xiàn)

    C++ vector的介紹及常見功能實現(xiàn)

    這篇文章主要介紹了C++ vector的介紹及模擬實現(xiàn),vector在實際中非常的重要,但在實際中我們只要熟悉常見的接口就可以了,最重要的是理解他的底層原理,要能夠自己模擬實現(xiàn)出一個簡單的vector,本文結合示例代碼給大家詳細介紹,需要的朋友可以參考下
    2023-05-05
  • C++實現(xiàn)旋轉掃描儀的示例代碼

    C++實現(xiàn)旋轉掃描儀的示例代碼

    旋轉掃描儀(Rotating?Scanner),也稱為旋轉掃描儀或圓形掃描儀,是一種用于獲取圖像和文檔的設備,下面就跟隨小編一起來學習一下如何使用C++實現(xiàn)旋轉掃描儀功能吧
    2024-02-02
  • C++中漢字字符串的截取

    C++中漢字字符串的截取

    C++中漢字字符串的截取,需要的朋友可以參考一下
    2013-05-05
  • C++資源管理操作方法詳解

    C++資源管理操作方法詳解

    系統(tǒng)中的資源,諸如動態(tài)申請的內存,文件描述符,數(shù)據(jù)庫連接,網(wǎng)絡socket等,在不用的時候,應該及時歸還給系統(tǒng),否則就會造成內存泄露
    2022-09-09
  • C++ 動態(tài)內存管理詳情解說

    C++ 動態(tài)內存管理詳情解說

    這篇文章主要介紹了C++ 動態(tài)內存管理詳情解說,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下,希望對你的學習有所幫助
    2022-07-07
  • C語言驅動開發(fā)內核枚舉IoTimer定時器解析

    C語言驅動開發(fā)內核枚舉IoTimer定時器解析

    這篇文章主要為大家介紹了C語言驅動開發(fā)內核枚舉IoTimer定時器解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10

最新評論