Cast运算子是
一元运算符
强制将一种数据类型转换为另一种数据类型。
C ++支持四种类型的转换:
1.静态转换2.动态转换3.常量转换4.重新解释转换
静态演员表:
这是可以使用的最简单的类型转换。它是一个
编译时间
它的作用类似于类型之间的隐式转换(例如int到float或指向void *的指针), 它还可以调用显式转换函数(或隐式函数)。
例如
#include <iostream>
using namespace std;
int main()
{
float f = 3.5;
int a = f; // this is how you do in C
int b = static_cast < int >(f);
cout << b;
}
输出如下:
3
现在, 让我们对代码进行一些更改。
#include <iostream>
using namespace std;
int main()
{
int a = 10;
char c = 'a' ;
// pass at compile time, may fail at run time
int * q = ( int *)&c;
int * p = static_cast < int *>(&c);
return 0;
}
如果编译代码, 则会出现错误:
[Error] invalid static_cast from type 'char*' to type 'int*'
这意味着即使你认为可以将一个特定对象转换为另一个对象, 但非法, static_cast将不允许你执行此操作。
让我们举一个在类之间来回转换对象的例子。
#include <iostream>
#include <string>
using namespace std;
class Int {
int x;
public :
Int( int x_in = 0)
: x{ x_in }
{
cout << "Conversion Ctor called" << endl;
}
operator string()
{
cout << "Conversion Operator" << endl;
return to_string(x);
}
};
int main()
{
Int obj(3);
string str = obj;
obj = 20;
string str2 = static_cast <string>(obj);
obj = static_cast <Int>(30);
return 0;
}
运行上面的代码:
Conversion Ctor called
Conversion Operator
Conversion Ctor called
Conversion Operator
Conversion Ctor called
让我们尝试了解以上输出:
- 什么时候对象被创建, 然后调用构造函数, 在我们的例子中, 该构造函数也是转换构造函数(对于C ++ 14规则, 是位更改)。
- 创建时str在......之外对象, 编译器不会因为我们定义了Conversion运算符而引发错误。
- 当你做obj = 20, 实际上是在调用转换构造函数。
- 当你做str2在......之外static_cast, 它非常类似于字符串str = obj;, 但要进行严格的类型检查。
- 当你写obj = static_cast <Int>(30), 你正在将30转换为int使用static_cast。
让我们以涉及继承的示例为例。
#include <iostream>
using namespace std;
class Base {
};
class Derived : public Base {
};
int main()
{
Derived d1;
Base* b1 = (Base*)(&d1); // allowed
Base* b2 = static_cast <Base*>(&d1);
return 0;
}
上面的代码将编译而没有任何错误。
- 我们收到了d1并明确地将其投射到基础并存储在b1.
- 我们收到了d1并使用static_cast将其转换为基础并存储在b2.
我们知道static_cast会执行严格的类型检查, 让我们稍微更改一下代码以查看一下:
#include <iostream>
using namespace std;
class Base {
};
class Derived : private Base { // Inherited private/protected not public
};
int main()
{
Derived d1;
Base* b1 = (Base*)(&d1); // allowed
Base* b2 = static_cast <Base*>(&d1);
return 0;
}
尝试编译以上代码, 你看到了什么??编译错误!
[Error] 'Base' is an inaccessible base of 'Derived'
上面的代码将不编译即使你继承为protected。因此, 要使用static_cast, 请将其继承为public。
使用static_cast强制转换为"往返"无效指针。
#include <iostream>
int main()
{
int i = 10;
void * v = static_cast < void *>(&i);
int * ip = static_cast < int *>(v);
return 0;
}
被认为是行业中最受欢迎的技能之一, 我们拥有自己的编码基础C ++ STL通过激烈的问题解决过程来训练和掌握这些概念。