c++ static_cast用法
static_cast类型转换运算符,意思是静态转换,在编译期检查能否转换成功,失败会编译报错。
主要用于基本类型数据转换、void*和其他类型指针转换,以及指针类型间转换。
测试代码:
void testTypeCast(void) {// test static_cast 静态转换,即编译期间转换// 1、基本数据类型转换float f = 1.03;double d = (double)f;d = static_cast<double> (f);std::cout << "d = " << d << endl << endl; // d = 1.03// 转换失败则编译报错//int* p = static_cast<int*> (f); // 编译报错:类型转化无效。// 2、void指针和其他类型指针转换int i = 9527;int* p = &i;void* p2 = static_cast<void*>(p);unsigned* p3 = static_cast<unsigned*>(p2);*p3 = 250;std::cout << "i = " << i << endl << endl; // i = 250//char* c = static_cast<char*>(p3); // 编译报错:类型转化无效。// 3、指针或引用的向上转化class Base {public:string name;virtual void func() {std::cout << "调用基类func函数, name: " << name << endl;}};class Sub : public Base {public:int age;Sub() :age(0) {}void func() override {std::cout << "调用子类func函数, name: " << name << ",age: " << age << endl;}int getAge() const {return age;}};Sub sub;sub.name = "代号9527";sub.age = 18;// 向上转换std::cout << "test 指针向上转换:" << endl;Base* basePtr = static_cast<Base*>(&sub);std::cout << "转换为基类指针后, name: " << basePtr->name << endl << endl; // 转换为基类指针后, name: 代号9527std::cout << "再转换回来,查看数据还是完整的,不会丢失数据:" << endl;Sub* subPtr = static_cast<Sub*>(basePtr);std::cout << "再转换回子类指针后,name: " << subPtr->name << ", age: " << subPtr->age << endl << endl; // 再转换回子类指针后,name: 代号9527, age: 18// 再测试下,指针类型向下转换是否可以std::cout << "test 指针向下转换:" << endl;Base base;base.name = "金毛狮王";subPtr = static_cast<Sub*>(&base); // 可以这么转化,但是没意义。std::cout << "测试指针向下转换,name: " << subPtr->name << ", age: " << subPtr->age << endl << endl; // 测试指针向下转换,name: 金毛狮王, age: -858993460// 测试对象直接赋值Sub sub2;sub2.age = 22;sub2.name = "狗哥";Base base2 = sub2; // 内存拷贝,基类变量数量少,会丢失子类age变量的值。下面验证:Sub* sub3Ptr = static_cast<Sub*>(&base2);std::cout << "赋值后, name: " << sub3Ptr->name << ", age: " << sub3Ptr->age << endl;
}
打印:
ok.