gpt4 book ai didi

c++ - 对象的赋值运算符

转载 作者:太空宇宙 更新时间:2023-11-04 14:55:35 25 4
gpt4 key购买 nike

我写了一个代码,用于动态分配一个名字。我知道在这种情况下我应该处理深层复制。我写的是我自己版本的复制构造函数、复制赋值运算符和析构函数。我是否应该重新定义任何其他隐式函数,例如 Move Assignment Operator 。我不清楚移动赋值运算符的概念或任何其他隐式定义的成员函数(除了我已经提到的)。 任何人都可以添加此 dynName 代码 的代码,以显示 Move 赋值运算符或任何其他隐式成员函数(如果有)。

#include <iostream>

using namespace std;

class dynName{
char* name;
int size;
public:

dynName(char* name="")
{
int n=strlen(name)+1;
this->name= new char[n];
strncpy(this->name,name,n);
size=n;
name[size-1]='\0';//NULL terminated
cout << "Object created (Constructor) with name : "
<< name << " at address " << &(this->name) << endl;
}

dynName(const dynName& Ob)//Copy Constructor
{
int n=Ob.size;
this->name= new char[n];
strncpy(this->name,Ob.name,n);
size=n;
cout << "Object created(Copy constructor) with name : "
<< this->name << " at address " << &(this->name) << endl;
}

//Assignment Operator
dynName& operator=(const dynName& ob);

~dynName()
{
cout << "Object with name " << this->name << " at address " <<
&(this->name)<<" destroyed" << endl;
delete[] name;
name=0; //Avoiding Dangling pointer if any
}
//friend ostream& operator << (ostream& os,const dynName ob);
//Will Call Copy Constructor

friend ostream& operator << (ostream& os,const dynName& ob);
};

dynName& dynName::operator=(const dynName& ob)
{
// check for self-assignment
if (this == &ob)
cout << "Created with assignment Operator " << endl;
return *this;

// first we need to deallocate any value that this string is holding!
delete[] this->name;


this->size = ob.size;

// this->name = new char[this->size];
strncpy(this->name, ob.name,this->size);
cout << "Created with assignment Operator " << endl;

return *this;
}

//ostream& operator << (ostream& os,const dynName ob)
ostream& operator << (ostream& os,const dynName& ob)
{
os << "The name ("<< ob.size << " Letters) : " << ob.name << endl;
return os;
}

int main()
{

dynName Ob1("Andrew Thomas");
dynName Ob2;
dynName Ob3(Ob1);
dynName Ob4;
Ob4=Ob1;//Should Call Assignment Operator
cout << "\n\n\n";
cout << Ob1;
cout << Ob2;
cout << Ob3;
cout << Ob4;
cout << "\n\n\n";

return 0;
}

此代码的问题是它没有调用我的复制赋值运算符。任何帮助,为什么这样?

$./试用

Object created (Constructor) with name : Andrew Thomas at address 0x22ac40
Object created (Constructor) with name : at address 0x22ac30
Object created(Copy constructor) with name : Andrew Thomas at address 0x22ac20
Object created (Constructor) with name : at address 0x22ac10



The name (14 Letters) : Andrew Thomas
The name (1 Letters) :
The name (14 Letters) : Andrew Thomas
The name (1 Letters) :



Object with name at address 0x22ac10 destroyed
Object with name Andrew Thomas at address 0x22ac20 destroyed
Object with name at address 0x22ac30 destroyed
Object with name Andrew Thomas at address 0x22ac40 destroyed

谢谢

编辑

引用Move assignment operator and `if (this != &rhs)`什么是 Class&& ?我的意思是我从来没有用过这种东西..只是引用,即 Class&

最佳答案

看来你这里缺少牙套:

   if (this == &ob)
cout << "Created with assignment Operator " << endl;
return *this;

只有输出是 if 主体的一部分,return 语句将始终执行。

关于c++ - 对象的赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16418992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com