gpt4 book ai didi

c++ - 使用复制构造函数进行 = 重载

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

我有一个包含两个 vector 的类:intStr。现在我想定义一个复制构造函数,使元素的顺序颠倒;例如如果 a=(1,Hello),(2,World) 并且我写 auto b=a; 我得到 b=(2,world),( 1,你好)。这是完美的工作。我遇到的问题是重载 = 运算符,以便使用复制构造函数。这是我的类加上复制构造函数:

class grade
{
private:
static int copies;
std::vector<int> i;
std::vector<std::string> s;

public:
grade() {copies++;};
grade (int , std::string );
void printval();
void adder(int , std::string );
int getcount();

grade(grade & obj)
{
std::vector<std::string>::reverse_iterator strIt = obj.s.rbegin();
for (std::vector<int>::reverse_iterator numIt=obj.i.rbegin();
numIt!=obj.i.rend(); ++numIt)
{
this->adder(*numIt, *strIt);
strIt++;
}

}
grade operator =(grade );
};

当我重载 = 运算符时,构造函数被调用,问题是 valur 没有传递给 LHS 变量。这是重载的 =

grade grade::operator=(grade cpy)
{
grade newer = cpy; //Calls the copy constructor as expected
return cpy; //No error but blank value is returned to the LHS variable.
}

我的主要功能是:

int main()
{
grade c2(1,"Hello");
grade c1;

c2.adder(4,"World");
c2.printval();
std::cout<<std::endl;
grade c3 = c2;
c3.printval();
std::cout<<std::endl;
c1 = c2;
std::cout<<std::endl;
c1.printval();

return 0;
}

为什么 c1 保持空白??

最佳答案

实现赋值运算符的最简单方法是 copy and swap idiom :

grade& operator=( grade other )
{
swap( *this , other );
return *this;
}

其中 swap 是一个接受两个 grade 并交换其值的函数:

void swap( grade& lhs , grade& rhs )
{
using std::swap;

swap( lhs.first_member , rhs.first_member );
swap( lhs.second_member , rhs.second_member );
swap( lhs.third_member , rhs.third_member );
...
}

请注意,swap()std::swap() 的重载/特化。 std::swap() 默认使用赋值运算符执行交换,因此如果您使用它,则会导致无限递归。您需要做的是编写您自己的交换重载,它执行成员之间的交换(如上例所示)。

请注意,您应该使用非限定的 swap() 来不禁用 ADL,并让编译器找到成员的自定义 swap() 重载(如果他们提供了一个) 或标准库版本。

关于c++ - 使用复制构造函数进行 = 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21614491/

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