c++运算符重载笔记

本文详细介绍了C++中的运算符重载,包括注意事项、输入输出运算符、递增递减运算符以及函数调用运算符的重载规则和实践。强调了重载运算符的限制和作为成员函数与非成员函数的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.运算符重载的六个注意事项:
(1).重载运算符函数的参数个数,应该与参与这个运算符的运算对象数量一样多,但是如果是成员函数,则参数数量要少一个,因为第一个参数是this。例如:

#include<iostream>
using namespace std;

class Test
{
public:
        int value;
        int operator+(const Test &v )   //重载为成员函数
        return this->value+v.value;  //等同于value+v.value;
};
int operator+(const Test &v1,const Test &v2)
{
     return v1.value+v2.value;
}
int main()
{
     Test a,b;
     a.value=5;
     b.value=6;
     printf("a+b=%d\n",a+b);
     return 0;
}

(2).运算符重载函数的参数至少要有一个类的成员(或者类类型)作为参数,而不能都是内置类型(会导致编译错误)。例如int operator+(int, int)是不行的,因为int是内置类型。内置类型的操作符明显是不能重载的,比如重载了int型的+运算符,那程序其他地方的int加法都会使用重载的函数,这明显是不行的。
(3).运算符可以像普通函数一样调用。
(4).有些运算符是不适合重载的;(,、&、&&、||等)。
(5).必须作为成员函数的重载运算符:=、[]、()、->,否则会编译错误。
(6).重载运算符函数是成员函数时,其实就是运算符左侧的对象调用的这个运算符,所以左侧对象必须是运算符所属类的一个对象。

2.输入输出运算符重载:
(1).“<<”和“>>”表示移位操作,在IO标准库(iostream库)重载了这两个运算符来处理输入和输出,自己重载这两个运算符的目的就是要用在输出自定义的类的时候。
(2).如果要与iostream库兼容输入输出操作,则自己重载的时候必须作为非成员函数,这个是因为如果作为成员函数,则左侧的操作对象应该是这个类的对象,这样就不能兼容iostream库的输入输出操作。当然非要重载为成员函数,也是可以编译通过的,只不过是不能兼容标准库iostream的输入输出操作而已。
(3).因为IO运算符通常要访问类的所有成员,所以一般是把重载的非成员函数声明为类的友元函数。

3.递增递减运算符重载
(1).递增和递减一般是改变对象的状态,所以一般是重载为成员函数。
(2).重载递增递减,一定要和指针的递增递减区分开。因为这里的重载操作的是对象,而不是指针(由于指针是内置类型,指针的递增递减是无法重载的),所以一般情况的递增递减是操作对象内部的成员变量。
(3).递增和递减分为前置和后置情况,a = ++b;(前置), a = b++;(后置)。因为符号一样,所以给后置版本加一个int形参作为区分,这个形参是0,但是在函数体中是用不到的,只是为了区分前置后置。例如:

#include<stdio.h>
#include<stdlib.h>
#include<string>
#intclude<iostream>
using namespace std;
class Test
{
     int value;
     //前置递增就是增加当前对象的pos的值,并且返回当前对象(递增之后的对象)
     Test operator++()
     {
     valued++;
     return *this;
     }
     //后置递增就是增加当前对象的pos的值,并且返回增加pos之前的该对象(递增之前的对象)
     Test operator++(int)
     {
     Test ret=*this;
     value++;  //或者是++this (此时会调用上面的函数)
     return ret;
     }
};
int main()
{
    Test a,b;
    a.value=1;
    b=a++;
    cout<<"b1="<<b.value<<endl;    //b1=1;
    b=++a;
    cout<<"b2="<<b.value<<endl;    //b2=3;
}

4.重载函数调用运算符“()”
(1).*类重载了括号运算符,则该类的对象就可以当成函数一样来使用。
(2).这种对象常常用作泛型算法的实参,因为有些泛型算法可以提供自定义的比较函数。例如:

#include<iostream>
using namespace std;
void myprint(const string & str)
{
      printf("Priintf :%s\n",str.c_str());
      return;
}
class Test
{ 
   int value;
   Test()
   {
   value=0;
   }
   void operator()(const string &str)
   {
         printf("Test print : %s\n", s.c_str());
        value++;
   }
};

int main()
{
     vector<string> v;
     v.push_back("abc");
     v.push_back("def");
     for_each(v.begin(),v.end(),myprintf);
     Test t;
      for_each(v.begin(),v.end(),t);               //这里要注意,这个是值传递,传的是a的副本
      printf("Test printf value: %d\n", t.value);    //所以这个地方的value还是0
      t("hhhh");
      t("ffffff");
        printf("Test printf value: %d\n", t.value);    //现在value的值就是2了.
}
内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值