重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
C++中,系统不仅会为你提供默认构造函数同时也会为你提供默认拷贝构造函数。那么拷贝构造函数是怎么一回事呢?有这么一段代码:
成都创新互联公司服务项目包括镇原网站建设、镇原网站制作、镇原网页制作以及镇原网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,镇原网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到镇原省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
People person ( "chentong", 20, "student" ); People per(person);
假设我们已经有了一个People的类,于是我们申请了一个类变量person。并且,我们对这个类变量进行了初始化。于是,我们申请了第二个类变量per,通过这种写法,我们就相当于把person中的值全部写到了per中去了。因为,默认拷贝构造函数使得两个类变量指向了同一块内存空间。默认拷贝构造函数使得per中的值指向了person中值的地址,换言之,两个类变量指向的是同一块内从空间,当释放内存空间时,可能就会对同一块内存空间进行重复释放,这样就会带来内存泄露的危害。(二次释放,有可能会把有用的值给释放掉,所以,这样做肯定是有危害的)
为了解决二次释放带来的危害,C++允许我们自己写拷贝构造函数。一般情况下,系统会为你提供默认构造函数,但是,如果你自己写构造函数,并且是带参数的构造函数,那么,你必须得提供一个不带参数的构造函数。因为,当你自己写了带参数的构造函数,那么系统将不会为你提供默认构造函数。否则,使用将会出错。
这一次,我们定义两个类,一个People类,一个Student类。
class People { private: char* name; int age; public: People() { } People(char* name, int age) { this->name = name; this->age = age; cout << "name = " << this->name << endl; cout << "age = " << this->age << endl; } //拷贝构造函数 People(People& per) { this->name = per.name; this->age = per.age; } void SetName(char* name) { this->name = name; } void SetAge(int age) { this->age = age; } };
class Student { private: People father;//调用无参构造函数 People mother;//调用有参构造函数 int student_id; public: Student() { } Student(int student_id, char* father, char* mother, int father_age = 42, int mother_age = 41){ this->student_id = student_id; } void PrintInfo() { }
现在我想要使用这些参数来构造我的类变量father和类变量mother。我该怎么做呢?很明显我所构造的类变量father和mother调用的都是无参构造函数,但是,我想要调用有参构造函数,我该怎么做呢?我只要,
Student(int student_id, char* father, char* mother, int father_age = 42, int mother_age = 41 ) : father ( father, father_age ), mother ( mother, mother_age )
在构造函数参数列表的外面,加上一个冒号,然后,把相应类变量的参数传进去。那么假如我先对类变量mother进行初始化,再对类变量father进行初始化,这样会有影响吗?当然不会,初始化的前后顺序并不会影响初始化的结果。因为,我们在创建类变量时,先创建的是类变量father,然后是mother,所以,不管你先对哪个类变量进行初始化,系统都是先对father进行初始化。