首页 > 编程语言 >C++new和delete运算符介绍

C++new和delete运算符介绍

时间:2023-09-15 22:35:10浏览次数:39  
标签:double C++ 运算符 重载 new delete size

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

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

C++new和delete运算符介绍_成员函数

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 则表示所需要分配的所有空间的总和。

C++new和delete运算符介绍_全局函数_02

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++new和delete运算符介绍_全局函数_03

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();

标签:double,C++,运算符,重载,new,delete,size
From: https://blog.51cto.com/u_15641375/7487931

相关文章

  • WebRTC C++ RTP over TCP配置
    前言RTPoverTCP这种情况,一般是WebRTCP2P打洞失败,才会选择WebRTC默认使用UDP传输,但是也可以通过TCP传输。使用TCP传输,需要服务器中转,turnserver,licode,janus之类的服务器解决方案搭建coTurn中转服务器https://blog.51cto.com/fengyuzaitu/7265986C++修改代码url后面必须指定?t......
  • 【从零学习python 】07.Python运算符详解:赋值、比较和逻辑运算符
    赋值运算符基本赋值运算符运算符描述实例=赋值运算符把=号右边的结果赋给左边的变量,如num=1+2*3,结果num的值为7单个变量赋值:num=10num同时为多个变量赋值(使用等号连接):a=b=4ab多个变量赋值(使用逗号分隔):num1,f1,str1=100,3.14......
  • APC进程注入C++示例和检测思考
    直接贴C++代码效果:apc注入到pid为39712的进程procexp可以看到注入的DLL! 好了,我们看看代码如何写:注入部分//inject3.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。#include<iostream>#include<Windows.h>#include<TlHelp32.h>usingnamespacestd;......
  • C++对一个map进行for(auto it : ....)特别慢
    使用注释掉的代码就特别慢,超级慢intfind_task=0;std::map<std::string,std::map<unsignedint,std::vector<std::string>>>::iteratorgit;git=g_m_task_files.find(task_id);//for(autoit:g_m_task_files)if(git!=g_m_task_files.end())......
  • C++11中的智能指针shared_ptr、weak_ptr源码解析
    https://www.jb51.net/article/224028.htm−目录1、前言2、源码准备3、智能指针概念4、源码解析4.1、shared_ptr解析4.1.1、shared_ptr4.1.2、__shared_ptr4.1.3、__shared_count4.1.4、_Sp_counted_base4.1.5、_Sp_counted_ptr4.1.6、shared_ptr总结4.2、weak......
  • C++之单例模式(6千字长文详解)
    单例模式什么是单例模式单例模式是设计模式的一种设计模式:设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时......
  • C++ 进阶汇总 [持续更新-建议收藏]
    1.lambda表达式```cpp#include<functional>#include<iostream>intmain(){std::function<void(void)>fun=[](){inta=1;std::cout<<a<<std::endl;};fun();}```2.using类内函数指针重命名[相同类型不同函数,放置到std::map......
  • C++ sizeof 杂谈
    原来sizeof是一个特殊的,运算优先级很高的一种运算符?之前一直都不知道。参考博客:c++中sizeof()的用法介绍C++学习杂谈:sizeof(string)到底是多少?优先级作为一个运算符,sizeof自然也是有优先级的,它在C++中优先级为\(3\),也就是除了作用域解析运算符和诸如括号的操作符,它优......
  • 设计模式 C++
    (设计模式)(李建忠C++)23种设计模式组件协作模板方法父类中定义组件(函数)的调用流程,每个组件使用虚函数进行实现,然后子类中可以重写父类中虚函数的实现。如果我们发现一个算法的组件(函数)的调用流程都是一样的,但是步骤中的各个组件的实现可能有所差异,此时会使用模板方法。【......
  • 3.4 Java赋值运算符(=)
    赋值运算符是指为变量或常量指定数值的符号。赋值运算符的符号为“=”,它是双目运算符,左边的操作数必须是变量,不能是常量或表达式。其语法格式如下所示:变量名称=表达式内容在 Java 语言中,“变量名称”和“表达式”内容的类型必须匹配,如果类型不匹配则需要自动转化为对应的类型......