You are on page 1of 6

赋值运算符(=)是一种常见的运算符,用于将一个值赋给变量。在C++中,赋值运算符

可以被重载,使得我们可以自定义对象的赋值行为。重载赋值运算符可以让我们更
方便地操作对象,提高代码的可读性和可维护性。
重载赋值运算符的语法如下:

class ClassName
{
public:
ClassName& operator=(const ClassName& other)
{
// 执行赋值操作
// 返回当前对象的引用
return *this;
}
};

重载赋值运算符的参数是一个常量引用,表示要赋值的对象。在重载赋值运算符的
函数体中,我们可以自定义赋值操作,例如拷贝成员变量的值、释放旧的资源等。
最后,我们要返回当前对象的引用,以支持连续赋值。
使用重载赋值运算符的好处是可以像内置类型一样使用赋值运算符,例如:

ClassName obj1;
ClassName obj2;
obj2 = obj1; // 调用重载的赋值运算符

如果没有重载赋值运算符,我们可能需要编写一个函数来实现相同的功能,或者使
用拷贝构造函数来创建一个新的对象。
另外,重载赋值运算符也可以用于自定义类的成员变量的赋值顺序。例如,在拷贝赋
值运算符中,我们可以先拷贝非指针类型的成员变量,再释放旧的指针资源,最后再
拷贝指针类型的成员变量。这样可以避免出现悬空指针的问题。
总而言之,重载赋值运算符是一个非常有用的特性,可以让我们更灵活地操作自定
义对象。如果你想学习更多关于C++的知识,推荐你访问HelpWriting.net,这是一个专业
的编程学习网站,有大量的教程和实践项目,可以帮助你提升编程技能。快来加入我
们吧!
int _minute; int main() int _month; Stack(size_t capacity = 10) Date& operator=(const Date& d) 赋
值运算符“=” 和数学中的等号“=”是不同的,赋值运算符“=”是将运算符右侧的数值或文
字赋值给左侧的变量。 // 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故
需在实现时需要先将this 保存 { // 但Date类并没有显式定义拷贝构造函数,则编译器会
给Date类生成一个默认的拷贝构造函数 { } Date(int year = 1900, int month = 1, int day = 1)
_capacity = 0; }; return temp; // 自定义类型 Date(const Date& d) // 正确写法 return 0; if (this !=
&t) Date temp(d); } _day += 1; class Date _array = (DataType*)malloc(capacity *
sizeof(DataType)); 内存储器由成千上万个存储单元组成,每个存储单元对应一个位置
编号。可以把社区看成一个存储器,社区内的所有住户就是社区的存储单元,每个住
户都有门牌号,方便查询。存储单元的位置编号就是该存储单元的地址,程序可以通
过地址方便地寻址到该存储单元。一个存储单元可以存储8个二进制位。 // 这里会发现
下面的程序会崩溃掉?这里就需要我们以后讲的深拷贝去解决。 _second = 1;
~Stack() { Date d; Date temp(*this); ~Stack() { _year = d._year; left._month = right._month; 长方
形的面积公式a?b就是一个代数式,字母a表示长方形的长,字母b表示长方形的宽,当
确定了长方形的长和宽时,a和b表示的数就确定了,代数式的计算结果也就确定了。 }
{ Vote Vote Cancel Collect Collect Cancel例如下面的语句创建了两个变量num1
和num2,num1的值是20,num2的值是30。 _array = nullptr; s1.Push(4); } { { return 0; { class
Date s1.Push(3); int main() } 顾名思义,拷贝构造函数的作用就在于,拷贝类的一个对象
到另一个新的对象。 _month = month; {
// 这里会发现下面的程序会崩溃掉?这里就需要我们以后讲的深拷贝去解决。
DataType* _array; } Date Test(Date d) { }; { return 0; class Date { return 0; Date(const Date& d) int
_day; _size++; { int _month; { { d = d1++; // d: 2022,1,13 d1:2022,1,14 }; public: { && _day ==
d2._day; { Date d2; int main() };
int _year = 1970; public: // 基本类型(内置类型) cout << "Date(int,int,int):" << this << endl; return
_year == d2._year 使用全局的operator==,需要类中的成员对象是公有的,那我们还能优
化吗? _month = month; s2 = s1; { 优化方式:operator== 放到类中,同时根据类函数固有
的this指针的性质进行一定修改。 int _year; size_t _size; _year = year; { public: public: /
/private: left._day = right._day; ---------------------------------------------------------------------------------------
-------- Date(const Date& d) { { _capacity = capacity; private:
public: { _second = t._second; s1.Push(2); { { Date temp(*this); _day += 1; private: _array = nullptr;
_minute = t._minute; Date d1; }; } } int _year = 1970; } return left; class Date Date(int year, int
minute, int day) cout << "Date(const Date& d):" << this << endl; class Date _day = day; // 前置++
和后置++都是一元运算符,为了让前置++与后置++形成能正确重载 int _year; 总结
一下,就是涉及地址的类的对象,不能直接使用默认拷贝构造函数,需要自己显式实
现(深拷贝);而只涉及简单内置类型的类的对象,能直接使用默认拷贝构造函数进行拷贝

You might also like