C++中拷貝構(gòu)造函數(shù)的使用
拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù),它只有一個(gè)參數(shù),參數(shù)類型是本類的引用。
復(fù)制構(gòu)造函數(shù)的參數(shù)可以是 const 引用,也可以是非 const 引用。 一般使用前者,這樣既能以常量對象(初始化后值不能改變的對象)作為參數(shù),也能以非常量對象作為參數(shù)去初始化其他對象。一個(gè)類中寫兩個(gè)復(fù)制構(gòu)造函數(shù),一個(gè)的參數(shù)是 const 引用,另一個(gè)的參數(shù)是非 const 引用,也是可以的。
1. 手動(dòng)定義的拷貝構(gòu)造函數(shù)
Human.h
#pragma once #include <iostream> #include <Windows.h> #include <string> using namespace std; class Human { public: Human(); Human(int age, string name, string sex); //手動(dòng)定義了一個(gè)拷貝構(gòu)造函數(shù) Human(const Human &other); string getName() const; string getSex() const; int getAge() const; void description() const; //描述信息 private: string name; //姓名 string sex; //性別 int age; //年齡 };
Human.cpp
#include "Human.h" Human::Human() { } Human::Human(int age, string name, string sex) { this->name = name; this->sex = sex; this->age = age; } //拷貝構(gòu)造函數(shù) Human::Human(const Human& other){ //把other對象的數(shù)據(jù)拷貝到另一個(gè)對象的私有數(shù)據(jù) this->name = other.name; this->sex = other.sex; this->age = other.age; } string Human::getName() const { return name; } string Human::getSex() const { return sex; } int Human::getAge() const { return age; } void Human::description() const { cout << "姓名: " << getName() << endl; cout << "年齡: " << getAge() << endl; cout << "性別: " << getSex() << endl; }
main.cpp
#include "Human.h" Human::Human() { } Human::Human(int age, string name, string sex) { this->name = name; this->sex = sex; this->age = age; } //拷貝構(gòu)造函數(shù) Human::Human(const Human& other){ //把other對象的數(shù)據(jù)拷貝到另一個(gè)對象的私有數(shù)據(jù) this->name = other.name; this->sex = other.sex; this->age = other.age; } string Human::getName() const { return name; } string Human::getSex() const { return sex; } int Human::getAge() const { return age; } void Human::description() const { cout << "姓名: " << getName() << endl; cout << "年齡: " << getAge() << endl; cout << "性別: " << getSex() << endl; }
2. 合成的拷貝構(gòu)造函數(shù)
當(dāng)程序員沒有定義拷貝構(gòu)造函數(shù)時(shí), 編譯器會自動(dòng)生成合成的拷貝構(gòu)造函數(shù)
說明:
合成的拷貝構(gòu)造函數(shù)的缺點(diǎn): 使用“淺拷貝”
解決方案:在自定義的拷貝構(gòu)造函數(shù)中,使用‘深拷貝
Human.h
#pragma once #include <string> #include <iostream> #include <Windows.h> using namespace std; class Human { public: Human(); //定義了一個(gè)拷貝構(gòu)造函數(shù) Human(const Human & man); string getName() const; string getSex() const; int getAge() const; const char* getAddr(); void setAddr(char* addr); //設(shè)置地址 private: string name; //姓名 string sex; //性別 int age; //年齡 char* addr; //地址 };
Human.cpp
#include "Human.h" #define ADDR_LEN 64 Human::Human() { name = "無名"; sex = "未知"; age = 18; const char* addr_s = "China"; addr = new char[ADDR_LEN]; strcpy_s(addr, ADDR_LEN, addr_s); } //拷貝構(gòu)造函數(shù) Human::Human(const Human& other){ cout << "調(diào)用拷貝構(gòu)造函數(shù)" << endl; //把other對象的數(shù)據(jù)拷貝到私有數(shù)據(jù) this->name = other.name; this->sex = other.sex; this->age = other.age; //使用深拷貝, 單獨(dú)分配一個(gè)內(nèi)存 this->addr = new char[ADDR_LEN]; strcpy_s(this->addr, ADDR_LEN, other.addr); } string Human::getName() const { return name; } string Human::getSex() const { return sex; } int Human::getAge() const { return age; } const char* Human::getAddr(){ return addr; } void Human::setAddr(char* addr){ if (!addr) return; strcpy_s(this->addr, ADDR_LEN, addr); }
#include "Human.h" using namespace std; int main(void) { Human zhangsan; //初始化調(diào)用拷貝構(gòu)造函數(shù) Human lisi = zhangsan; //自動(dòng)調(diào)用拷貝構(gòu)造函數(shù) //賦值的時(shí)候調(diào)用的是賦值構(gòu)造函數(shù) //lisi = zhangsan; cout <<"李四地址: " << lisi.getAddr() << endl; cout <<"張三地址: " << zhangsan.getAddr() << endl; cout << "張三修改地址" << endl; zhangsan.setAddr((char*)"美國"); cout << "李四地址: " << lisi.getAddr() << endl; cout << "張三地址: " << zhangsan.getAddr() << endl; system("pause"); return 0; }
總結(jié)
到此這篇關(guān)于C++中拷貝構(gòu)造函數(shù)的使用的文章就介紹到這了,更多相關(guān)C++拷貝構(gòu)造函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法
這篇文章主要介紹了Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法,重點(diǎn)講解了圖標(biāo)的繪制技巧,需要的朋友可以參考下2016-04-04C++基于reactor的服務(wù)器百萬并發(fā)實(shí)現(xiàn)與講解
這篇文章主要介紹了C++基于reactor的服務(wù)器百萬并發(fā)實(shí)現(xiàn)與講解,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07