C++操作符重载:operator

1.重载

重载允许创建多个名称相同,但输入不同的函数,这些函数的参数列表不同,可以通过给予不同输入变量调用对应的函数。

函数重载的关键是函数的参数列表。如果两个函数的参数数量和类型相同,同时参数的排列顺序也相同,那么就是同一个函数,不构成重载,它与f返回值和变量名都无关。

void print(const char* str, int width);    //重载1
void print(int i, int width);              //重载2
void print(double d, int width);           //重载3
void print(long l, int width);             //重载4
void print(const char* str);               //重载5

但是,注意以下情况,C++允许对函数末尾的参数,设置初始值,如果出现这种情况,会导致找不到真正的函数实体,报出多个重载函数与参数列表匹配。

void print(const char* str, int width = 0);
void print(const char* str);

 2.operator关键字

C++中存在一种便携式的操作,可以将常用的操作符转化为函数,例如+-*/,通过函数的方式,让类的管理更加方便,具体实现方式为:operator符号

2.1.基本介绍

对于正常情况,一元运算符(具有一个输入)建议作为成员函数,二元运算符(具有二个输入)建议为友元函数。

::    ?    .    .*    sizeof 这些操作符不能重载

=    ()    []    -> 这些操作符不能作为友元重载

<< >> 这些操作符通常建议作为友元重载,否则无法实现流的连续调用。

2.2.= + - * / 重载

= + - * / 重载格式固定,都只能有一个参数,但类型和返回类型可以不确定。

class test {
public:
	test(int i = 0) :m_num(i) {};
	const test& operator+(int i) {
		m_num += i;
		return *this;
	}
    const test& operator+(const test& other) {    //可以使用不同输入
		m_num += other.m_num;
		return *this;
	}
	const test& operator-(int i) {
		m_num -= i;
		return *this;
	}
	const test& operator*(int i) {
		m_num *= i;
		return *this;
	}
	const test& operator/(int i) {
		m_num /= i;
		return *this;
	}
	const test& operator=(const test& other) {
		m_num = other.m_num;
		return *this;
	}
private:
	int m_num;
};
int main() {
	test t(1);
	t = t + 1;	// 1+1=2
	t = t - 3;	// 2-3=-1
	t = t * 4;  // -1*4=-4
	t = t / 2;  // -4/2=-2
	cout << t.getnum() << endl;
	return 0;
}

2.3.++ -- ! 重载

++和--操作符重载,如果存在参数,代表后++,如果没有参数,代表前++。

! 操作符无法加输入。

class test {
public:
	test(int i = 0) :m_num(i) {};
	const test& operator++() {    //前++
		++m_num;
		return *this;
	}
	const test& operator++(int) {    //后++
		m_num++;
		return *this;
	}
	const test& operator--() {    //前--
		--m_num;
		return *this;
	}
    const test& operator--(int) {    //后+--
		m_num--;
		return *this;
	}
    bool operator!() {
		return true;
	}
private:
	int m_num;
};
int main() {
	test t(1);
	t++;
	++t;
    t--;
    --t;
    !t;
	return 0;
}

2.4.() [] 重载

() [] 操作符可以增加任意输入,均可以实现重载。

class test {
public:
	test(int i = 0){
		for (int j = 0; j < 10; j++) {
			m_num[j] = i+j;
		}
	};
	int operator[](int i) {
		return m_num[i];
	}
	int operator()(int i) {
		return m_num[i];
	}
	int operator()(int i,int j) {
		return m_num[i]+ m_num[j];
	}
private:
	int m_num[10];
};
int main() {
	test t(0);
	cout << t[1] << endl;
	cout << t(5) << endl;
	cout << t(5,6) << endl;
	return 0;
}

2.5.<< >> 重载

<< >> 操作的目的是,直接调用当前类,来持续的往流上输入,或者持续的从流中输出,为了保证多个流运算符的连接使用,必须使用友元的方式进行重载,并将流作为返回值。

class test {
public:
	test(int i = 0) : m_num(i) {};
	friend ostream& operator<<(ostream& os, const test& t);
	friend istream& operator>>(istream& is, test& t);
private:
	int m_num;
};
ostream& operator<<(ostream& os, const test& t) {
	os << t.m_num;
	return os;
}
istream& operator>>(istream& is, test& t) {
	int i;
	cin >> i;
	t.m_num = i;
	return is;
}
int main() {
	test t1(10);
	test t2(2);
	cout << t1 << t2;
	cin >> t1 >> t2;
	return 0;
}

2.6.-> 指针重载

-> 不允许带输入,也可以不输出指针。

class base {
public:
	void print() {
		cout << "base" << endl;
	}
};

class test {
public:
	base* operator->() {
		return m_base;
	}
private:
	base* m_base;
};
int main() {
	test t1;
	t1->print();
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值