C++中調(diào)用復(fù)制(拷貝)函數(shù)的三種情況總結(jié)
1.同一類中的對(duì)象1復(fù)制給對(duì)象2
同樣是Point p1; Point p2;
例如:
int main(){ Point p1(1,2); Point p2=p1; ? //這兩種都會(huì)調(diào)用復(fù)制構(gòu)造函數(shù) Point p3(p1); return 0; }
2.以對(duì)象為函數(shù)的形參
例如:
void fun(Point p){ //p 作為了形參 ? cout<<p.height<<endl; ? }
3.函數(shù)返回是類的對(duì)象
void fun2(){ Point p1(1,3); return p1; } ? //或者還有返回*this的形式 ? void fun3(){ Point p2(5,8); x+=4; y+=6; return *this; }
注意:如果意外使用return *this;
導(dǎo)致調(diào)用的復(fù)制構(gòu)造函數(shù)里面會(huì)輸出多余的語(yǔ)句(這些語(yǔ)句不可刪除)
那么我們應(yīng)該 讓此函數(shù)的返回類型改為 void
例題如下(讓我記憶猶新)
?設(shè)計(jì)一個(gè)自己的字符串類MyString,內(nèi)部有一個(gè)私有成員char *sptr;該成員用于創(chuàng)建字符串對(duì)象時(shí),在內(nèi)部使用動(dòng)態(tài)內(nèi)存分配的方法分配一個(gè)字符數(shù)組用于存儲(chǔ)字符串的內(nèi)容。
- 為該類設(shè)計(jì)構(gòu)造函數(shù)、析構(gòu)函數(shù)(對(duì)象析構(gòu)時(shí),要釋放分配的數(shù)組)
- 為該類設(shè)計(jì)返回字符串實(shí)際長(zhǎng)度的成員函數(shù)
- 為該類設(shè)計(jì)輸出字符串內(nèi)容的成員函數(shù)
- 為該類設(shè)計(jì)實(shí)現(xiàn)字符串連接和字符串復(fù)制的成員函數(shù)。字符串連接和字符串復(fù)制時(shí),要求重新分配數(shù)組,并釋放原有的數(shù)組。
main函數(shù)已經(jīng)寫好,請(qǐng)根據(jù)main函數(shù)的內(nèi)容完成該類的設(shè)計(jì):
int main(){ MyString s1; MyString s2("Hello"); MyString s3(s2); ? s1.printString(); s2.printString(); s3.printString(); ? cout<<s1.getSize()<<" "<<s2.getSize()<<" "<<s3.getSize()<<endl; ? MyString s4("HiChina");? ? s2.stringCopy(s4); s2.printString(); ? s3.stringCat(s4); s3.printString();? ? return 0; }
正確解答如下:
//不包括主函數(shù)main部分 #include<bits/stdc++.h> using namespace std; class MyString{ ?char *sptr; ?int size; public: ?MyString(){ ? size=0; ? sptr=new char[1]; ? sptr[0]='\0'; ? cout<<"Object Constructed. No Memory Allocated."<<endl; ?} ?MyString(char* s){//s是指針? ?? ?size=strlen(s); ?? ?sptr=new char[size+1]; ?? ?sptr[size]='\0'; ?? ?strcpy(sptr,s); ?? ?cout<<"Object Constructed. "<<size+1<<" Bytes Allocated."<<endl; ?} ?MyString(const MyString&s){//此處s是對(duì)象? ? size=s.size; ? sptr=new char[size+1]; ? strcpy(sptr,s.sptr); ? cout<<"Object Constructed. "<<size+1<<" Bytes Allocated."<<endl; ?} ?~MyString(){ ? if(sptr[0]=='\0'){cout<<"Object Destructed. No Memory Freed."<<endl;} ? else{ ? ?cout<<"Object Destructed. "<<size+1<<" Bytes Freed."<<endl; ? } ? delete[]sptr; ?} ?void printString(){ ? if(!size){cout<<"No Memory Allocated In This Object."<<endl;} ? else ?cout<<sptr<<endl; ?} ?int getSize(){ ??? ?return size; ?} void stringCopy(MyString&s){ ? cout<<"String Copy, "<<s.size+1<<" Bytes Reallocated And "<<size+1<<" Bytes Freed."<<endl; ? size=s.size; ? sptr=new char[size+1]; ? strcpy(sptr,s.sptr); ? sptr[s.size]='\0'; //沒有return *this? ?} ?void stringCat(MyString&p){ ? char *p1=new char [size+p.size+1]; ? size=size+p.size; ? cout<<"String Connection, "<<size+1<<" Bytes Reallocated And "<<p.size-1<<" Bytes Freed."<<endl; ? strcpy(p1,sptr);//p1是換杯子? ? sptr=new char [size+p.size+1];//創(chuàng)建新的大空間? ? strcpy(sptr,p1); ? strcat(sptr,p.sptr); ?? ?}? };
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)統(tǒng)計(jì)字符串單詞數(shù)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)統(tǒng)計(jì)字符串單詞數(shù),代碼非常的簡(jiǎn)潔,有需要的小伙伴快來參考下。2015-03-03Qt基于TCP實(shí)現(xiàn)客戶端與服務(wù)端的連接
這篇文章主要為大家詳細(xì)介紹了Qt基于TCP實(shí)現(xiàn)客戶端與服務(wù)端的連接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C語(yǔ)言fprintf()函數(shù)和fscanf()函數(shù)的具體使用
本文主要介紹了C語(yǔ)言fprintf()函數(shù)和fscanf()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C++ 中字符串操作--寬窄字符轉(zhuǎn)換的實(shí)例詳解
這篇文章主要介紹了C++ 中字符串操作--寬窄字符轉(zhuǎn)換的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家實(shí)現(xiàn)這樣的功能更,需要的朋友可以參考下2017-09-09C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07