首先,由于c++的编译器的不同,不保证所有的程序都能得到满意的结果。本人是使用的是VS2005。记得大学刚开始学C++用的是VC6.0,C++98年的标准。有够老的。该吸收心得知识了。
先介绍新C++标准的两个新增的特性。1)支持bool。2)新增种转型操作符。
#include <iostream>
using namespace std;
class Widget
{
public:
virtual void dosomething()
{
}
protected:
private:
};
class SpecialWidget:public Widget
{
public:
protected:
private:
};
void updata(SpecialWidget *psw)
{
}
typedef void (* FuncPtr)();
void fun1(int a)
{
//nothing in fun1()
cout<<a<<endl;
}
void main()
{
//新性质1:新增bool型变量
bool i;
i=false;//true
cout<<i<<endl;
//新性质2:新增四种转型操作符
//static_cast
int firstNumber=5,secondNumber=3;
double result1=((double) firstNumber)/secondNumber;
cout<<"旧式C转型:"<<result1<<endl;
double result2=(static_cast<double> (firstNumber))/secondNumber;
cout<<"新型C转型:"<<result1<<endl;
//const_cast
const int constant = 21;
const int* const_p = &constant;
int* modifier = const_cast<int*>(const_p);
*modifier = 7;
//奇怪的指向同意内存空间的值竟然不一样。
cout << "constant's address: "<< &constant <<" "<<"constant: "<< constant <<endl;
cout <<"const_p's address: "<< const_p << " "<<"const_p: "<< *const_p <<endl;
cout << "modifier's address: "<< modifier <<" "<<"modifier: "<< *modifier <<endl;
//dynamic_cast
Widget *pw=new SpecialWidget();
//updata(pw); //error
updata(dynamic_cast<SpecialWidget *>(pw));//如果基类没有虚函数,会报错:“dynamic_cast”:“Widget”不是多态类型
//reinterpret_cast常用来转换“函数指针”
FuncPtr funcPtrArray[10];
//funcPtrArray[0]=&updata;
funcPtrArray[0]=reinterpret_cast<FuncPtr>(&updata);
}
转型操作符有两点需要注意的:
1)const_cast操作符:能移除常量性,但慎用。源代码中const_cast中的例子虽然同一地址;但竟有两个值。
2)dynamic_cast用于具有继承的类中的转换,但要求类中必须要有虚函数。