当前位置:  编程语言>c/c++

C++操作符(Operator)用法(new和重载)

 
    发布时间:2013-10-22  


    本文导语:  关于operator, 在 < The C++ Programing Language > 里的描述,可以用做overload的如下:+ * / % ^ & | ~ ! = < > += = *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ >* , > [] () new new[] delete delete[]1、运...

 关于operator, 在 < the c++ programing language > 里的描述,可以用做overload的如下:

+ * / % ^ & | ~ ! = < > += = *= /= %= ^= &= |= << >> >>= <<= == != <=
>= && || ++ >* , > [] () new new[] delete delete[]

1、运算符重载格式

  返回类型 operator 运算符号参数说明),例如上例中对加法的重载: COperator operator +(COperator &op);

C++中规定,运算符中参数说明是内部类型时,不能重载。运算符重载过程中不会改变改运算符的运算优先级

2、运算符重载的参数

   运算符重载的参数,往往是初学者难以掌握的。其实很简单:参加运算的所有变量都是运算符的参数。比如说加法重载过程中,有两个参与的变量:加数和被加数。那我们就认为对它进行重载的过程中需要两个参数。需要指出的增量运算符有两种形式,增量(运算符在变量前面)和后增量。前增量我们可以把他看做只有一个参数,而后增量我们可以看为a++1。事实上他是两个参数。只是在运算过程中,第二个参数我们不用而已。运算符的重载有两个方式,一种是做为成员函数,另一种是做为友元函数。第一种C++默认省略第一个参数(事实上是对象本身),而后一种是所有的参数都要写全。比如对加法的重载:

成员方式为:COperator operator +(COperator &op);在调用的过程中我们可以理解为result = operator+(op)

友元方式为:friend COperator operator - (COperator &op1,COperator &op2);

在调用的过程中我们可以理解为result = operator-(op1,op2);

注:上面的理解方式可以看出,除了在调用形式上不同,重载的运算符和普通的函数是等效的。

3、返回值

   C++中没有对重载函数的返回值做太多的限制。为了使调用都能够理解你所重载的函数,不会产生二义性。一般来讲重载运算符的返回值会是该类的对象或是该类对象的引用在C++中所有函数(包括重载的运算符)在返回的过程中会构建一个返回类型的临时对象。当函数执行完之后,这个对象会消失。应该说它是C++中数据库 iis7站长之家最短的变量。值得指出的是,系统构建这个临时对象的过程中会调用COPY构造函数。关于这一点笔都会在另一个话题中说明。重载返回值是返回引用还是返回一个对象是由我们需要决定的。为了不让调用者曲解,如果在运算过程中改变了参与运算的变量的值往往我们返回引用,如果不改变的话我们返回对象。例如:在加法重载中,两个参与运算的变量都没有改变,所以我们就要返回一个新的对象,而不是两个对象中的一个。(不要返回一个局部引用,会出错的)。而在前增量运算的过程中,返回的是我们改变后的对象,这样直接返回引用就可以的。

重载运算符坚持4个“不能改变”:

不能改变运算符操作数的个数;

不能改变运算符原有的优先级;

不能改变运算符原有的结合性;

不能改变运算符原有的语法结构。

4 实例代码

代码举例1:

class Test {
private:
    int internalData;
public:
    // constructor and destructor
    Test(int data = 0) : internalData(data) {};
    Test(const Test & Para) : internalData(Para.internalData) {};
    ~Test() {};
    // Operator overlording
    Test & operator += (const Test & Para1);
    Test operator + (const Test & Para1);
};
Test & Test::operator += ( const Test & Para1 )
{
    internalData += Para1.internalData;
    return * this;
}
Test Test::operator + (const Test & Para1)
{
    return Test(*this) += Para1;
}


示例代码2:

class COperator
{
public:
       int a;
       int b;
public:
       COperator (void);
       COperator (COperator &op);
       ~COperator (void);
//操作符重载
       COperator operator +(COperator &op);
       friend COperator operator - (COperator &op1,COperator &op2);
COperator &operator ++ (int);
       COperator operator ++();
};
#include ".opartor.h"
#include <iostream>
using namespace std;
COperator::COperator(void)
{
}
COperator::~COperator(void)
{
}
COperator::COperator(COperator &op)
{
       this->a = op.a;
       this->b = op.b;
       cout << "COPY构造被调用"<<endl;
}
COperator COperator::operator +(COperator &op)
{
       COperator temp;
       temp.a = this->a + op.a;
       temp.b = this->b + op.b;
       cout << "重载加法被调用"<<endl;
return temp;
}
COperator operator -( COperator &op1,COperator &op2)
{
       COperator temp;
temp.a  = op1.a - op2.b;
       temp.b = op1.b - op2.b;
cout << "友元重载减法被调用" <<endl;
       return temp;
}
COperator COperator::operator ++()
{
       COperator temp(*this);
(this->a)++;
       (this->b)++;
cout << "右增量被调用" <<endl;
       return temp;
}
COperator &COperator::operator ++(int)
{
       cout << "左增量被调用" <<endl;
(this->a)++;
       (this->b) ++;
return *this;
}


  • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
    转载请注明:文章转载自:[169IT-IT技术资讯]
    本文标题:C++操作符(Operator)用法(new和重载)
相关文章推荐:


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3