C++学习之new运算符和静态成员
目录
1.new运算符的基本使用
2.new运算符的注意事项
3.new运算符开辟数组
4.静态成员变量
5.静态成员函数
6.单例模式
7.主席类案例
8.打印机类案例
1.new运算符的基本使用
说明: 我们知道在C语言中,数组一旦声明,就确定了内存的大小,如果想动态进行扩展,就需要自己实现动态数组,将数组创建在堆区。 C中提供了标准函数 malloc、calloc和realloc可以将数据开辟在堆区,free可以释放堆区数据 利用C的方式如果想在C++中实现动态数组的创建我们需要做以下几件事: 计算好数组的大小后,再利用malloc进行申请 malloc返回void*,C++不允许直接给void*赋值到其他类型的指针,需要强转 malloc代码写好后,需要检测内存是否申请成功,进行判断 一些初始化和释放的函数需要手动进行调用,如果忘记则出错 结论: C语言中的动态分配内存较为复杂,因此我们推荐在C++中使用new和delete运算符
说明: delete用于释放new出来的内存,先调用析构函数,然后释放内存。 正如new表达式返回一个指向对象的指针一样,delete需要一个对象的地址。 delete只适用于由new创建的对象。 如果使用一个由malloc或者calloc或者realloc创建的对象使用delete,这个行为是未定义的。因为大多数new和delete的实现机制都使用了malloc和free,所以很可能没有调用析构函数就释放了内存。 如果正在删除的对象的指针是NULL,将不发生任何事,因此建议在删除指针后,立即把指针赋值为NULL,以免对它删除两次,对一些对象释放两次可能会产生错误
2.new运算符的注意事项
区别: 1、malloc是C创建堆区数据的库函数,new是C++创建堆区数据的运算符 2、malloc对应释放的库函数是free,new对应释放的运算符是delete ,不可以混用 3、malloc返回值是void*, new返回创建对象的指针类型 4、malloc不会调用构造,free不会调用析构,new自动调用构造函数,delete自动调用析构函数 5、malloc需要显式地指出所需内存的大小,new申请内存分配时无需指定内存块的大小,编译器会根据类型自行计算。
3.new运算符开辟数组
说明: 利用new在堆区开辟数组很简单,在类型后面加上中括号,并在中括号中写好数组长度即可 举例: int * pInt = new int[10]; //在堆区开辟10个int类型大小的数组 double* pDouble = new double[10]; //在堆区开辟10个double类型大小的数组 char * pChar = new char[10]; //在堆区开辟10个char类型大小的数组 Person * pArray = new Person[10]; //在堆区开辟10个Person类型大小的数组 注:创建自定义数据类型时,该类型必须有默认构造函数,否则创建失败
4.静态成员变量
说明: 在一个类中,若将一个成员变量前声明为static,这种成员称为静态成员变量。 特点: 与普通成员变量不同,静态成员只有一份,它不属于某个对象,而属于某个类,被所有对象共享 静态成员变量在编译阶段就分配空间,也就是对象还没有创建时,就已经分配空间 静态成员变量必须在类内声明,在类外初始化 静态成员变量可以通过对象或者类名两种方式进行访问 静态成员变量也有访问权限
5.静态成员函数
说明: 在一个类中,若将一个成员函数前声明为static,这种成员称为静态成员函数。 特点: 静态成员函数也只有一份,被所有对象共享 静态成员函数只能访问静态成员变量,而不能访问非静态成员变量 普通成员函数即可以访问静态成员变量,也可以访问非静态成员变量 静态成员函数可以通过对象或者类名两种方式进行访问 静态成员函数也有访问权限
6.单例模式
说明: 单例模式是一种常用的软件设计模式。 在它的核心结构中,只包含一个被称为单例的特殊类。 通过单例模式可以保证系统中一个类只有一个对象,而且该对象易于外界访问,且共用此对象 如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案
7.主席类案例
实现步骤如下: 1、默认构造函数私有化 2、拷贝构造函数私有化 3、私有作用域下,类内声明静态成员指针,类外将指针初始化指向new出的主席对象 4、公共作用域下,提供获取主席指针的唯一接口 5、外界测试接口即可
8.打印机类案例
实现步骤如下: 1、默认构造函数私有化 2、拷贝构造函数私有化 3、私有作用域下,类内声明静态成员指针,类外将指针初始化指向new出的打印机对象 4、公共作用域下,提供获取打印机指针的唯一接口 5、外界测试接口即可 思考: 单例模式对象,是否需要管理释放? 解答: 单例模式由于被共享,释放时机不确定,通常无需管理释放,当程序执行结束会由系统管理释放 而且单例模式对象本身只有1个,不会占用大量内存空间。