关于C++操作符重载之"->"和"*"

来源:互联网 发布:无限流量软件下载 编辑:程序博客网 时间:2024/06/06 01:56

    今天在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;
}

 

原创粉丝点击