C++ 运算符重载--看传智播客视频的学习笔记

假如想象 提交于 2020-01-04 03:21:04

运算符重载使得用户自定义的数据以一种更简洁的方式工作。

让自定义数据类型有机会进行运算符操作 ----------运算符重载机制

运算符重载本质是一种函数,还是调用函数

 

运算符重载的规则

(1)不能发明新的运算符

(2)不能改变运算符的操作对象个数

(3)运算符重载后 其优先性和结合性不会变

(4)不能重载的运算符

                作用域解析运算符 ::

                条件运算符 ?:

                直接成员访问运算符 .

                类成员指针引用的运算符 .*

                还有一个 sizeof

(5)除了流运算符是由友元函数重载,其他的运算法最好在类的成员函数中使用

运算符重载的格式

函数返回类型 operator 运算符 (参数表);

 

实现运算符重载的两种方法

(1)类的成员函数

(2)友元函数

注意: 成员函数有this指针,友元函数没有this指针

成员函数运算符重载

class Test
{
public:
	Test(){}
	Test(int a, int b)
	{
		this->a = a;
		this->b = b;
	}
    void GET()
	{
		cout<<"=============="<<endl;
		cout<<"a = "<<a<<endl;
		cout<<"b = "<<b<<endl;
		cout<<"=============="<<endl;
	}


    //实现二元运算符重载
    //成员函数重载时,函数的参数列表只需要一个形参即可
    //另一个参数是类的成员变量,用this指针表示
	Test operator+(Test &obj)  
	{
		Test tmp;
		tmp.a= this->a + obj.a; //使用的使用两个元都在
		tmp.b= this->b + obj.b;
		return tmp;
	}


    //实现一元运算符重载    前置--   就是a--; 
    //参数用this指针表示所以就看起来没有参数
    Test & operator--()
	{
		Test tmp;
		tmp.a = this->a--;
		tmp.b = this->b--;
		return tmp;
	}


    //当然还有后置的--
    //int是占位符,只是C++编译器为了区分前置++ 和 后置++重载函数的标志
    //因为函数重载是不care返回值的只care参数的顺序、个数、类型
    Test  operator--(int) 
    {
		Test tmp;
		tmp.a = this->--a;
		tmp.b = this->--a;
		return tmp;
    }


    //重载等号操作符  其实这个是比较常用的  
    //重载=运算符  =运算符应该有两个操作数的 this是一个 t是一个
    //注意深拷贝和浅拷贝的问题
	Test& operator=(Test & t)    
	{
        this->a = t.a;
        this->b = t.b;
		if(this->ch_ != NULL)    //先判断一下要被赋值的变量是不是空的,也就是清除空间
		{
			this->ch_ = NULL;
		}
		this->ch_ = new char[strlen(t.ch_)+1];  //注意空间要加1
		strcpy(ch_,t.ch_);
		return *this;            //注意返回值
	}



private:	 
     int a;
	 int b;
     char * ch;
};

int main()
{


}

 

用友元函数重载<< >>运算符

//注意 <<  >>  运算符是二元操作符    比如 cout <<  a   cout和a是操作数 

#include <iostream>
using namespace std;
class Test
{
    public:
    	Test(int m,int n):a(m),b(n)
    	{
    	}
    friend ostream& operator<<(ostream &out,Test&tmp);
    private:
    	int a;
    	int b;
};

//友元函数
//函数有返回值可以实现链式编程
/*为什么要有返回值呢   
  void operator<<(ostream &out,Test &tmp)不可以吗  
  其实也是可以的,只不过不能实现链式编程了  cout << t1 <<"12345";   
  当函数没有返回值  执行完cout << t1 后返回的是 void  但是 void.operator<<("12345") 是错误的
  应该是 ostream.operator<<("12345")才可以 ,所以应该返回 ostream*/
ostream & operator<<(ostream &out,Test &tmp) 
{
	out<<tmp.a<<endl;
	out<<tmp.b<<endl;
	return out;
}

int main()
{
	Test t1(1,2);
	cout<<"hello world"<<endl;
	cout<<t1<<endl;
	return 0;
}



 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!