📜  C++中的new vs运算符

📅  最后修改于: 2021-05-30 18:50:02             🧑  作者: Mango

创建新对象时,将使用运算符new函数分配内存,然后调用构造函数以初始化内存。在这里,new运算符既执行分配操作又执行初始化操作,而new运算运算符仅执行分配操作。
让我们看看它们分别如何工作。

新关键字

新运算符是表示对堆进行内存分配请求的运算符。如果有足够的内存可用,则new运算符将初始化该内存,并将新分配和初始化的内存的地址返回给指针变量。当您使用new关键字(普通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()。

  • 它是覆盖默认堆分配逻辑的机制。
  • 它不会初始化内存,即不调用构造函数。但是,在我们重载了新的返回值之后,编译器也会在适用时自动调用构造函数。
  • 也有可能在全局范围内或针对特定类重载新的运算符
// 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

新运算符与新操作运算符

  1. 运营商VS函数:新的运算符,以及作为关键字,而运算符的新仅仅是一个函数。
  2. 新调用“新运算符”: “新运算符”调用“运算符new()”,就像+运算符调用运算符 +()的方式一样
  3. 可以重载“新操作员”:新操作员可以重载,就像允许我们执行自定义任务的功能一样。
  4. 内存分配: ‘new expression’调用’ 运算符 new’分配原始内存,然后调用构造函数。
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”