拷贝构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拷贝构造函数相关的知识,希望对你有一定的参考价值。

   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进行初始化。

本文出自 “梵高说我脑子有病” 博客,请务必保留此出处http://chen0547.blog.51cto.com/12489941/1978278

以上是关于拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章

拷贝构造函数(c++常问问题一)

拷贝构造函数

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

复制构造函数(拷贝构造函数)

构造函数调用