C11类型转换

std::make_unique<class name>(parameter)  <>中间加入类型名字,()中是要传入的参数,一般是类的构造函数需要传入的参数类型。

const_cast<type_name> (expression)

type_name 是要转换成的类型,expression是待转换的表达式,有如下例子

High bar;

const High * pbar = &bar;

...

High * pb = const_cast<High *> (pbar); // valid

const Low * pl = const_cast<const Low *> (pbar); // invalid

Type_name 和expression必须是同一个类型,上例子中High和Low是两个类,第一个例子的转换目的是使pb*能改变对象bar的值(去const).第二个例子是不行的,因为它试图将  const High * 类型转换成 const Low *。

使用这个运算符的原因是,有时候您可能需要一个值大多数情况下是不变的,但有时也会需要改变。在这种情况下,你可以将值声明为const并在需要更改值时使用const_cast。

当然也可以使用通用的类型转换,如下;

High bar;

const High * pbar = &bar;

...

High * pb = (High *) (pbar); // valid

Low * pl = (Low *) (pbar); // also valid

但是同时改变数据类型和稳定性或许会导致编程错误,使用const_cast应该会安全些。const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量,或者把const属性去掉。

static_cast < type-name > (expression)

只有当type_name可以隐式转换为相同的类型时,表达式有效。否则,类型转换就是一个错误。假设High是Low的基类,而Pond是一个不相关的类。然后从High到Low的转换和从Low到High是有效的,但是从Low到Pond的转换是不允许的 。

High bar;

Low blow;

...

High * pb = static_cast<High *> (&blow); // valid upcast

Low * pl = static_cast<Low *> (&bar); // valid downcast

Pond * pmer = static_cast<Pond *> (&blow); // invalid, Pond unrelated

这里的第一个转换是有效的,因为可以显式地执行向上转换。第二个从基类指针到派生类指针的转换没有显式的类型转换是无法实现的,但是因为在另一个方向上不需要强制的类型转换就可以转换,因此使用 static_cast下行转换是有效的。

类似地,因为枚举值可以在不使用强制转换的情况下转换为整数类型cast,所以,可以使用static_cast将整数类型转换为枚举值。还可以使用static_cast将double转换为int,将float转换为long和执行各种其他数值转换。

(以上摘自c++ primer plus 6)

猜你喜欢

转载自blog.csdn.net/cindywry/article/details/82772690
C11