1. 隐式调用(Implicit Invocation)
-
定义:编译器在特定场景下自动插入的函数调用,无需程序员显式写出调用代码。
-
常见场景:
-
构造/析构函数:对象创建/销毁时自动调用。
-
类型转换:隐式类型转换触发转换函数(如
operator T())。 -
运算符重载:使用运算符(如
+,=)时自动调用对应函数。 -
拷贝/移动语义:传递对象时自动调用拷贝/移动构造函数。
class MyClass { public: MyClass() { std::cout << "构造函数隐式调用\n"; } ~MyClass() { std::cout << "析构函数隐式调用\n"; } operator int() const { return 42; } // 隐式类型转换 }; int main() { MyClass obj; // 隐式调用构造函数 int num = obj; // 隐式调用 operator int()(类型转换) return 0; // 作用域结束,隐式调用析构函数 }构造函数隐式调用 析构函数隐式调用2. 显式调用(Explicit Invocation)
-
定义:程序员主动编写代码直接调用函数或操作。
-
常见场景:
-
直接调用成员函数:
obj.func() -
使用
new/delete手动管理内存。 -
强制类型转换(如
static_cast)。class Calculator { public: int add(int a, int b) { return a + b; } }; int main() { Calculator calc; int result = calc.add(3, 4); // 显式调用 add 函数 std::cout << result; // 输出 7 return 0; }关键区别总结
特性 隐式调用 显式调用 触发方式 编译器自动插入 程序员手动编写代码 代码可见性 无直接调用代码 有明确的调用语句(如 func())典型场景 构造/析构、类型转换、运算符重载 普通函数调用、手动资源管理 控制权 由编译器控制 由程序员控制 explicit关键字用于禁止隐式转换(如 explicit Constructor)不适用
-
-
1万+

被折叠的 条评论
为什么被折叠?



