C++ 构造函数、析构函数和复制构造函数
时间比较紧张我就不按照之前的形式排版了,用于自己面试复习和知识分享。
构造函数是用于初始化对象的一种函数,他的名称和类名相同,没有返回值,构造函数可以重载,如果不存在构造函数,c++会自动生成无参数的构造函数,如果自己声明了构造函数,C++之中任然存在无参构造函数,除非使用者显示的删除无参构造函数,在C++11之中我们可以使用default显示的声明一个无参构造函数。
析构函数是一种对象结束生命周期时自动调用的函数,用于对进行了内存管理的对象进行释放,例如声明一个char* _name;在结束声明周期时自动将其释放(注意是所有的对象都会自动调用,只是没有需要释放资源的对象可能没有实际上的效果),一会儿针对这个例子给出对应的代码。
复制构造函数也叫拷贝函数,是一种用于将已存在的同类的不同对象的数据复制给另外一个对象的函数,一会儿针对这个例子给出对应的代码。(需要注意的是,复制构造函数必须是const的引用参数,因为如果不是引用则会陷入复制构造函数的无限循环之中)
由于我是Unity C#的客户端开发者,于是我会对C#与C++进行对比和总结。
对于构造函数,C#与C++都是大差不差,都是用于对象的初始化,也是方法名与类名相同,没有返回值的一种特殊方法,同样在不主动声明构造函数时存在无参构造函数,一旦开发者自定义了有参构造函数,无参构造函数则不复存在,如果还需要无参构造函数,则需要手动书写。
对于析构函数,C#之中也存在析构函数,但是我们使用C#进行游戏开发的时候很少或者几乎不使用C#的析构函数,(C#的析构函数也是波浪号~加上析构函数名,其中析构函数名称与类名相同,没有参数),这是因为C#之中存在垃圾回收机制,一般通过GC垃圾自动回收机制处理这部分内容,当然开发者可以自己手动调用垃圾回收,一般手动调用垃圾回收的场景在于场景加载时或者其他认为应该垃圾回收的场景时使用,但是需要注意的是,我们不应该频繁的调用垃圾回收机制,这可能会对游戏造成卡顿,当然同理,也要做好性能优化防止GC被频繁的触发,如何对GC进行优化下一个篇幅再讲,怕扯太远了。(调用GC的垃圾回收是一种昂贵的操作,所以只有实在要使用垃圾回收时才考虑调用)
对于复制构造函数,C#之中并不存在对应的复制函数,我们一般需要手动书写对应的函数或者通过一些其他的方法实现这部分内容,例如使用成员wise复制。
C#代码就不多说了,之前的博客之中都可以翻到对应的详细的博文讲解,下面主要示例一下C++的构造函数和复制构造函数以及析构函数的写法:
#include<iostream>
#include<cstring>
class Person{
private:
int _year;
int _id;
char* _name;
public:
Person(int year,int id,const char* name):_year(year),_id(id){
_name=new char[strlen(name)+1];
strcpy(_name,name);
}
int year()const{return _year;}
int id()const{return _id;}
const char* name()const{return _name;}
Person(const Person& other):_year(other._year),_id(other._id){
_name=new char[strlen(other._name)+1];
strcpy(_name,other._name);
}
~Person(){
delete[] _name;
}
};