網站首頁 編程語言 正文
1.同一類中的對象1復制給對象2
同樣是Point p1; Point p2;
例如:
int main(){
Point p1(1,2);
Point p2=p1; ? //這兩種都會調用復制構造函數
Point p3(p1);
return 0;
}
2.以對象為函數的形參
例如:
void fun(Point p){ //p 作為了形參
?
cout<<p.height<<endl;
?
}
3.函數返回是類的對象
void fun2(){
Point p1(1,3);
return p1;
}
?
//或者還有返回*this的形式
?
void fun3(){
Point p2(5,8);
x+=4;
y+=6;
return *this;
}
注意:如果意外使用return *this;
導致調用的復制構造函數里面會輸出多余的語句(這些語句不可刪除)
那么我們應該 讓此函數的返回類型改為 void
例題如下(讓我記憶猶新)
?設計一個自己的字符串類MyString,內部有一個私有成員char *sptr;該成員用于創建字符串對象時,在內部使用動態內存分配的方法分配一個字符數組用于存儲字符串的內容。
- 為該類設計構造函數、析構函數(對象析構時,要釋放分配的數組)
- 為該類設計返回字符串實際長度的成員函數
- 為該類設計輸出字符串內容的成員函數
- 為該類設計實現字符串連接和字符串復制的成員函數。字符串連接和字符串復制時,要求重新分配數組,并釋放原有的數組。
main函數已經寫好,請根據main函數的內容完成該類的設計:
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;
}
正確解答如下:
//不包括主函數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];//創建新的大空間?
? strcpy(sptr,p1);
? strcat(sptr,p.sptr);
??
?}?
};
原文鏈接:https://blog.csdn.net/m0_67695275/article/details/124904449
相關推薦
- 2022-06-04 C#?XML基礎入門小結(XML文件內容增刪改查清)_C#教程
- 2022-08-27 python?中defaultdict()對字典進行初始化的用法介紹_python
- 2022-03-16 淺析ORB、SURF、SIFT特征點提取方法以及ICP匹配方法_C 語言
- 2023-02-12 redis如何清理緩存_Redis
- 2024-03-17 針對Tomcat部署項目,修改后臺代碼,前臺網頁無變化問題的解決方案(超詳細有效)
- 2022-10-07 C++函數指針與指針函數有哪些關系和區別_C 語言
- 2023-07-22 使用log4j2為日志增加代碼行號
- 2022-05-13 python list.sort()方法排序一探究竟
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支