c++运算符重载

对于单目运算符(以++运算符为例):

前置单目运算符的重载函数没有形参:void operator++()

后置单目运算符的重载函数有形参:void operator++(int)

#include<iostream>  
using namespace std;  
  
class A{  
private:  
    int x,y;  
public:  
    A(int a,int b):x(a),y(b){}  
  
    // 前置单目运算符重载  
    A& operator++() // 返回对对象的引用  
    {  
        x+=1;  
        y+=1;  
        return *this; // 返回当前对象的引用  
    }   
  
    // 后置单目运算符重载  
    A operator++(int) // 哑元参数  
    {  
        A temp = *this; // 保存当前对象的状态  
        ++(*this);
		++(*this); // 调用前置版本增加对象的值  
        return temp; // 返回保存的对象状态  
    }  
  
    int getx()  
    {  
        return x;  
    }  
  
    int gety()  
    {  
        return y;  
    }  
};   
  
int main()  
{  
    int x = 1, y = 1;  
    A a(x,y);  
    cout<<a.getx()<<" "<<a.gety()<<endl;  
    a++; // 使用后置运算符  
    cout<<a.getx()<<" "<<a.gety()<<endl;  
    ++a; // 使用前置运算符  
    cout<<a.getx()<<" "<<a.gety()<<endl;  
}
/*结果
1 1
3 3
4 4*/

对于单目运算符(以+运算符为例):

重载为类的成员函数(隐含this指针表示此对象):以+为简单例子   a+b表示a+(b)   a+3表示a+(3)

#include<iostream>  
using namespace std;  
  
class A {  
private:  
    int x, y;  
public:  
    A(int a, int b) : x(a), y(b) {}  
  
    // 重载 + 操作符以接受一个整数并返回一个新的 A 对象  
    A operator+(int t) const {  
        return A(x + t, y + t);  
    }  
  
    // 重载 + 操作符以接受另一个 A 对象并返回一个新的 A 对象  
    A operator+(const A& b) const {  
        return A(x + b.x, y + b.y);  
    }  
  
    int getx() {  
        return x;  
    }  
  
    int gety() {  
        return y;  
    }  
};  
  
int main() {  
    int x = 1, y = 1;  
    A a(x, y);  
    cout << a.getx() << " " << a.gety() << endl;  
  
    // 使用新的 A 对象来存储结果  
    A result1 = a + 1;  
    cout << result1.getx() << " " << result1.gety() << endl;  
  
    // 使用新的 A 对象来存储结果  
    A result2 = a + a;  
    cout << result2.getx() << " " << result2.gety() << endl;  
}
/*结果
1 1
2 2
2 2*/

对于<<运算的重载:

#include<iostream>  
using namespace std;  
  
class A{  
private:  
    int x,y;  
public:  
    A(int a,int b):x(a),y(b){}  
  
    friend ostream& operator<<(ostream &out, const A &a)  
    {  
        out<<a.x<<" "<<a.y<<endl;  
        return out;  
    }  
};  
  
int main()  
{  
    int x = 1, y = 1;  
    A a(x,y);  
    cout<<a; // 现在正确地将 a 对象输出到 cout,输出为 "1 1\n"  
    return 0;  
}

对【】运算符的重载

一维数组

#include<iostream>  
using namespace std;  
  
class A{  
private:  
    int size;
	int *a;  
public:  
    A(int n):size(n){
	a = new int[size];
	}  
  
    int &operator[](int index)
    {
    	return a[index];
	}
	friend ostream& operator<<(ostream& out,A a)
	{
		for(int i=0;i<a.size;i++)
		out<<a.a[i]<<" ";
		return out;
	}
	~A()
	{
		delete []a;
	}
};   
  
int main()  
{  
    int n; 
	cin>>n; 
    A a(n);
	for(int i=0;i<n;i++)
	cin>>a[i]; 
	 
    cout<<a; 
}

二维数组

#include<iostream>    
using namespace std;    
  
class A {    
private:    
    int sizen, sizem;  
    int **a;    
public:    
    A(int n, int m) : sizen(n), sizem(m) {  
        a = new int*[sizen];  // 分配指针数组  
        for (int i = 0; i < sizen; i++) {  
            a[i] = new int[sizem];  // 为每个指针分配内存  
        }  
    }    
    
    int* operator[](int index) {  // 返回一个指向int*的指针  
        return a[index];  
    }  
    friend ostream& operator<<(ostream& out, const A& a);  // 使用const A& 避免复制  
  
    ~A() {  
        for (int i = 0; i < sizen; i++) {  
            delete[] a[i];  // 释放每个int数组  
        }  
        delete[] a;  // 释放指针数组  
    }  
};     
  
ostream& operator<<(ostream& out, const A& a) {  
    for (int i = 0; i < a.sizen; i++) {  
        for (int j = 0; j < a.sizem; j++) {  
            out << a.a[i][j] << " ";  // 访问a[i][j]  
        }  
        out << endl;  // 每行结束后换行  
    }  
    return out;  
}  
  
int main() {    
    int n, m;   
    cin >> n >> m;   
    A a(n, m);  
    for (int i = 0; i < n; i++) {  
        for (int j = 0; j < m; j++) {  
            cin >> a[i][j];   
        }  
    }  
    cout << a;   
    return 0;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值