C++基础5 运算符重载【提高】

1)括号运算符()重载

2)【面试题】&&, || 能不能做 操作符重载?

3)运算符极致练习:

【提高】运算符重载

括号运算符()重载

[email protected]:~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
class A
{
public:
	A(int a,int b)
	{
		this->a = a;
		this->b = b;
	}
	int operator()(int a,int b)
	{
		return a + b + this->a  + this->b;
	}
	int  a;
	int  b;
};

int main()
{
	A a1(1,2);
	cout << a1(2,1) << endl;
	return 0;
}
[email protected]:~/c++$ g++ -Wall -g -o run main.cpp && ./run 
6

【面试题】逻辑与 逻辑或能不能做 操作符重载?

答案:

可以。但是无论怎么样也无法实现短路功能!达不到逻辑与,或的运算效果

所以一般情况下不建议使用这个运算符重载

【注意】&&  || 结合性:自左向右

实现代码:[email protected]:~/c++$ cat main.cpp 
#include <iostream>
using namespace std;
class A
{
public:
	A(int a = 0)
	{
		this->a = a;
	}
	bool operator&&(A a)
	{
		cout << "&& 运算符重载 被调用\n";
		if(this->a &&  a.a)
		{
			return true;
		}
		return false;
	}
	bool operator||(A a)
	{
		cout << "|| 运算符重载 被调用\n";
		if(this->a || a.a )
		{
			return true;
		}
		return false;
	}
	A& operator+(A a)
	{
		cout << "+ 运算符重载 被调用\n";
		this->a += a.a;
		return *this;
	}
	int  a;
};

int main()
{
	A a1(1);	A a2(0);
	if(a1 && (a1 + a2) )
	{
		cout << "-----------------运算结果:与运算 true "<< endl;
	}
	else
	{
		cout << "-----------------运算结果:与运算 false "<< endl;
	}

	A a3(0);	A a4(0);
	if(a3 || (a3 + a4) )
	{
		cout << "-----------------运算结果:或运算 true "<< endl;
	}
	else
	{
		cout << "-----------------运算结果:或运算 false "<< endl;
	}

	return 0;
}
[email protected]:~/c++$ g++ -Wall -g -o run main.cpp && ./run 
+ 运算符重载 被调用
&& 运算符重载 被调用
-----------------运算结果:与运算 true 
+ 运算符重载 被调用
|| 运算符重载 被调用
-----------------运算结果:或运算 false 
[email protected]:~/c++$

运算符极致练习:

= 运算符重载,对象链式赋值

<< 运算符重载,对象字符内容链式输出

>>运算符重载,成员变量链式输入

==运算符重载,判断两个Str对象是否相同

!=运算符重载,判断两个Str对象是否不同

>=  > 运算符重载,判断两个Str对象大小

<=  < 运算符重载,判断两个Str对象大小

要满足的测试程序:

Str s1; s1.print();

Str s2("我的树莓派"); s2.print();

Str s3 = NULL; s3.print();

Str s4 = s2; s4.print();

Str s5 = "数据结构 + 算法 = 程序"; s5.print();

Str s6("2016  年的夏天不太热");

s6[4] = ‘?‘; s6.print();

cout << s6[4] << "\n";

cout << s6 << s6;

cin >> s3;

[email protected]:~$ cat main.cpp 
#include <iostream>
#include <string.h>
using namespace std;

class Str
{
	friend ostream& operator<<(ostream &put,Str &from);
	friend istream& operator>>(istream &in,Str &from);
public:
	Str(const char *p = NULL)
	{
		if(p == NULL)
		{
			this->p = NULL;
			this->len = 0;
		}
		else
		{
			this->len = strlen(p);
			this->p = new char[this->len +1 ];
			strncpy(this->p,p,this->len);
			this->p[this->len] = ‘\0‘;
		}
	}
	Str(const Str &from)
	{
		//cout << from.len << endl;
		this->len = from.len;
		this->p = new char[this->len +1];
		strncpy(this->p,from.p,this->len);
		this->p[this->len] = ‘\0‘;
	}
	~Str()
	{
		if(this->p != NULL)
		{
			delete [] this->p;
			this->p = NULL;
			this->len = 0;
		}
	}
	void print()
	{
		if(this->p != NULL)
		{
			cout <<  this->get_str() << endl;
		}
	}
	int get_len()
	{
		int n = this->len;
		return n;
	}
	char* get_str()
	{
		return this->p;
	}
	Str& operator=(char *p)
	{
		if(this->p != NULL)
		{
			delete []this->p;
		}
		if(p != NULL)
		{
			this->len = strlen(p);
			this->p = new char[this->len + 1];
			strncpy(this->p,p,this->len);
			this->p[this->len] = ‘\0‘;
		}
		else
		{
			this->p = NULL;
			this->len = 0;
		}
		return *this;
	}
	char& operator[](int i)
	{
		return this->p[i];
	}

private:
	int len;
	char *p;
};

istream& operator>>(istream &in,Str &from)
{
	in>>from.len;//如果这里是指针,运行会出错,建议完善一下
	return in;
}
ostream& operator<<(ostream &put,Str &from)
{
	put<< from.p << endl;
	return put;
}

int main()
{
	Str s1;				s1.print();
	Str s2("我的树莓派");		s2.print();
	Str s3 = NULL;			s3.print();
	Str s4 = s2;			s4.print();
	Str s5 = "数据结构 + 算法 = 程序";	s5.print();
	Str s6("2016  年的夏天不太热");
	s6[4] = ‘?‘;			s6.print();
	cout << s6[4] << "\n";
	cout << s6 << s6;
	cin >> s3;
	// ==运算符重载,判断两个Str对象是否相同
	// !=运算符重载,判断两个Str对象是否不同
	// >=  > 运算符重载,判断两个Str对象大小 
	// <=  < 运算符重载,判断两个Str对象大小 

	return 0;
}
[email protected]:~$ g++ -g  -o run main.cpp && ./run 
我的树莓派
我的树莓派
数据结构 + 算法 = 程序
2016? 年的夏天不太热
?
2016? 年的夏天不太热
2016? 年的夏天不太热
3
[email protected]:~$
时间: 2024-10-24 05:01:39

C++基础5 运算符重载【提高】的相关文章

C++_基础_运算符重载2

内容: (1)只能用成员形式重载的运算符 (2)new/delete操作符的重载 (3)封装和继承的初识 (4)继承的特性 (5)子类及其函数的特性 (6)多重继承和虚继承 1.只能用成员形式重载的运算符(1)[] 下标操作符 (2)() 函数操作符(3)* -> 间接操作符 2.new/delete操作符的重载 注意: 如果需要在调用构造函数之前做一些初始化工作/在调用析构函数之后做一些善后工作,则可以通过new/delete运算符重载的函数来实现 3.封装和继承的初识3.1 概念(1)封装

C++笔记(3):运算符重载

运算符重载 1.运算符重载基础 2.运算符重载的规则 3.重载双目运算符 4.重载单目运算符 5.重载流插入和提取运算符 6.类型转换 7.定义自己的string类 ------------------------------------------------------------------------------------------------------------------------------- 1.运算符重载基础 运算符重载就是对已有的运算符赋予新的含义,实现新的功能.前

[转]C++之运算符重载(1)

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 1 int i;2 int i1=10,i2=10;3 i=i1+i2;4 std::co

C++之运算符重载(1)

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 int i; int i1=10,i2=10; i=i1+i2; std::cout<<

c++运算符重载1

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 1 int i; 2 int i1=10,i2=10; 3 i=i1+i2; 4 std:

【C++基础 07】运算符重载

1.什么是运算符重载? 顾名思义,比如重载运算符 + - * / 等,改变这些符号原有的意义. C++提供了operator关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 2.两种实现 运算符的重载实现有两种形式: (1)重载为类的成员函数 <函数返回类型> operator <运算符>(<形参表>) { <函数体>; } (2)重载为类的友元函数 friend <函数返回类型> operato

c#语法基础(二)——运算符重载

c#允许用户定义的类型,通过使用operator关键字定义静态成员函数来重载运算符 下面来看一个例子: public class ComplexNumber { private int real; private int imaginary; //构造器 public ComplexNumber(int r, int i) { real = r; imaginary = i; } //重载ToString方法,用来显示ComplexNumber public override string To

Kotlin中复合赋值(+=,-=,……)运算符重载

本篇建立在已经了解了kotlin中运算符重载的理念以及如何实现的基础上. 来我们首先写一个简单的类,然后重载运算符+,+=,-,-=这个几个运算符.代码如下: data class Point(var x: Int, var y: Int) { operator fun plus(point: Point): Point { return Point(this.x + point.x, this.y + point.y) } operator fun plusAssign(point: Poin

C#中运算符重载

很多语言都允许程序员使用运算符重载,尽管从编程的角度看,这没有其必要性,但是对于代码来讲可以提高它的可读性,带来许多方便之处.最简单的例子就是,我们用String类的时候,用"+"运算符直接实现字符串的连接,很方便很直观. 运算符重载实例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; namespace impli