如何实现C++"新"运算符
How is the C++ 'new' operator implemented
Class B;
B *b = new B(); // default constructor
B *b1 = new B(10); // constructor which takes an argument B(int x)
但是,如果我们想编写new
的自定义版本,语法是
Class B
{
/*...*/
static void* operator new(size_t size);
}
如何将语句new B()
转换为函数调用 operator new(sizeof(B))
?
跟踪要调用哪个构造函数,即它如何区分new B()
和new B(int x)
?
new
是否在C++中实现为宏?
你的问题应该是:
当
B::operator new
语法相同时,编译器如何区分new B()
和new B(10)
?
好吧,new
只是分配内存,然后编译器立即插入对构造函数的调用。所以不管你叫new B
、new B()
还是new B(10)
。
编译器解释如下内容:
B *b = static_cast<B*>(B::operator new(sizeof(B)))->B();
B *b1 = static_cast<B*>(B::operator new(sizeof(B)))->B(10);
实际上,构造函数不返回任何内容。但上面的伪代码只是内部内容的类比表示。
调用哪个构造函数的问题是基于参数列表的重载解析问题,类似于任何重载函数调用。在出现新 B(...( 的站点,所有信息都可用。编译器可以解析对类 B(名称查找(的引用,并查看可用的构造函数组合,还可以查看 B 具有自定义内存分配器机制。编译器可以发出代码以使用该内存分配器获取空间(传入 B 的大小(,然后调用相应的构造函数代码来初始化该空间中的对象。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<