📜  为什么覆盖全局 new运算符和特定于类的运算符不会有歧义?(1)

📅  最后修改于: 2023-12-03 15:36:00.872000             🧑  作者: Mango

为什么覆盖全局 new 运算符和特定于类的运算符不会有歧义?

在 C++ 中,new 运算符用于在堆上动态分配内存。当我们需要自定义一个类的内存管理时,可以通过覆盖类的 new 运算符来实现。那么,如果我们同时覆盖全局的 new 运算符,会不会引起歧义呢?

答案是否定的。因为全局的 new 运算符和类特定的 new 运算符是不同的东西。全局的 new 运算符用于分配任何类型的内存,而类特定的 new 运算符仅用于分配特定类的对象。

为了说明这一点,我们来看一个例子。假设我们有一个名为 MyClass 的类,它有一个自定义的 new 运算符:

class MyClass {
public:
  void* operator new(size_t size) {
    std::cout << "Custom new operator called" << std::endl;
    void* ptr = std::malloc(size);
    return ptr;
  }
};

在这里,我们覆盖了 MyClassnew 运算符,使其输出一条信息并使用 std::malloc 函数来分配内存。

现在,假设我们在 main 函数中创建一个 MyClass 对象:

int main() {
  MyClass* obj = new MyClass;
  return 0;
}

由于我们已经覆盖了 MyClassnew 运算符,所以程序将输出:

Custom new operator called

现在,让我们来测试一下全局的 new 运算符是否会被调用。我们可以使用 ::new 运算符来分配内存,它使用的是全局的 new 运算符:

int main() {
  MyClass* obj1 = new MyClass;
  MyClass* obj2 = ::new MyClass;
  return 0;
}

在这里,我们分别使用了类特定的 new 运算符和全局的 new 运算符。程序只会输出一次信息:

Custom new operator called

这是因为全局的 new 运算符和类特定的 new 运算符不会有任何冲突或重叠,它们各自负责不同的内存分配任务。

因此,覆盖全局的 new 运算符和类特定的 new 运算符不会有歧义。在 C++ 中,它们被视为不同的运算符,它们各自的作用范围也是不同的。