簡體   English   中英

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM