11月29日笔记C++3_类型转换,动态内存 new/delete,析构函数

9 篇文章 0 订阅

1、C++中的类型转换

    static_cast <type> (expression)                静态转换
    const_cast <type> (expression)                常量转换
    reinterpret_cast <type> (expression)       重解释转换
    dynamic_cast <type> (expression)           动态转换

    说明:
        type 目标类型名
        expression 待转换的表达式

    static_cast 
        用于基本类型之间的转换,如int和double, int和char
        例:

            double d = 3.14;
            int a = static_cast<int>(d);
            char c = static_cast<char>(a);

        用于int与enum之间的转换
        例:

        enum Color {RED, GREEN, BLUE};
        Color color = GREEN;
        cout << static_cast<int>(color) << endl;

        用于void*与其他*之间的转换
        例: 

            int* p = static_cast<int*>(malloc(4));
            *p = 100;

    const_cast 
        用于移除指针引用的底层const
        例: 
            const char* p = "hello world";
            char* p1 = const_cast<char*>(p);
            p1[0] = 'H'; // 从语法角度,可以通过p修改它指向的对象,但结果未知。


            const int a = 100; // 顶层const, 无法移除
            int* p = const_cast<int*>(&a);
            *p = 200;
            a == 100;


    reinterpret_cast 
        用于任意类型指针之间的转换,用于整数与指针之间的转换
        例: 
        double d = 3.14;
        int*p = reinterpret_cast<int*>(&d);
        *p = 4.14;
        double *d1 = reinterpret_cast<double*>(p);
        cout << *d1 << endl;

        已知一个地址,为0xff7788, 往这个地址中写一个整数值100
        int* p = reinterpret_cast<int*>(0xff7788);
        *p = 100;


    dynamic_cast 
        用于多态类型之间的转换。

2、动态内存 new/delete
    new和delete是C++中的运算符
    new 用来在堆空间中动态分配内存
    delete 用来释放动态内存

    语法格式:

        类名* 指针名 = new 类名; // 在堆空间中实例化一个对象
        类名* 指针名 = new 类名(初始值); // 在堆空间中实例化一个对象,同时初始化
        类名* 指针名 = new 类名[元素个数]; // 在堆空间中实例化一个对象数组

        delete 指针名;  // 释放单个对象
        delete [] 指针名; // 释放一组对象

    例: 
        int* p1 = new int;      // 分配4字节空间,返回首地址
        int* p2 = new int(100); // 分配4字节空间,返回首地址, 同时初始化
        int* p3 = new int[5];   // 分配了5个整数那么大的空间,返回数组首地址
        delete p1;
        delete p2;
        delete [] p3;

        Point* p4 = new Point;  // 实例化一个Point类型的对象,调用默认构造函数
        Point* p5 = new Point(100, 200);  // 实例化一个Point类型的对象,同时初始化
        delete p4;
        delete [] p5;

    特性:
        new能根据类型自动计算所需要的空间大小
        new返回的不是void*, 而是对应类型的指针。
        new在分配空间时,还能同时初始化。
        new失败时,抛出异常: bad_alloc
        new在实例化对象时,会自动调用构造函数。(*)
        delete 在销毁对象时,会自动调用析构函数。(*)


3、析构函数
    功能:用于销毁对象时清理对象所占用的资源
    特点:
        名称与类名相似,由波浪线+类名组成
            ~类名 
        没有返回类型,且没有参数(不能重载、不能设置默认值)
        当销毁对象时,自动调用
        如果没有显式的定义析构函数,编译器会自动生成。
            ~类名() {}

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值