问题的引出:
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种类型转换的新形式
大家可在实践中多多摸索,我也是个菜鸟,呵呵。鸡蛋,石头@%$#@^%#@$#^$,我闪~