C++中拷貝構造函數(shù)的使用
拷貝構造函數(shù)
拷貝構造函數(shù),它只有一個參數(shù),參數(shù)類型是本類的引用。
復制構造函數(shù)的參數(shù)可以是 const 引用,也可以是非 const 引用。 一般使用前者,這樣既能以常量對象(初始化后值不能改變的對象)作為參數(shù),也能以非常量對象作為參數(shù)去初始化其他對象。一個類中寫兩個復制構造函數(shù),一個的參數(shù)是 const 引用,另一個的參數(shù)是非 const 引用,也是可以的。
1. 手動定義的拷貝構造函數(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);
//手動定義了一個拷貝構造函數(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;
}
//拷貝構造函數(shù)
Human::Human(const Human& other){
//把other對象的數(shù)據(jù)拷貝到另一個對象的私有數(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;
}
//拷貝構造函數(shù)
Human::Human(const Human& other){
//把other對象的數(shù)據(jù)拷貝到另一個對象的私有數(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. 合成的拷貝構造函數(shù)
當程序員沒有定義拷貝構造函數(shù)時, 編譯器會自動生成合成的拷貝構造函數(shù)
說明:
合成的拷貝構造函數(shù)的缺點: 使用“淺拷貝”

解決方案:在自定義的拷貝構造函數(shù)中,使用‘深拷貝
Human.h
#pragma once
#include <string>
#include <iostream>
#include <Windows.h>
using namespace std;
class Human {
public:
Human();
//定義了一個拷貝構造函數(shù)
Human(const Human & man);
string getName() const;
string getSex() const;
int getAge() const;
const char* getAddr();
void setAddr(char* addr); //設置地址
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);
}
//拷貝構造函數(shù)
Human::Human(const Human& other){
cout << "調用拷貝構造函數(shù)" << endl;
//把other對象的數(shù)據(jù)拷貝到私有數(shù)據(jù)
this->name = other.name;
this->sex = other.sex;
this->age = other.age;
//使用深拷貝, 單獨分配一個內存
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;
//初始化調用拷貝構造函數(shù)
Human lisi = zhangsan; //自動調用拷貝構造函數(shù)
//賦值的時候調用的是賦值構造函數(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;
}
總結
到此這篇關于C++中拷貝構造函數(shù)的使用的文章就介紹到這了,更多相關C++拷貝構造函數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android App仿微信界面切換時Tab圖標變色效果的制作方法
這篇文章主要介紹了Android App仿微信界面切換時Tab圖標變色效果的制作方法,重點講解了圖標的繪制技巧,需要的朋友可以參考下2016-04-04
C++基于reactor的服務器百萬并發(fā)實現(xiàn)與講解
這篇文章主要介紹了C++基于reactor的服務器百萬并發(fā)實現(xiàn)與講解,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07

