📜  C++中的static_cast |类型转换运算符

📅  最后修改于: 2021-05-30 08:26:15             🧑  作者: Mango

转换运算符是这些力一种数据类型转换成另一种数据类型的一元运算运算符
C++支持四种类型的转换:

静态投射:这是可以使用的最简单的投射类型。这是一个编译时强制转换,它可以进行类型之间的隐式转换(例如int到float或指向void *的指针),还可以调用显式转换函数(或隐式函数)。
例如

#include 
using namespace std;
int main()
{
    float f = 3.5;
    int a = f; // this is how you do in C
    int b = static_cast(f);
    cout << b;
}

输出:

3

现在,让我们对代码进行一些更改。

#include 
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(&c);
    return 0;
}

如果编译代码,则会收到错误消息:

[Error] invalid static_cast from type 'char*' to type 'int*'

这意味着,即使您认为可以通过某种方式将特定对象转换为另一个对象,但非法,static_cast也不会让您这样做。

让我们再举一个将对象与类进行相互转换的示例。

#include 
#include 
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(obj);
    obj = static_cast(30);
    return 0;
}

运行上面的代码:

Conversion Ctor called
Conversion Operator
Conversion Ctor called
Conversion Operator
Conversion Ctor called

让我们尝试了解以上输出:

  1. 创建obj时,将调用构造函数,在我们的情况下,该构造函数也是转换构造函数(对于C++ 14规则,已进行位更改)。
  2. 当您从obj创建str时,编译器将不会抛出错误,因为我们已经定义了Conversion运算符。
  3. 当使obj=20 ,实际上是在调用转换构造函数。
  4. 当使用static_cast制作str2时,它与string str=obj;非常相似string str=obj; ,但要进行严格的类型检查。
  5. 当您编写obj=static_cast(30) ,您正在使用static_cast将30转换为Int

让我们以涉及继承的示例为例。

#include 
using namespace std;
class Base {
};
class Derived : public Base {
};
int main()
{
    Derived d1;
    Base* b1 = (Base*)(&d1); // allowed
    Base* b2 = static_cast(&d1);
  
    return 0;
}

上面的代码将编译而没有任何错误。

  1. 我们获取了d1地址,并将其显式转换为Base并将其存储在b1
  2. 我们获取了d1地址,并使用static_cast将其转换为Base并将其存储在b2

我们知道static_cast执行严格的类型检查,让我们稍微更改一下代码以查看一下:

#include 
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(&d1);
    return 0;
}

尝试编译上面的代码,您看到了什么??编译错误!!!!!

[Error] 'Base' is an inaccessible base of 'Derived'

即使您继承protected ,上述代码也不会编译。因此,要使用static_cast,请将其继承为public。

使用static_cast强制转换为空指针。

#include 
int main()
{
    int i = 10;
    void* v = static_cast(&i);
    int* ip = static_cast(v);
    return 0;
}
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”