• C++入门篇九


    explicit关键字:防止构造函数隐式类型转换

    #include  <iostream>
    #include "pch.h"
    using  namespace   std;
    
    
    class  Person1 {
    public:
        explicit   Person1(  int  a) {//防止隐式构造函数的使用
            num = a;
        }
        int num;
    };
    void  test01() {
        //Person1  p1(10);//隐式类型转换,就是Person  p1=Person(10),调用的是有参构造函数,默认是使用隐式构造函数
      //如果使用了explicit的话,那么不能隐式类型转换
      Person1 p1(10);
    
    }
    int main() {
        test01();
    }

    运算符:new(重要):分配内存空间,delete释放内存空间

    函数:malloc

    new的运算符里,当用new创建对象的时候,它在堆区为对象分配内存并调用构造函数完成初始化,delete释放空间

    Person1* person = new  Person1;
    相当于
    Person1*  person = (Person1*)malloc * (sizeof(Person1));//Person1*强转
    if (person == Null) {
        return 0;
    }
    person->Init();//构造函数
    new操作符可以确定在调用构造哈数之前内存分配是成功的,所有不用显式确定调用是否成功

    栈区开辟:Person  p1

    堆区开辟:Person p2=new  Person;  释放delete  p2;(重要)

    #include "pch.h"
    #include  <iostream>
    using  namespace  std;
    
    class  Person {
    public:
        Person() {
            cout << "无参构造函数" << endl;
        }
    
        Person(int  a) {
    
        }
        ~Person()
        {
            cout << "析构函数调用" << endl;
        }
    };
    
    
    //第一种
    void  test01() {
        //Person  p1;//栈区开辟
    
        Person*  p2 = new Person;//堆区开辟
        //所有new出来的对象,都会返回该类型的指针,上面的是person,那就返回person类型的指针,运算符号
        //malloc会返回void*,还要进行强转
        //malloc不会调用构造函数,new会调用函数,malloc是一个函数,new是一个运算符
    
        //释放堆区的空间、
        delete  p2;//也就是释放析构的过程,逆序,delete也是一个运算符,malloc配合free来使用
    }
    
    
    //第二种
    void  test02() {
        //当void*接收new出来的指针,会出现释放的问题
        void*  p2 = new  Person;
        delete  p2;//使void*不会释放p2(析构函数)
    }
    
    //第三种
    void test03() {
    
    
        //通过new来开辟数组
        Person *  p3 =new   Person[10];//当有多个person对象的时候,前面要加*,开辟多个person对象出来
        //new开辟数组的话,一定会使用默认构造函数,如果没有默认构造函数的话,就会报错,所以一定要提供默认构造函数
    
    
        //在栈上面开辟数组的话,可以没有默认构造函数,指定的是有参构造函数
        //Person  p4[2] = { Person(3),Person(5) };//栈上开辟数组的话,可以不用有默认构造
    
    
    
        
    
        //释放数组,一定要加上一个[],指针指向的内存空间是否存在一个数组记录大小记录
        delete    []  p3;//加[]的目的是是记录数组大小记录,告诉他,有多少个对象数据,那么这个delete就知道几个对象数组,并且调用调用几次析构函数
    }
    int  main(
    ) {
    
        //test01();
        //test02();
        test03();
    }
    //使用new运算符来堆区开辟的话,一定会使用默认构造函数的,所以一定要提供默认构造函数

    没有delete释放之前(new):

    释放堆区数组之后,释放数组要加[],这样才知道要释放多少个对象数据,其他情况不用,delete  []   p3;

    总结:

    new运算符:

    Person *p=new Person;会返回一个Person指针
    默认调用构造函数,开辟空间,返回的不是void * ,不需要强制转换
    delete运算符释放
    new对象用void*去接收,释放不了对象
    new出来的数组的话,释放的话,delete [] xxx;
    new出来的是数组,肯定会调用默认构造

    malloc函数:
    malloc:返回的是void*,不会调用构造函数

     

  • 相关阅读:
    Exception in thread "main" java.lang.IllegalArgumentException:解决方法
    Warning: $HADOOP_HOME is deprecated.解决方法
    Android :TextView使用SpannableString设置复合文本
    一、harbor部署之centos7的基本配置
    木马基础知识要点
    【原创】红客闯关游戏部分题解
    【原创】利用Office宏实现powershell payload远控
    【原创】字典攻击教务处(BurpSuite使用)
    【原创】逆向练习(CrackMe)
    显式游标和隐式游标二者的区别
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/10686883.html
Copyright © 2020-2023  润新知