在 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()
甚至存在...
我正在学习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()
甚至存在...