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*,不会调用构造函数

 

 

posted @ 2019-04-10 23:11  风不再来  阅读(138)  评论(0编辑  收藏  举报