文章内容如下:
1)动态对象的创建
2)静态成员
一。动态对象的创建
动态对象的创建说白了就是去堆区创建一个对象,给这个对象分配空间是按照空间需求来分配的,说直白点就是要多少用多少,不至于空间大了浪费,空间小了溢出。C语言也有动态空间的开辟,但是不如C++好。C++创建对象一般发生2件事,给对象分配内存,构造函数初始化,析构函数清理。而C语言中的malloc,calloc,realloc紧紧是得到空间,一块空间没有初始化和释放是非常麻烦也是十分容易导致程序运行出错的。具体操作如下:
1. new创建动态对象
创建一个动态对象用如下指令
Person* person = new Persion;
Person* person = new Persion表示用new在堆区创建一块内存给对象Persion并初始化Person,并把地址给person。new是一个运算符,能自己确定调用构造函数初始化之前内存分配是成功的,不用显式确定调用是否成功,即我们通过判断new调用了构造函数就能判断内存开辟成功了。
2. delete释放动态对象
new和delete是成对出现的,delete动作有2步,第一步是调用析构函数进行清理,第二部是释放空间,C中free是不会调用析构函数的。需要注意一点的是,new开辟空间带[],那么delete释放也要带[],若new没有,那么delete也不需要有,即
int* ptr = new int;"""用new开辟出一个int空间,并把起始地址给ptr"""
delete ptr;"""释放ptr对应的一段int空间"""
int* ptr = new int[5];"""用new开辟出5个int空间(其实是连续的空间),并把起始地址给ptr"""
delete [] ptr;"""释放ptr对应的5个int空间"""
int* P2 = new int(5);"""用new开辟出一个int空间,并初始化为5,并把起始地址给P2"""
int* P2 = new int[5]{1,2,3};"""用new开辟出5个int空间(其实是连续的空间),并初始化为1,2,3,0,0,并把起始地址给P2"""
二。静态成员
类中有成员,分为成员变量和成员函数,类中的成员变量是独享的,类中的成员函数是共享的,类中的成员函数可以在类里面声明类外面定义,但是static修饰的成员变量也好,成员函数也罢,不论之前是否为独享或共享,此刻一律变为共享,变为共享之后,static修饰的类的成员必须在类里声明,类外初始化。
类中的成员被static修饰,这个成员就叫静态成员。类中的成员有成员变量和成员函数,所以类中的静态成员叫法有静态成员变量,静态成员函数。需要注意的是,不管这个类创建了多少个对象,静态成员都只有一个拷贝,这个拷贝被所有属于这个类的对象共享。
当static修饰类中的成员时,必须在类中定义,类外初始化。为什么一定要初始化,因为类中的静态成员是共有的,你创建一个类,这个静态成员马上就属于你,显然静态成员比类先存在,所以创建类之前,即编写class类之后,类还没实例化之前,要先初始化静态成员,那么怎么访问静态成员呢,即使你的类没有初始化对象,也能访问,只需要类名加冒号冒号加静态成员就可以访问,这种的前提是静态成员在公共端public这里,如下面这个例子。如果在私有端就不行了,那应该怎么处理呢?
遇到上述的这种情况就需要构建静态成员函数了,静态成员函数的意义在于,当静态成员在私有端外面访问不了时,由于静态成员函数和那个静态成员都属于类里面可以互相访问没有限制,通过静态成员函数读取这个静态成员并返回出去,这样就能读取私有端的数据了。不然的话需要类实例化对象读取这个变量返回出去才行,这样的话在类实例化之前这个静态成员还是访问不了的,从这句话也能看出,今天成员函数只能操作静态成员,不能操作普通成员。