C++中利用构造函数与无名对象简化运算符重载函数

2016-02-19 20:21 22 1 收藏

今天图老师小编要跟大家分享C++中利用构造函数与无名对象简化运算符重载函数,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: !-- frame contents -- !-- /frame contents -- //程序作者:管宁 
  //站点:www.cndev-lab.com 
  //所有稿件均有版权,如要转载,请务必闻名出处和作者 
   
  #include iostream 
  using namespace std; 
   
  class Test   
  {   
      public:   
          Test(int a) 
          { 
              Test::a = a; 
          } 
          friend Test operator + (Test&,int); 
      public: 
          int a; 
  }; 
  Test operator + (Test &temp1,int temp2) 
  { 
      Test result(temp1.a + temp2); 
      return result; 
  } 
  int main() 
  { 
      Test a(100); 
      a = a + 10;//正确 
      a = 10 + a;//错误 
      couta.aendl; 
      system("pause"); 
  }  上面的代码是一个自定义类对象与内置整型对象相加的例子,但错误行让我们猛然感觉很诧异,但仔细看看的确也在情理中,参数顺序改变后c++无法识别可供使用的运算符重载函数了。  我们为了适应顺序问题不得不多加一个几乎一样的运算符重载函数。  代码如下://程序作者:管宁 
  //站点:www.cndev-lab.com 
  //所有稿件均有版权,如要转载,请务必闻名出处和作者 
   
  #include iostream 
  using namespace std; 
   
  class Test   
  {   
      public:   
          Test(int a) 
          { 
              Test::a = a; 
          } 
          friend Test operator + (Test&,int); 
          friend inline Test operator + (Test&,int); 
      public: 
          int a; 
  
   }; 
  Test operator + (Test &temp1,int temp2) 
  { 
      Test result(temp1.a + temp2); 
      return result; 
  } 
  inline Test operator + (int temp1,Test &temp2)//利用内联函数的定义提高效率 
  { 
      return temp2+temp1; 
  } 
  int main() 
  { 
      Test a(100); 
      a = a + 10;//正确 
      a = 10 + a;//正确 
      couta.aendl; 
      system("pause"); 
  }  代码中我们使用内联函数的目的是为了缩减开销,但事实上我们仍然觉得是比较麻烦的,例子中的情况都还是非成员函数的情况,假如运算符重载函数是作为类成员函数,那么问题就来了,重载函数的第一个参数始终被隐藏,我们无发让int形参排列在隐藏参数的前面,从而导致a = 10 + a;无法获取正确的运算符重载函数。 更多文章 更多内容请看C/C++技术专题专题,或
  
  有问题的代码如下:class Test   
  {   
      public:   
   !-- frame contents -- !-- /frame contents --         Test(int a) 
          { 
              Test::a = a; 
          } 
          Test operator + (int temp2) 
          { 
                  Test result(temp1.a + temp2); 
                  return result; 
          } 
          Test operator + ()//第一个参数被隐藏,怎么办????,int形参无法放到this指针的前面,理想中的应该是(int temp1,Test *this) 
          { 
   
          } 
      public: 
          int a;   
  };  对于这个问题难道没有办法解决吗?
  答案是否定的,我们可以利用类构造函数对参与运算的整型对象进行显式的类型转换,从而生成无名对象参与同类型对象的加运算,这样做可以缩减代码量,提高程序的可读性。
  
  代码如下(例一为非成员形式,例二为成员形式)://例一 
  
    
  //程序作者:管宁       
  //站点:www.cndev-lab.com       
  //所有稿件均有版权,如要转载,请务必闻名出处和作者    
   
  #include iostream 
  using namespace std; 
   
  class Test   
  {   
      public:   
          Test(int a)//事实上构造函数起的转换作用本质就是产生无名对象 
          { 
              Test::a = a; 
          } 
      friend Test operator + (Test&,Test&); 
      public: 
      int a; 
  }; 
  Test operator + (Test &temp1,Test &temp2) 
  { 
      Test result(temp1.a + temp2.a); 
      return result; 
  } 
  int main() 
  { 
      Test a(100); 
      a = a + Test(10);//显式转换,产生无名对象 
      a = Test(10) + a; 
      couta.aendl; 
      a = 50 + 1;//先进行50+1的内置整型的加运算,然后进行a=Test(51)的隐式转换 
      couta.aendl; 
      system("pause"); 
  } 更多文章 更多内容请看C/C++技术专题专题,或 //例二 
   
  //程序作者:管宁       
  //站点:www.cndev-lab.com       
   !-- frame contents -- !-- /frame contents -- //所有稿件均有版权,如要转载,请务必闻名出处和作者 
   
  #include iostream 
  using namespace std; 
   
  class Test   
  {   
      public:   
          Test(int a)//事实上构造函数起的转换作用本质就是产生无名对象 
          { 
                  Test::a = a; 
          } 
          Test operator + (Test &temp)//第一个参数即使隐藏也没有关系,因为是以Test类型的无名对象参与运算的 
  
           { 
                  Test result(this-a + temp.a); 
                  return result; 
          } 
      public: 
          int a; 
  }; 
   
  int main() 
  { 
      Test a(100); 
      a = a + Test(10); 
      a = Test(10) + a; 
      couta.aendl; 
      a = 50 + 1;//先进行50+1的内置整型的加运算,然后进行a=Test(51)的隐式转换 
      couta.aendl; 
      system("pause"); 
  }  认真观察了上面的两个例子后我们可以发现,类的构造函数起了显式或者隐式转换的作用,转换过程实质是产生一个类的无名对象,类的运算符重载函数的参数就是这个无名对象的引用,所以参数的顺序也不再是问题,代码的运行效率也得到提高,无需再定义只是参数顺序不同,内容重复的运算符重载函数了。 更多文章 更多内容请看C/C++技术专题专题,或

来源:https://www.tulaoshi.com/n/20160219/1623447.html

延伸阅读
  函数重载是用来描述同名函数具有相同或者相似功能,但数据类型或者是参数不同的函数治理操作的称呼。 !-- frame contents -- !-- /frame contents -- 我们来举一个实际应用中的例子来说明问题:我们要进行两种不同数据类型的和操作为了实现它,在c语言中我们就要写两个不同名称的涵数来进行区分例...
请注重,这一节内容是c++的重点,要非凡注重! 我们先说一下什么是构造函数? !-- frame contents -- !-- /frame contents -- 上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在c++中对于类来说有没有更方便的方式能...
http://www.asp888.net 豆腐技术站 我们以前在C++中曾经知道C++中有函数重载的概念,现在在ASp.Net的C#中我们仍然可以使用函数重载的 概念和定义: 假设我们在程序中定义了两个函数:String test(String str1) 而后 int test1(int i),他们的内容都是很 简单的功能 String test(String str1){ Response.Write("函数重载测试,这个是String函数"...
我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。 iostream为内置类型类型对象提供了输入输出支持,同时也支持文件的输入输出,类的...
看如下代码: 代码如下: #includeiostream class TestConstructor { public:     TestConstructor()     {         std::cout"TestConstructor()"std::endl;     }     ~TestConstructor()     {     &...

经验教程

137

收藏

7
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部