由static_cast(CMyClass)(*pObject)引发的一系列思考【原创】

问题的引出:
 
typedef list<CMediaFile> CMediaFileList; // 录像文件链表,CMediaFile是定义的一个类
 
 CMediaFileList::iterator it = m_MediaFileList.begin();
 for( ; it != m_MediaFileList.end() ; it++ )
 {
  XTRACE ( "全路径的文件名:%s,通道号:%d,记录编号:%d,/n " ,
   (static_cast<CMediaFile>((*it))).sPathName.c_str(),
   (static_cast<CMediaFile>((*it))).nChannel,
   (static_cast<CMediaFile>((*it))).uID
   );
 }
//…………
//上面一段代码作一个简单的测试,输出链表的所有内容。
//…………
 CMediaFileList::iterator it = m_MediaFileList.begin();
XTRACE ( "全路径的文件名:%s", (static_cast<CMediaFile>((*it))).sPathName.c_str() );
//…………
看看结果, 第二个trace输出空的
 
看起来没什么错,呵呵,我也是调试可好长时间。先从下面一个程序讲起,最好亲手编译一下:

#include "conio.h"
#include "iostream"
using namespace std;

class CMyClass
{
    public:
     CMyClass()
     {
          cout << "CMyClass::CMyClass()" << endl;
     }
     ~CMyClass()
     {
          cout << "CMyClass::~CMyClass()" << endl;
     }

     void Draw()
     {
          cout << "CMyClass::Draw()" << endl;
     }
};

int _tmain( int argc, _TCHAR* argv[])
{
     CMyClass * pObject = new CMyClass;

      static_cast<CMyClass>(*pObject).Draw();

      delete pObject;
     _getch();

      return 0;
}
// 输出结果如下:
CMyClass::CMyClass()
CMyClass::Draw()
CMyClass::~CMyClass()
CMyClass::~CMyClass()
 
在看看代码, static_cast<CMyClass>是否觉得有某些灾难!原因何在,因为在类型转换的时候自动构造和析构了一个 CMyClass 对象。为什么没有我们定义的构造输出而有析构输出呢?
因为这里的类型转换构造使用了拷贝构造函数。
一般情况下,如果类不特殊声明函数,系统自动为我们产生四个函数:
1.构造
2.析构
3.拷贝构造函数(注意了)
4.重载=操作符,大致是cmyclass operator = (const cmyclass & object){…………}
 
上面我们没有定义拷贝构造函数,当然不会输出: CMyClass::CMyClass()  了。
下面我们来自定义一个拷贝构造函数(加为成员函数):
 CMyClass(const CMyClass & object)
 {
    cout << "CMyClass::CMyClass(const CMyClass & object)" << endl;
 }
在看看输出:
CMyClass::CMyClass()
CMyClass::CMyClass(const CMyClass & object)
CMyClass::Draw()
CMyClass::~CMyClass()
CMyClass::~CMyClass()
 
呵呵,这回如我们所愿了。
再看看程序有没有优化的地方?使用引用和指针效率会更高:
static_cast<CMyClass*>(pObject)->Draw();
static_cast<CMyClass &>(*pObject).Draw();
就只有一个输出了(没有拷贝构造和析构),结果如下:
CMyClass::CMyClass()
CMyClass::Draw()
CMyClass::~CMyClass()
 
现在我们回过头来看看:为什么喜欢用static_cast这个咚咚呢,有什么好处?
我用(CMyClass&)(*pObject).Draw();工作不是挺好的???
 
static_cast :一般情况下就用它, 功能上基本上与C风格的类型转换一样,含义也一样
reinterpret_cast : 用于将一种类型的值解释为另一种类型的值 ,很少使用
const_cast去掉某个对象或指针的const或volatileness属性
dynamic_cast转换的目标类型限于类的指针或引用,被转换的类必须是多态类
 
是c99引入的东西,使用它们至少有2个好处:
 
一是其本身就是一种注释,在代码中看到上面这些关键字就可马上知道此处是进行类型转换。二是C语言中类型转换通常是很难进行搜索的,而通过关键字cast则可以很容易的找到程序中出现类型转换的地方了。

强制类型转换

    程序员可以在表达式中使用3种强制类型转换表达式:

    ① (T)E; //C语言中所使用的风格,如 (int)x;

    ② T(E); //C++语言中所使用的风格,类似于函数调用, 如 int(x);

    ③ cast_operator<T>(E); //C++语言提供的4种类型转换的新形式

大家可在实践中多多摸索,我也是个菜鸟,呵呵。鸡蛋,石头@%$#@^%#@$#^$,我闪~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值