生活随笔
收集整理的這篇文章主要介紹了
很多人都不知道的小秘密,c++中拷贝分为两种
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
深拷貝與淺拷貝
下面為作者的總結以深刻理解深拷貝和甜拷貝
深拷貝:如果創建類對象時,相應的構造函數內用運算符new為對象的數據成員申請內存空間,那么在析構函數中應該用運算符 delete釋放相應的內存空間。
當創建對象并用已經存在的對象進行初始化時,必須自定義拷貝構造函數。
在拷貝構造函數內使用new運算符為新對象申請內存空間,把已經存在的對象的內存空間中的數據拷貝到新對象申請的內存空間中,這種拷貝過程即稱為深拷貝。
淺拷貝:與深拷貝的概念相對應,不采用上述深拷貝方法實現對象的拷貝即稱為淺拷貝。通常情況下,如果類的構造函數內沒有用new運算符為對象的數據成員申請內存空間,析構函數中也不用 delete運算符釋放內存空間,則不需要自定義拷貝構造函數,使用編譯器提供的默認拷貝構造函數即可。
下為深拷貝的代碼案例:
#include <iostream>
#include <string>
#include <cstring>
#include <iomanip>
#include <array>
using namespace std;class student {public:student (const string & = " ", int = 19, double = 0, double = 0, double = 0);student (const student &);~student ();double avgscore();private:string strname;//描述學生姓名int age;//描述學生年齡double *score;//指針,用來儲存三門課的成績
};
//實現構造函數
student::student(const string &name, int nage, double nmath, double neglish, double npe) {strname = name;age = nage;score = new double[3];score[0] = nmath;score[1] = neglish;score[2] = npe;
}
//實現折構函數
student::~student() {delete []score;
}student::student(const student &s) {//實現拷貝構造函數strname = s.strname;age = s.age;score = new double [3];//為當前對象score申請內存空間score[0] = s.score[0];score[1] = s.score[1];score[2] = s.score[2];
}
double student::avgscore() {return (score[0] + score[1] + score[2]) / 3;
}int main() {student s1{"janni", 23, 45.5, 78.7, 95.2};cout << s1.avgscore() << endl;student s2{s1};cout << s2.avgscore() << endl;
}
總結
以上是生活随笔為你收集整理的很多人都不知道的小秘密,c++中拷贝分为两种的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。