在 C++ 表达式的末尾键入名称;

Type name at the end of c++ expression;

我正在学习c++运算符重载,遇到过这段代码

/*Global overloading*/
void* operator new(size_t size, char c) {
    cout<<"overloaded"<<endl;
    void * ptr;
    ptr = malloc(size);

    if(ptr != NULL) {
        *((char*) ptr) = c;
    }

    return ptr;
}

int main() {
    char * c = new('k') char;

    cout<<*c<<endl;
    return 0;
}

特别是,函数 main 第一行末尾的名称 char 对我来说很奇怪。请问这是什么表达方式,怎么理解?

new 是一个运算符,可以选择接受参数。通常这个参数将是一个指向应该构造对象的内存的指针(放置新的),但在这种情况下,您正在定义一个 new 运算符,它接受一个 char 作为参数,然后继续在 main 中以 'k' 作为参数使用它。整个表达式 new(...) 用作此上下文中的运算符,后跟您习惯构造的类型。调用 operator new.

的指定重载实际上只是 new char 的变体

注意new(...) type不只是分配内存,它还会调用type的构造函数,不能重载修改。 operator new() 函数仅用于提供构造对象的内存。对于 char 类型,这不相关,但对于 class 类型,它是相关的。

典型用法是使用接受指向某些内存的指针的重载,并且 returns 该指针逐字(放置新的),允许调用代码提供自己的内存,如下所示:

char* incompletelyConstructedArray = new char[allocSize];
elementType* element = new(&incompletelyConstructedArray[elementLocation]) elementType;

这会在上面分配的内存区域内构造一个 elementType 类型的对象。 std::vector<> 需要在后台执行此操作以避免在增加其内部内存时默认构造对象。但是普通用户代码应该幸福地不知道 new() 甚至存在...