C++语法详解之封装、构造函数、析构函数

2020-03-07 12:01:29于丽

大家先了解下什么是构造函数,什么是析构函数,作用是什么?

构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明的类中,是一个特殊的成员方法。作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声明一个。

析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。

下面在通过具体例子看下C++语法详解之封装、构造函数、析构函数。

成员变量私有化,提供公共的getter和setter给外界去访问成员变量

class Person {
 int age;
 
public:
 void setAge(int age){
  this->age = age;
 }
 
 int getAge(){
  return this->age;
 }
 
};

int main(){
 Person person;
 person.setAge(10);
 cout << person.getAge() << endl;
}

堆空间

在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存

堆空间的申请释放

malloc  free
new  delete
new []  delete []

注意

申请堆空间成功后,会返回那一段内存空间的地址 申请和释放必须是1对1的关系,不然可能会存在内存泄露

现在的很多高级编程语言不需要开发人员去管理内存(比如Java),屏蔽了很多内存细节,利弊同时存在

利:提高开发效率,避免内存使用不当或泄露 弊:不利于开发人员了解本质,永远停留在API调用和表层语法糖,对性能优化无从下手

例如开盘int类型的空间,使用完之后销毁

int *p = (int *)malloc(sizeof(int));
 *p = 10;
 free(p);
 
 int *p2 = new int;
 *p2 = 20;
 delete p2;
 
 int *p3 = new int[3];
 *p = 10;
 *(p+1) = 20;
 *(p+2) = 30;
 delete [] (p3);

堆空间的初始化

memset

memset 函数是将较大的数据结构(比如对象、数组等)内存清零的比较快的方法

如下所示

 Person person;
 person.age = 10;
 person.height = 199;
 //从person的地址开始,每个字节都赋值为0
memset(&person, 0, sizeof(person));

初始化

int *p1 = (int *)malloc(sizeof(int)); //*p1 未初始化
int *p2 = (int *)malloc(sizeof(int));
memset(p2, 0, sizeof(int));//将 *p2 的每一个字节都初始化为0

如下几种方式

int *p1 = new int;   //未初始化
int *p2 = new int();   //被初始化为0
int *p3 = new int(5);  //被初始化为5
int *p4 = new int[3];  //数组元素未被初始化
int *p5 = new int[3]();  //3个数组元素都被初始化0
int *p6 = new int[3]{};  //3个数组元素都被初始化0
int *p7 = new int[3]{5};  //数组首元素被初始化为5,其他元素被初始化为0