写点什么

C++new 和 delete 运算符介绍

作者:向阳逐梦
  • 2023-09-15
    四川
  • 本文字数:1367 字

    阅读完需:约 4 分钟

C++new和delete运算符介绍

内存管理运算符 new、new[]、delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数。一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内存时才会重载。

以成员函数的形式重载 new 运算符:


void * className::operator new( size_t size ){    //TODO:}
复制代码

以全局函数的形式重载 new 运算符:

void * operator new( size_t size ){    //TODO:}
复制代码

两种重载形式的返回值相同,都是void *类型,并且都有一个参数,为size_t类型。在重载 new 或 new[] 时,无论是作为成员函数还是作为全局函数,它的第一个参数必须是 size_t 类型。size_t 表示的是要分配空间的大小,对于 new[] 的重载函数而言,size_t 则表示所需要分配的所有空间的总和。


size_t 在头文件 <cstdio> 中被定义为typedef unsigned int size_t;,也就是无符号整型。
复制代码

当然,重载函数也可以有其他参数,但都必须有默认值,并且第一个参数的类型必须是 size_t。同样的,delete 运算符也有两种重载形式。以类的成员函数的形式进行重载:

void className::operator delete( void *ptr){    //TODO:}
复制代码

以全局函数的形式进行重载:

void operator delete( void *ptr){    //TODO:}
复制代码

两种重载形式的返回值都是 void 类型,并且都必须有一个 void 类型的指针作为参数,该指针指向需要释放的内存空间。当我们以类的成员函数的形式重载了 new 和 delete 操作符,其使用方法如下:


    C * c = new C;  //分配内存空间    //TODO:    delete c;  //释放内存空间
复制代码

如果类中没有定义 new 和 delete 的重载函数,那么会自动调用内建的 new 和 delete 运算符。


在 C++ 中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。经过适当重载后,(类型名)对象这个对对象进行强制类型转换的表达式就等价于对象.operator 类型名(),即变成对运算符函数的调用。下面的程序对 double 类型强制转换运算符进行了重载。

    #include <iostream>    using namespace std;    class Complex    {        double real, imag;    public:        Complex(double r = 0, double i = 0) :real(r), imag(i) {};        operator double() { return real; }  //重载强制类型转换运算符 double    };    int main()    {        Complex c(1.2, 3.4);        cout << (double)c << endl;  //输出 1.2        double n = 2 + c;  //等价于 double n = 2 + c. operator double()        cout << n;  //输出 3.2    }
复制代码

程序的输出结果是:

1.2

3.2

第 8 行对 double 运算符进行了重载。重载强制类型转换运算符时,不需要指定返回值类型,因为返回值类型是确定的,就是运算符本身代表的类型,在这里就是 double。重载后的效果是,第 13 行的(double)c等价于c.operator double()。有了对 double 运算符的重载,在本该出现 double 类型的变量或常量的地方,如果出现了一个 Complex 类型的对象,那么该对象的 operator double 成员函数就会被调用,然后取其返回值使用。例如第 14 行,编译器认为本行中c这个位置如果出现的是 double 类型的数据,就能够解释得通,而 Complex 类正好重载了 double 运算符,因而本行就等价于:

double n = 2 + c.operator double();
复制代码


发布于: 刚刚阅读数: 6
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
C++new和delete运算符介绍_向阳逐梦_InfoQ写作社区