[英]No operator “>>” for std::string>>std::string
[英]Define operator = with std::string
早上好! 我試圖為這樣的類定義賦值運算符:
Person {
string name;int age;
Person(string name,int age);
}
我知道如果name是char *,我首先要刪除name的先前版本,將其設置為NULL並分配一個新的char數組。 現在我已經有了琴弦,那該怎么辦?
我想寫這樣的東西:
Person(const Person& copy){
this->name=copy.name;
this->age=copy.age; }
但這不起作用。 我試圖刪除字符串名稱,但是編譯器給我一個錯誤。 問題出在哪兒? 謝謝!
這個:
Person(const Person& copy){
是一個復制構造函數,如果要使用賦值運算符,則使用;
Person& operator=(const Person& rop) {
name=rop.name;
age=rop.age;
return *this;
}
但是,如果該類未定義一個編譯器,則該編譯器將合成一個復制分配運算符-同樣適用於復制構造函數。 因此,我不清楚您的問題在哪里。
沒錯,如果您有一個char*
,它是從動態分配中分配的緩沖區,那么您必須自己(或使用智能指針)管理其生命周期。 但是對於std :: string或任何其他使用RAII慣用語的類,您使用的是所謂的零規則 ,因此無需擔心編寫代碼來制作副本。
那不是賦值運算符。 相反,它是一個復制構造函數。 您可以這樣定義“復制”分配運算符:
Person& operator = (const Person& other)
{
name= other.name;
age= other.age;
return *this;
}
我知道如果name將是一個char *,我首先要刪除name的先前版本,將其設置為NULL並分配一個新的char數組
假設類“擁有”了指向數組,那是正確的。
現在我已經有了琴弦,那該怎么辦?
在復制分配運算符中,您將需要像對int一樣復制分配成員字符串。
這正是隱式的,由編譯器生成的副本賦值運算符所做的事情,因此您根本不需要聲明自己。
我想寫這樣的東西:
Person(const Person& copy)
那是一個拷貝構造函數。 您不需要聲明任何一個,因為隱式生成的代碼完全可以滿足您的要求。
但是編譯器給我一個錯誤。 問題出在哪兒?
問題將出現在錯誤消息指示的位置。
TL; DR完全不需要添加自定義副本分配,也不需要復制構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.