生活随笔
收集整理的這篇文章主要介紹了
C++(18)--复制构造函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
復制構造函數
《老九學堂C++課程》《C++ primer》學習筆記。《老九學堂C++課程》詳情請到B站搜索《老九零基礎學編程C++入門》
-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------
包裝基本類,封裝一些算法。
需求說明:自定義String類,以簡化字符串的操作。
#include <iostream>
#include "MyString.h"
using namespace std
;
void TestString(){String
str1("abc");String
str2(str1
); cout
<< str1
<< endl
;cout
<< str2
<< endl
;cout
<< "對象之間的賦值"<< endl
;str1
= str2
; cout
<< str1
<< endl
;cout
<< str2
<< endl
;
}
int main() {TestString();return 0;
}
#ifndef CHAPTER12_MYSTRING_H
#define CHAPTER12_MYSTRING_H
#include <iostream>
#include <cstring>using namespace std
;class String {
public:String();String(char * str
);String(const String
& str
); ~String();friend ostream
& operator<<(ostream
& out
, const String
& str
);const String
& operator=(const String
& str
);
private:int m_length
; char * m_value
; };#endif
#include "MyString.h"
String
::String() :m_length(0)
{this->m_value
= new char[m_length
+ 1];this->m_value
[0] = '\0';
}
String
::String(char * str
) {if(NULL == str
){this->m_value
= new char[m_length
+ 1];this->m_value
[0] = '\0';return;}m_length
= strlen(str
); m_value
= new char[m_length
+ 1];strcpy(m_value
, str
);
}
String
::String(const String
& str
){m_length
= str
.m_length
;m_value
= new char[m_length
+ 1];strcpy(m_value
, str
.m_value
);
}
ostream
& operator<<(ostream
& out
, const String
& str
)
{out
<< str
.m_value
<<"\n";out
<< "m_value的長度:" << str
.m_length
;return out
;
}
const String
& String
::operator=(const String
& str
){if(this == &str
) return *this;delete[] m_value
; m_length
= str
.m_length
;m_value
= new char[m_length
+ 1];strcpy(m_value
, str
.m_value
);return *this;
}
String
::~String()
{delete[] m_value
;
}
情況1:不重載運算符,對象str1的內容直接復制到新對象str2中,對于沒有指針的簡單類來說,這就足夠了。當成員包含指針時,逐字節的復制將會把指針從一個對象復制給另一個對象,兩個指針就指向同一個內存
解決方案:重載賦值運算符號
String str1
= "愛吃新紅柿";
String str2
;
str2
= str1
;
情況2:使用一個類對象去初始化另一個對象,也會出現兩個指針指向同一塊內存地址的問題。
解決方案:復制構造函數(以對象為引用為參數的構造函數)
xxx::xxx(xxx & xxxptr);
xxx::xxx(const xxx & xxxptr); // const 保證復制過程中不會改變被復制對象
String
str1("愛吃新紅柿");
String
str2(str1
);
str2
= str1
;
需要使用復制構造函數的三種情況
當類對象被初始化為同一類的另一個對象時當對象被作為參數傳遞給一個函數時當函數返回一個對象時
String str
= "abc";
test(str
);
viod
test(String str
){}
String
test(String str
){ String str1
= "abc";return str1
;
}
總結
以上是生活随笔為你收集整理的C++(18)--复制构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。