C++中,系统不仅会为你提供默认构造函数同时也会为你提供默认拷贝构造函数。那么拷贝构造函数是怎么一回事呢?有这么一段代码:

Peopleperson("chentong",20,"student");Peopleper(person);

假设我们已经有了一个People的类,于是我们申请了一个类变量person。并且,我们对这个类变量进行了初始化。于是,我们申请了第二个类变量per,通过这种写法,我们就相当于把person中的值全部写到了per中去了。因为,默认拷贝构造函数使得两个类变量指向了同一块内存空间。默认拷贝构造函数使得per中的值指向了person中值的地址,换言之,两个类变量指向的是同一块内从空间,当释放内存空间时,可能就会对同一块内存空间进行重复释放,这样就会带来内存泄露的危害。(二次释放,有可能会把有用的值给释放掉,所以,这样做肯定是有危害的)

为了解决二次释放带来的危害,C++允许我们自己写拷贝构造函数。一般情况下,系统会为你提供默认构造函数,但是,如果你自己写构造函数,并且是带参数的构造函数,那么,你必须得提供一个不带参数的构造函数。因为,当你自己写了带参数的构造函数,那么系统将不会为你提供默认构造函数。否则,使用将会出错。

这一次,我们定义两个类,一个People类,一个Student类。

classPeople{private:char*name;intage;public:People(){}People(char*name,intage){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;}voidSetName(char*name){this->name=name;}voidSetAge(intage){this->age=age;}};

classStudent{private:Peoplefather;//调用无参构造函数Peoplemother;//调用有参构造函数intstudent_id;public:Student(){}Student(intstudent_id,char*father,char*mother,intfather_age=42,intmother_age=41){this->student_id=student_id;}voidPrintInfo(){}

现在我想要使用这些参数来构造我的类变量father和类变量mother。我该怎么做呢?很明显我所构造的类变量father和mother调用的都是无参构造函数,但是,我想要调用有参构造函数,我该怎么做呢?我只要,

Student(intstudent_id,char*father,char*mother,intfather_age=42,intmother_age=41):father(father,father_age),mother(mother,mother_age)

在构造函数参数列表的外面,加上一个冒号,然后,把相应类变量的参数传进去。那么假如我先对类变量mother进行初始化,再对类变量father进行初始化,这样会有影响吗?当然不会,初始化的前后顺序并不会影响初始化的结果。因为,我们在创建类变量时,先创建的是类变量father,然后是mother,所以,不管你先对哪个类变量进行初始化,系统都是先对father进行初始化。