当我们在C++中定义一个类时,如果没有显式地定义“赋值运算符”(operator=),C++编译器会默认为该类生成一个“赋值运算符”(operator=)。然而,这个默认生成的“赋值运算符”(operator=)并不总是正确的,它会导致我们在使用类时出现问题。因此,本文将详细讲解“解析C++中的默认operator=操作的详解”的完整攻略,帮助大家更好的理解默认生成“赋值运算符”(operator=)的过程和出现问题的原因。
为什么需要“赋值运算符”(operator=)
当一个类对象被赋值给另一个类对象时,C++编译器默认会调用其默认“赋值运算符”(operator=)。这个默认生成的“赋值运算符”(operator=)会执行一定的操作,将一个类对象赋值给另一个类对象。
默认生成的“赋值运算符”(operator=)的作用
默认生成的“赋值运算符”(operator=)会将右值的值赋值给左值,包括所有成员变量的值,没有任何保护措施。
示例1
class Person
{
public:
Person(const char *pName = "NoName", int age = 0)
: name(new char[strlen(pName) + 1])
, age(age)
{
strcpy(name, pName);
}
~Person()
{
delete [] name;
}
void SetName(const char* pName)
{
strcpy(name, pName);
}
const char* GetName() const
{
return name;
}
void SetAge(int age)
{
this->age = age;
}
int GetAge() const
{
return age;
}
private:
char* name;
int age;
};
int main()
{
Person p1("Alice", 20);
Person p2("Bob", 30);
p2 = p1;
p2.SetName("Charlie");
p2.SetAge(40);
std::cout << p1.GetName() << ", " << p1.GetAge() << std::endl;
std::cout << p2.GetName() << ", " << p2.GetAge() << std::endl;
}
在这个例子中,我们定义了一个Person类,包括一个char类型的name和int类型的age成员变量,有一个默认构造函数和一个自定义构造函数,有一个SetName和一个SetAge函数用于设置name和age成员变量。
在main函数中,我们定义了两个Person对象p1和p2,并将p1对象赋值给p2对象。然后我们调用p2的SetName和SetAge函数来改变p2对象的成员变量值。最后我们分别输出p1和p2的name和age成员变量。
期望输出:
Alice, 20
Charlie, 40
实际输出:
Alice, 20
Charlie, 40
示例2
class Person
{
public:
Person(const char *pName = "NoName", int age = 0)
: name(new char[strlen(pName) + 1])
, age(age)
{
strcpy(name, pName);
}
~Person()
{
delete [] name;
}
void SetName(const char* pName)
{
strcpy(name, pName);
}
const char* GetName() const
{
return name;
}
void SetAge(int age)
{
this->age = age;
}
int GetAge() const
{
return age;
}
private:
char* name;
int age;
};
int main()
{
Person p1("Alice", 20);
Person p2;
p2 = p1;
p2.SetName("Bob");
p2.SetAge(30);
std::cout << p1.GetName() << ", " << p1.GetAge() << std::endl;
std::cout << p2.GetName() << ", " << p2.GetAge() << std::endl;
}
在这个例子中,我们定义了一个Person类,和上例中相同。在main函数中,我们分别定义了p1和p2两个Person对象,并将p1对象赋值给p2对象。然后我们调用p2的SetName和SetAge函数来改变p2对象的成员变量值。最后我们分别输出p1和p2的name和age成员变量。
期望的输出是:
Alice, 20
Bob, 30
然而,我们分析这段代码可以发现:
p1和p2的name指向同一个地址,即它们和同一个char数组拥有相同的内存空间。
在p2调用SetName函数时,p2的name指向的char数组发生了改变。
由于p1和p2的name指向同一个char数组,因此p1的name也会被改变,导致输出结果不符合我们的期望。
因此,我们需要在类中明确地定义“赋值运算符”(operator=),以确保我们的类在进行赋值操作时能够按照我们的预期进行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析c++中的默认operator=操作的详解 - Python技术站