【C ++中的static_cast |类型转换运算符】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 calledConversion OperatorConversion Ctor calledConversion OperatorConversion 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.
#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通过激烈的问题解决过程来训练和掌握这些概念。
推荐阅读
- 单字母密码和多字母密码有什么区别()
- HTML如何使用标题(h标签用法代码示例)
- 如何打印三角形分隔的图案()
- 如何使用jQuery选择文本节点()
- 云计算介绍和教程指南
- Python程序从列表中查找N个最大元素
- 亚马逊专题面试经验分析|S7
- Django中的视图如何使用(开发示例 | Python)
- Java中的锯齿数组如何使用(示例)