创建新对象时,使用运算符 new函数分配内存,然后调用构造函数来初始化内存。在这里, new运算符同时进行分配和初始化,而运算符new 只进行分配。
让我们看看这两者是如何单独工作的。
新关键字
new运算符是一个运算符,表示请求在堆上分配内存。如果有足够的内存可用,new运算符初始化内存并将新分配和初始化的内存的地址返回给指针变量。当您使用 new 关键字(normal new)创建类对象时。
- 对象的内存使用来自堆的运算符new分配。
- 调用类的构造函数以正确初始化此内存。
// CPP program to illustrate
// use of new keyword
#include
using namespace std;
class car
{
string name;
int num;
public:
car(string a, int n)
{
cout << "Constructor called" << endl;
this ->name = a;
this ->num = n;
}
void enter()
{
cin>>name;
cin>>num;
}
void display()
{
cout << "Name: " << name << endl;
cout << "Num: " << num << endl;
}
};
int main()
{
// Using new keyword
car *p = new car("Honda", 2017);
p->display();
}
输出:
Constructor called
Name: Honda
Num: 2017
运营商新
运算符 new 是一个分配原始内存的函数,在概念上有点类似于 malloc()。
- 它是覆盖默认堆分配逻辑的机制。
- 它不初始化内存,即不调用构造函数。但是,在我们重载的 new 返回之后,编译器也会在适用的情况下自动调用构造函数。
- 也可以全局或为特定类重载运算符 new
// CPP program to illustrate
// use of operator new
#include
#include
using namespace std;
class car
{
string name;
int num;
public:
car(string a, int n)
{
cout << "Constructor called" << endl;
this->name = a;
this->num = n;
}
void display()
{
cout << "Name: " << name << endl;
cout << "Num: " << num << endl;
}
void *operator new(size_t size)
{
cout << "new operator overloaded" << endl;
void *p = malloc(size);
return p;
}
void operator delete(void *ptr)
{
cout << "delete operator overloaded" << endl;
free(ptr);
}
};
int main()
{
car *p = new car("HYUNDAI", 2012);
p->display();
delete p;
}
输出:
new operator overloaded
Constructor called
Name:HYUNDAI
Num:2012
delete operator overloaded
新运算符与新运营运算符
- 运算符 vs函数: new 既是运算符是关键字,而运算符new 只是一个函数。
- new 调用“Operator new”: “new 运算符”调用“运算符 new()”,就像+ 运算符调用运算符 +()一样
- “Operator new”可以被重载: Operator new 可以被重载,就像允许我们执行自定义任务的函数一样。
- 内存分配: ‘new expression’ 调用’ 运算符 new’ 来分配原始内存,然后调用构造函数。
想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程。