c++之重载运算符(一)

什么是重载

重载是指相同的名称或者符号具有不同的意义,重载只是改变了他原本的内涵,与外界的关系保持不变(例如:运算符的优先级,一元或者多元的等级)

注意:成员选择符(.),成员对象选择符(.*),域解析操作符(::),条件操作符(?:)是不能重载的

重载操作符的好处在于使程序简洁,效率提高,被封装起来安全性更好

class Complex
{
public:
	Complex();
	Complex(double );
	Complex(double ,double);
	void write() const;
	Complex operator+(const Complex&) const;
	Complex operator-(const Complex&) const;
	Complex operator*(const Complex&) const;
	//Complex operator/(const Complex&) const;
private:
	double real;
	double imag;
};

前面三个函数为构造函数:1、默认构造函数(一般情况下系统自动设置),2、构造函数在这里都是起到赋初始值的作用

Complex operator+(const Complex&) const;

这里存在两个const关键字,第一个const保证第二个参数在过程中保持不变 ,第二个const是保证第一个参数在过程中保持不变


Complex Complex::operator+(const Complex& u) const
{
	Complex x(real + u.real, imag + u.imag);
	return x;
}
Complex Complex::operator-(const Complex& u) const
{
	Complex x(real - u.real, imag - u.imag);
	return x;
}
Complex Complex::operator*(const Complex& u)const
{
	Complex v(real*u.real + imag*u.imag, imag*u.real - real*u.imag);
	return v;
}


<think>好的,我需要回答用户关于C++运算符重载的使用与示例的问题。首先,我需要回忆运算符重载的基本概念和相关规则。根据用户提供的引用内容,运算符重载允许用户自定义数据类型使用C++内置的运算符,比如关系运算符、算术运算符等。引文[^2]提到,重载运算符可以使操作更自然直观,这是关键点之。 接下来,我应该确定回答的结构。用户希望了解如何实现和使用重载运算符,所以需要分步骤说明,可能包括基本语法、注意事项以及示例代码。根据引用[^3],C++编译器会为类生成默认的拷贝构造函数和赋值运算符,但用户可能需要自定义这些运算符。 我需要先解释运算符重载的基本语法,包括成员函数和友元函数两种方式。比如,重载+运算符作为成员函数时,参数数量比非成员少个,因为隐含了this指针。同时,要注意不能创建新的运算符,只能重载已有的,并且不能改变运算符的优先级和结合性,这些是重要的注意事项,引文中有提到。 然后,给出几个常见的运算符重载示例。比如算术运算符+,关系运算符==,输入输出运算符>>和<<,以及赋值运算符=。每个示例需要展示代码,并解释其作用。比如,在Vector类中重载+运算符,实现向量相加;重载==来比较两个对象是否相等。引用[^1]提到关系运算符重载,可以用于比较类的对象,这需要体现在示例中。 另外,输入输出运算符通常需要重载为友元函数,因为它们的左操作数是流对象,而不是类的实例。引文[^2]中的示例部分应该包含这样的例子,所以需要确保代码正确,比如使用友元函数来重载<<和>>。 在注意事项部分,需要提到哪些运算符不能被重载,比如.和::,以及不能改变运算符的优先级。同时,要强调保持运算符的语义致性,避免让+运算符执行减法的操作,这会让代码难以理解。 最后,生成相关问题,可能涉及运算符重载的应用场景、与内置类型的区别、深拷贝与浅拷贝的问题,以及如何实现特定运算符如自增或下标运算符。这些问题可以帮助用户进步学习相关内容。 现在,我需要将这些内容组织成结构清晰的回答,使用用户要求的格式,确保所有数学表达式用$...$,独立公式用$$...$$,并正确引用提供的参考文献。同时,确保代码示例正确,符合C++语法,并解释每个示例的作用和结果。</think>### C++运算符重载使用与示例 #### 、基本概念 运算符重载允许用户为自定义数据类型定义运算符的行为,使其像内置类型样直观操作。例如,对`Vector`类重载`+`运算符实现向量加法: $$ \vec{v_1} + \vec{v_2} = (x_1+x_2, y_1+y_2) $$ #### 二、实现步骤 1. **语法形式** - **成员函数重载** ```cpp ReturnType operator运算符(参数) { ... } ``` - **全局函数重载(需声明为友元)** ```cpp friend ReturnType operator运算符(参数1, 参数2) { ... } ``` 2. **核心规则** - 只能重载C++已有的运算符(如`+`, `==`, `<<`),不能创建新符号 - 至少个操作数为用户定义类型 - 不改变运算符的优先级和结合性 --- #### 三、常用示例 1. **算术运算符重载(`+`)** ```cpp class Vector { public: Vector operator+(const Vector& v) { return Vector(x + v.x, y + v.y); } private: double x, y; }; ``` - 使用:`Vector v3 = v1 + v2;` 2. **关系运算符重载(`==`)** ```cpp bool operator==(const Student& s1, const Student& s2) { return s1.id == s2.id; } ``` - 使用:`if (stu1 == stu2) ...` 3. **输入/输出运算符重载(`<<`, `>>`)** ```cpp friend ostream& operator<<(ostream& os, const Point& p) { os << "(" << p.x << "," << p.y << ")"; return os; } ``` - 使用:`cout << point;` 输出格式:`(3,5)` 4. **赋值运算符重载(`=`)** ```cpp Array& operator=(const Array& other) { if (this != &other) { // 防止自赋值 delete[] data; // 释放原有资源 data = new int[other.size]; size = other.size; std::copy(other.data, other.data + size, data); } return *this; } ``` - 必须返回引用以实现链式赋值:`a = b = c;` --- #### 四、注意事项 1. **不可重载运算符** `.`(成员访问符)、`::`(作用域解析符)、`?:`(条件运算符)等 2. **保持语义致性** 重载运算符应保持原有含义(例如`+`不应实现减法逻辑) 3. **特殊运算符要求** - 赋值运算符`=`、下标运算符`[]`、函数调用运算符`()`必须定义为成员函数 - 流运算符`<<`/`>>`必须定义为友元全局函数 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值