97.隐式转换,如何消除隐式转换?

97.隐式转换,如何消除隐式转换?

消除隐式转换,本质就是:让类型必须严格匹配,不允许编译器自动帮你转。

一、什么是隐式转换

编译器自动、静默做的类型转换,比如:

void f(int x);
f(3.14);    // double → int,隐式转换

Base* p = new Derived;  // 派生类→基类,隐式向上转换

二、如何消除 / 禁止隐式转换

1. 禁止单参数构造函数的隐式类型转换

explicit 关键字

class A {
public:
    explicit A(int x) {}  
};

A a1(10);  // OK
A a2 = 10; // 错误!禁止隐式 int → A

这是消除隐式转换最经典、最常考的一条。

2. 消除数值之间的隐式转换

全部显式写转换,不依赖自动提升 / 截断

int   i = 3.14;     // 隐式 double→int,不好

int   i = static_cast<int>(3.14); // 显式,消除隐式

3. 消除派生类→基类的隐式转换

这种向上转型本来就是安全的,C++ 不提供语法直接禁止。

真要 “消除”,只能从设计上避免:

  • 不用继承
  • 不用基类指针 / 引用指向派生类对象

4. 消除数组→指针的隐式退化

C++ 无法完全消除,但可以用引用避免退化:

void f(int (&arr)[5]); // 只接受 int[5],不会退化为 int*

5. 消除条件里隐式转 bool

C++11 以后用 explicit operator bool()

struct Test {
    explicit operator bool() const { return true; }
};

Test t;
if (t) { }        // OK
bool b = t;       // 错误!不允许隐式转换

三、总结一句话(面试背诵版)

  1. 消除构造函数隐式转换:用 explicit
  2. 消除数值隐式转换:用 static_cast 显式转换
  3. 消除自定义类型转 bool:用 explicit operator bool
  4. 其他如整型提升、派生类转基类是安全隐式转换,一般不强行消除。
posted @ 2023-07-11 15:35  CodeMagicianT  阅读(948)  评论(0)    收藏  举报