学学习网 手机版

学学习网

学习路径: 学习首页 > 应用开发 > c++ >

第六节 类(Classes)(6)

设置字体:
----------------------------------

   CVector (int, int);            // 函数名称 CVector (constructor)
   CVector operator+ (CVector);   // 函数 operator+ 返回CVector 类型的值
  
Class CVector的函数 operator+ 是对数学操作符+进行重载的函数。这个函数可以用以下两种方法进行调用:
c = a + b;
c = a.operator+ (b);
注意:我们在这个例子中包括了一个空构造函数 (无参数),而且我们将它定义为无任何操作:
CVector ( ) { };
这是很必要的,因为例子中已经有另一个构造函数,
CVector (int, int);
因此,如果我们不像上面这样明确定义一个的话,CVector的两个默认构造函数都不存在。
这样的话,main( )中包含的语句
CVector c;
将为不合法的。
尽管如此,我已经警告过一个空语句块 (no-op block)并不是一种值得推荐的构造函数的实现方式,因为它不能实现一个构造函数至少应该完成的基本功能,也就是初始化class中的所有变量。在我们的例子中,这个构造函数没有完成对变量x 和 y 的定义。因此一个更值得推荐的构造函数定义应该像下面这样:
CVector ( ) { x=0; y=0; };
就像一个class默认包含一个空构造函数和一个复制构造函数一样,它同时包含一个对赋值操作符assignation operator (=)的默认定义,该操作符用于两个同类对象之间。这个操作符将其参数对象(符号右边的对象) 的所有非静态 (non-static) 数据成员复制给其左边的对象。当然,你也可以将它重新定义为你想要的任何功能,例如,只拷贝某些特定class成员。
重载一个操作符并不要求保持其常规的数学含义,虽然这是推荐的。例如,虽然我们可以将操作符+定义为取两个对象的差值,或用==操作符将一个对象赋为0,但这样做是没有什么逻辑意义的。
虽然函数operator+ 的原型定义看起来很明显,因为它取操作符右边的对象为其左边对象的函数operator+的参数,其它的操作符就不一定这么明显了。以下列表总结了不同的操作符函数是怎样定义声明的 (用操作符替换每个@):
Expression Operator (@) Function member Global function
@a + - * & ! ~ ++ -- A::operator@( ) operator@(A)
a@ ++ -- A::operator@(int) operator@(A, int)
a@b + - * / % ^ & | < > == != <= >= << >> && || , A::operator@(B) operator@(A, B)
a@b = += -= *= /= %= ^= &= |= <<= >>= [ ] A::operator@(B) -
a(b, c...) ( ) A::operator()(B, C...) -
a->b -> A::operator->() -
* 这里a 是class A的一个对象,b 是 B 的一个对象,c 是class C 的一个对象。
从上表可以看出有两种方法重载一些class操作符:作为成员函数(member function)或作为全域函数(global function)。它们的用法没有区别,但是我要提醒你,如果不是class的成员函数,则不能访问该class的private 或 protected 成员,除非这个全域函数是该class的 friend (friend 的含义将在后面的章节解释)。
 
关键字 this
关键字this 通常被用在一个class内部,指正在被执行的该class的对象(object)在内存中的地址。它是一个指针,其值永远是自身object的地址。
它可以被用来检查传入一个对象的成员函数的参数是否是该对象本身。例如:
    // this
    #include <iostream.h>
   
    class CDummy {
      public:
        int isitme (CDummy& param);
    };
   
    int CDummy::isitme (CDummy& param) {
        if (&param == this) return 1;
        else return 0;
    }
   
    int main () {
        CDummy a;
        CDummy* b = &a;
        if ( b->isitme(a) )
            cout << "yes, &a is b";
        return 0;
    }
                      
yes, &a is b
它还经常被用在成员函数operator= 中,用来返回对象的指针(避免使用临时对象)。以下用前面看到的向量(vector)的例子来看一下函数operator= 是怎样实现的:
----------------------------------
课程列表
重点难点
赞助链接