经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++面试八股文:static_cast了解一下?
来源:cnblogs  作者:二进制架构  时间:2023/6/21 10:52:37  对本文有异议

某日二师兄参加XXX科技公司的C++工程师开发岗位第20面:

面试官:C++中支持哪些类型转换?

二师兄:C++支持C风格的类型转换,并在C++11引入新的关键字规范了类型转换。

二师兄:C++11引入四种新的类型转换,分别是static_castdynamic_castconst_cast、和reinterpret_cast

二师兄:static_cast用途最广泛,除了后面三种类型转换外,其他的类型转换都能使用static_cast完成。

二师兄:dynamic_cast主要用于运行时的从父类指针向子类指针转换,如果转换不成功则返回nullptr

  1. #include <iostream>
  2. struct Base
  3. {
  4. virtual void fun() {}
  5. };
  6. struct Derived : public Base
  7. {
  8. virtual void fun() override {}
  9. };
  10. int main(int argc, char const *argv[])
  11. {
  12. Base* b1 = new Base;
  13. Base* b2 = new Derived;
  14. Derived* d1 = dynamic_cast<Derived*>(b1); //d1 == nullptr
  15. Derived* d2 = dynamic_cast<Derived*>(b2); //d2 != nullptr
  16. }

二师兄:const_cast主要用于去除指针或引用类型的const属性。此操作可能会导致未定义的行为,所以需要慎用。

  1. #include <iostream>
  2. void function(const int& val)
  3. {
  4. int& v = const_cast<int&>(val);
  5. v = 42;
  6. }
  7. int main(int argc, char const *argv[])
  8. {
  9. int val = 1024;
  10. function(val);
  11. std::cout << val << std::endl; //val == 42
  12. }
  13. //-----------------------------------------------
  14. #include <iostream>
  15. static constexpr int val_static = 1024;
  16. void function(const int& val)
  17. {
  18. int& v = const_cast<int&>(val);
  19. v = 42;
  20. }
  21. int main(int argc, char const *argv[])
  22. {
  23. function(val_static);
  24. std::cout << val_static << std::endl;
  25. }
  26. // Segmentation fault

二师兄:reinterpret_cast可以将指针或引用转换为任何类型的指针或引用。reinterpret_cast实现依赖于编译器和硬件,可能导致未定义的行为。

  1. #include <iostream>
  2. int main(int argc, char const *argv[])
  3. {
  4. int i = 42;
  5. double d = 42.0;
  6. long* l1 = reinterpret_cast<long*>(&i);
  7. long* l2 = reinterpret_cast<long*>(&d);
  8. std::cout << *l1 << std::endl; //*i1 == 42
  9. std::cout << *l2 << std::endl; //*i2 == 4631107791820423168 X86_64 GCC 11.3
  10. }

面试官:好的。既然已经有C风格的类型转换,C++11为什么还要引入新的类型转换关键字?

二师兄:主要有三点,更安全、更灵活、可读性更好。

面试官:知道什么是隐式转换吗?

二师兄:了解一些。隐式转换是指在表达式中自动进行的类型转换。比如intdouble相加,会把int先转为double,然后再进行求和。

面试官:隐式转换有哪些优势和缺陷?

二师兄:隐式转换的优势是代码简洁。但是有很大缺陷,有些情况隐式转换的结果和程序员的意图不一致,会导致难以发现的问题。所以在实际项目中一般会添加编译选项-Werror=conversion来禁止隐式转换。

面试官:那你知道explicit关键字有什么作用吗?

二师兄:也是禁止隐式转换的一个方式:

  1. struct Foo
  2. {
  3. Foo(int i):val_(i){}
  4. int val_;
  5. };
  6. struct Goo
  7. {
  8. explicit Goo(int i):val_(i){}
  9. int val_;
  10. };
  11. void function1(Foo f){}
  12. void function2(Goo g){}
  13. int main(int argc, char const *argv[])
  14. {
  15. Foo f = 1024; //编译通过,可以把int类型转换成Foo
  16. Goo g = 1024; //编译失败,不能把int类型转换成Goo
  17. function1(42); //编译通过,可以把int类型转换成Foo
  18. function2(42); //编译失败,不能把int类型转换成Goo
  19. }

面试官:如何把一个自定义类型转换成一个int类型?

二师兄:需要重载operator int()运算符:

  1. #include <iostream>
  2. struct Foo
  3. {
  4. Foo(double d):val_(d){}
  5. double val_;
  6. explicit operator int(){
  7. return static_cast<int>(val_);
  8. }
  9. };
  10. int main(int argc, char const *argv[])
  11. {
  12. Foo f(42.5);
  13. int i = static_cast<int>(f);
  14. std::cout << i << std::endl; //i == 42
  15. }

面试官:好的,回去等消息吧。

今天二师兄表现棒极了,晚上必须加个鸡腿。感谢小伙伴的耐心阅读。二师兄的C++面试之旅,明天继续。

关注我,带你21天“精通”C++!(狗头)

原文链接:https://www.cnblogs.com/binarch/p/17495144.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号