设为首页 加入收藏

TOP

9-操作符重载
2015-07-20 17:34:01 来源: 作者: 【 】 浏览:1
Tags:操作 重载

一.运算符重载---为运算符提供不同的语义

struct Complex
		{
			int a;
			int b;
		};
		Complex c1={1,2};
		Complex c2={4,5};

如果想对c1,c2直接相加c1+c2,C语言中直接的方法就是用函数实现。

C++中用运算符重载来实现c1+c2;

C++中运算符重载的本质:

*: C++中通过operator关键字扩展操作符

*: operator的本质是通过函数重载实现操作的



Complex operator+ (const Complex& c1,const Complex& c2)
	{
		Complex ret={0,0};
		ret.a =c1.a+c2.a;
		ret.b =c1.b+c2.b;
		return ret;
	}


operator+ (c1,c2) <==> c1+c2


二.C++中的友元

*:private 声明使得类的成员不能被外界访问

*:通过 friend 关键字可以获得类外访问类的权限

(1)<<重载左移操作符

ostream operator<<(ostream& out,const Complex& c)
{
	out<
  
   

(2)operator+ 的成员函数重载

Complex Complex::operator+ (const Complex& c)
{
	Complex ret;
	ret.a = a+c.a;
	ret.b = b+c.b;
	return ret;
}


三. 用成员函数重载和用全局函数重载比较

使用成员函数重载:

     *:相比使用全局函数重载操作符(friend),少一个参数,
*:不需要使用friend关键字


如何选择使用全局函数重载和成员函数重载操作符

*:当无法修改作参数的类时,使用全局函数进行重载

如:friend ostream operator<<(ostream out,const Complex& c);

*;=,[],-> 操作符只能通过成员函数进行重载。

(3)[] 的重载

int& Array::operator[](int i)
{
    return mSpace[i];
}

(4)= 的重载

Array& Array::operator= (const Array& obj)
{
	delete[] _space;
	_length = obj._length;
	_space = new int[_length];
	for(int i=0;i<_length;++i)
		_space[i] = obj._space[i];
	return  *this;
}

(5)== 的重载

bool Array::operator==(const Array& obj)

注意:

(1) C++编译器会为每个类提供默认的赋值操作符

(2)默认的赋值操作符只是简单的值复制

(3)当类中存在指针成员变量时(如字符串类)时,就需要重载赋值操作符

四.++操作符的重载

(1)++操作符只有一个参数

(2)++ 操作符有前缀和后缀之分

解决方案:

C++中通过一个占位参数来区分前缀操作符和后缀操作符的重载

(1) obj++ 的重载

Complex operator++(int ) // obj++
{  ///  int 的意义主要区分前缀和后缀 
	Complex ret = *this;
	a++;
	b++;
	return ret;
}

(2)++obj 的重载

Complex operator++() // ++obj
{
	++a;
	++b;
	return *this;
}

小结:
(1) 操作符重载的本质是函数重载,扩展操作符的语义

(2)friend 关键字可以使全局函数访问类,开发类的访问权限

(3)=,[],-> 操作符只能通过成员函数进行重载

(4) ++ 操作符通过一个int 参数进行区分前缀与后缀的重载







】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇poj - 1088 - 滑雪(dp) 下一篇HDOJ 2007 平方和与立方和

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)