C++中調(diào)用復制(拷貝)函數(shù)的三種情況總結(jié)
1.同一類中的對象1復制給對象2
同樣是Point p1; Point p2;
例如:
int main(){
Point p1(1,2);
Point p2=p1; ? //這兩種都會調(diào)用復制構(gòu)造函數(shù)
Point p3(p1);
return 0;
}2.以對象為函數(shù)的形參
例如:
void fun(Point p){ //p 作為了形參
?
cout<<p.height<<endl;
?
}3.函數(shù)返回是類的對象
void fun2(){
Point p1(1,3);
return p1;
}
?
//或者還有返回*this的形式
?
void fun3(){
Point p2(5,8);
x+=4;
y+=6;
return *this;
}注意:如果意外使用return *this;
導致調(diào)用的復制構(gòu)造函數(shù)里面會輸出多余的語句(這些語句不可刪除)
那么我們應該 讓此函數(shù)的返回類型改為 void
例題如下(讓我記憶猶新)
?設(shè)計一個自己的字符串類MyString,內(nèi)部有一個私有成員char *sptr;該成員用于創(chuàng)建字符串對象時,在內(nèi)部使用動態(tài)內(nèi)存分配的方法分配一個字符數(shù)組用于存儲字符串的內(nèi)容。
- 為該類設(shè)計構(gòu)造函數(shù)、析構(gòu)函數(shù)(對象析構(gòu)時,要釋放分配的數(shù)組)
- 為該類設(shè)計返回字符串實際長度的成員函數(shù)
- 為該類設(shè)計輸出字符串內(nèi)容的成員函數(shù)
- 為該類設(shè)計實現(xiàn)字符串連接和字符串復制的成員函數(shù)。字符串連接和字符串復制時,要求重新分配數(shù)組,并釋放原有的數(shù)組。
main函數(shù)已經(jīng)寫好,請根據(jù)main函數(shù)的內(nèi)容完成該類的設(shè)計:
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是對象?
? 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);
??
?}?
};以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實現(xiàn)統(tǒng)計字符串單詞數(shù)
這篇文章主要介紹了C語言實現(xiàn)統(tǒng)計字符串單詞數(shù),代碼非常的簡潔,有需要的小伙伴快來參考下。2015-03-03
C語言fprintf()函數(shù)和fscanf()函數(shù)的具體使用
本文主要介紹了C語言fprintf()函數(shù)和fscanf()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
C++ 中字符串操作--寬窄字符轉(zhuǎn)換的實例詳解
這篇文章主要介紹了C++ 中字符串操作--寬窄字符轉(zhuǎn)換的實例詳解的相關(guān)資料,希望通過本文能幫助到大家實現(xiàn)這樣的功能更,需要的朋友可以參考下2017-09-09
C++實現(xiàn)LeetCode(904.水果裝入果籃)
這篇文章主要介紹了C++實現(xiàn)LeetCode(904.水果裝入果籃),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

