重载操作符 1

来源:互联网 发布:origin作图软件下载 编辑:程序博客网 时间:2024/05/10 06:17

1) 除了重载operator(),对其他重载操作符提供缺省实参,都是非法的。

 

2)友元声明的最常用法是,允许非成员的重载操作符访问“友好”类的私有成员。原因是提供重载操作符的左、右对称性,非成员重载操作符就像成员函数一样可以访问“友好”类的私有成员。当然如果那些私有成员已经提供了公有的访问函数接口,可以不声明命名空间的重载操作符为友元函数,因为它可以直接调用公有的访问函数接口,两者的结果是一样的。

 

3)如果screen类要把windows类的成员函数声明为友元,windows类要把screen类的成员函数声明为友元,那么怎么办?可以声明windows类为screen类的友元类。

class windows;

class screen

{

friend class windows

{

//*****

};

};

 

4)operator[], =, (), ->必须定义为类成员函数。操作符 , . : * & [] () -> 不能在命名空间里重载操作符

 

5)++,--操作符重载

class ScreenPtr

{

public:

//前置

screen &operator++();

screen &operator--();

//后置,int 只是标识是后置,而不是前置,并没有实参的实际意义

screen &operator++(int);

screen &operator--(int);

}

 

screenPtrObject++(1024)相当于screenPtrObject.operator++(1024),1024没有实际作用,所以不用。

也可以声明为友元函数

class ScreenPtr

{

//public:

//前置

friend screen &operator++(ScreenPtr &);

friend screen &operator--(ScreenPtr &);

//后置,int 只是标识是后置,而不是前置,并没有实参的实际意义

friend screen &operator++(ScreenPtr &, int);

friend screen &operator--(ScreenPtr &, int);

};

 

6)类成员操作符new的返回值必须是void*, 参数是size_type,它是在<cstddef>中定义的typedef。类成员操作符delete的返回值必须是void,实参是void*。

class screen

{

public:

void *operator new(size_type);

void *operator new(size_type, screen *); 

void operator delete(void *);

//void operator delete(void *, size_type); //这样子也可以

void operator delete(void *, scteen *);

}

 

操作符new和delete都是静态成员,它们不用显示的声明为static,因此它们没有this指针,只能访问类中的其他static成员,因为这些操作符被调用的时候,要么是在对象创建之前(new),要么是在对象销毁之后(delete)。

 

void Fun(screen *pScreen)

{

screen *ps = new (pScreen) screen; 

}

动作如下:

1,调用成员重载操作符 new

2,调用screen的缺省构造函数

3,把构造成功的screen对象的地址赋给ps

如果在重载操作符new中分配了空间,但是在2步的时候,出错了,那么该空间不会被自动释放,这就需要提供重载操作符delete,要求是new和delete的参数除了第一个不同,其他的都要相同,这样在delete中可以释放在new中分配的空间,系统会在2步出错时,自动调用重载的delete。

 

7)转换函数(conversion function)是一种特殊类型的成员函数,它定义了一个由用户定义的类型转换。在类体中通过operator后面加上转换的目标类型(不一定是内置类型),就声明转换函数。通用的形式是:operator type() {};这里type不能是数组和函数类型,它必须是成员函数,声明不能指明返回类型和参数表

 

typedef char * t_name;

class SmallInt

{

public:

operator int() {return _val};

 

private:

int _val; 

};

 

class Token

{

public:

operator SmallInt() {return _val};

operator t_name() {return _name};

operator int() {return _val};//先调用Token :: SmallInt(), then SmallInt :: int()

 

private:

SmallInt _val;

t_name _name; 

};