重载操作符 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;
};
- 重载操作符 1
- 重载操作符与转换(1)
- Think_in_CPP第十二章 操作符重载(1)
- NO.1 操作符重载实现
- 操作符函数及重载(1)
- C++ 操作符重载(1) 时间相加
- c++重载操作符
- C++ 操作符重载
- 操作符重载浅析
- 操作符重载
- 10.8 操作符重载
- 操作符重载
- 操作符重载手册
- C#操作符重载
- 操作符重载手册
- 操作符重载手册
- 六操作符重载
- 操作符的重载
- Asp.net 中GridView各种用法
- 制作最小文件系统的时候出错(请帮忙)
- ftp乱码的问题的解决思路与策略
- 我的电脑助手 QTTabBar+Launchy+AutohotKey+firefox+gvim
- 网站开发文档有哪些
- 重载操作符 1
- gb2312转utf8
- VS2010 Ultimate 微软官网免费下载(VS2010终级版)
- 关于MDI的winform开发
- 谷歌到底想干什么
- JavaScript各种用法
- 谷歌不会退出中国{补充}
- 这都是什么呀,怎么这么乱呀
- Hack Android SD Card support