今天在android的代码里面看到了sp,这里简单写了下关于操作符重载的例子
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* Define Screen class
*/
class Screen
{
public:
Screen(){}
Screen(int l, int r, int t, int b): m_left(l), m_right(r), m_top(t), m_bottom(b) {}
void show_screen() { printf("@hk %d, %d, %d, %d/n", m_left, m_right, m_top, m_bottom); }
private:
int m_left;
int m_top;
int m_right;
int m_bottom;
};
/*
* Define pointer class of Screen
*/
template <typename T>
class ScreenPtr{
public:
ScreenPtr(T *ptr) : m_ptr(ptr) {}
~ScreenPtr() { delete m_ptr; }
void operator=(T *ptr) { m_ptr = ptr; }
T& operator* () { return *m_ptr; }
T* operator->() { return m_ptr; }
private:
T *m_ptr;
};
//
class massage_data
{
public:
massage_data(char *data_ptr) : m_data_ptr(data_ptr) {}
void print_data() { printf("@hk.%s(%d) %s /n", __FILE__, __LINE__, (char*)m_data_ptr); }
private:
char *m_data_ptr;
};
template <typename T>
class StrClassPtr
{
public:
/* construction function [10/29/2009 @h.k] */
StrClassPtr() : m_ptr(0) {}
StrClassPtr(T *object_ptr) : m_ptr(object_ptr) {}
/* destruction function [10/29/2009 @h.k] */
~StrClassPtr(){delete m_ptr;}
void operator=(T *ptr) { m_ptr = ptr; }
T& operator*() {return *m_ptr;}
T* operator->() { return m_ptr; }
private:
T *m_ptr;
};
/*
* 使用ScreenPtr类,封装了Screen类的指针,好处在于可以自己释放,使用者不用关系指针释放
* 引用: 是一个变量的别名.
*/
int main(int argc, char *argv[])
{
/*
*
*/
char str[] = "I would like to know the results!";
StrClassPtr<massage_data> msg_data_ptr;
msg_data_ptr = new massage_data(str); /* 这里如果不重载"="操作符将会出大问题 [10/30/2009 @h.k] */
msg_data_ptr->print_data();
/*
* use ScreenPtr class
*/
Screen *pscr = new Screen(10, 10, 800, 480);
Screen scr;
ScreenPtr<Screen> sptr(pscr);
ScreenPtr<Screen> sptr_first(new Screen(50, 50, 600, 480));
/*
* 通过new Screen(60, 60, 300, 240)分配一个新的Screen对象给sptr_second
* 实际就是这样一个动作"sptr_second.m_ptr = new Screen(60, 60, 300, 240)"
*/
ScreenPtr<Screen> sptr_second = new Screen(60, 60, 300, 240);
scr = *sptr; /* 重载操作符"*" [10/30/2009 @h.k] */
scr.show_screen();
sptr->show_screen(); /* 重载操作符"->" [10/30/2009 @h.k] */
sptr_first->show_screen();
sptr_second->show_screen();
return 0;
}