C++强制类型转换操作符之static_cast
static_cast在功能上基本与C风格的类型转换一样强大,含义也一样,它也有功能上的限制。例如,不能用static_cast像用C风格的类型转换一样把int类型转换为指针类型;另外,static_cast不能从表达式中去除const属性或volatile属性。
- static_cast可以完成C++编译器隐式执行的类型转换。编译器会对有些隐式类型转换发出警告,这时可以使用static_cast来消除警告。
class Book{
public:
Book(int number, string name=""):number(number),name(name){}
int number;
string name;
};
int main()
{
Book book = static_cast<Book>(1002);
cout << book.number << endl; //输出:1002
return 0;
}
double i = 2.3;
int j = i; //warning
j = static_cast<int>(i); //no warning
- static_cast支持void*指针与类型指针之间转换。
class Book{
public:
Book(int number, string name):number(number),name(name){}
int number;
string name;
};
class Animal{
public:
Animal(int age, int height, string name):age(age),height(height),name(name){}
int age;
int height;
string name;
};
int main()
{
Book *book = new Book(1001, "C++ primer");
void * object = static_cast<void *>(book);
Animal *animal = static_cast<Animal*>(object);
cout << animal->name << endl; //运行时错误
delete book;
return 0;
}
- static_cast不像C风格的类型转换一样把int类型转换为指针。
int i = 0;
void *p = (void *)i; //fine
void *p = static_cast<void*>(i); //error
- static_cast可以实现在基类指针与派生类指针,和基类引用与派生类引用之间的强制转换。static_cast不做运行时的检查,不如dynamic_cast安全,但比dynamic_cast效率高。