您的位置:首页 > 编程语言 > C语言/C++

c++ 关于构造函数 和 复制构造函数

2014-09-04 20:23 246 查看
1 构造函数

在c++中构造函数是特殊的成员函数,只要创建了类的实例都要执行构造函数,构造函数的名称与类名相同,且没有返回值,可以没有形参,也可以有多个形参。

构造函数可以包含一个构造函数的初始化列表:

A::A(int a ):b(a),c(a)

构造函数的初始化次序为就是定义成员的次序,第一个成员首先被初始化,然后第二个,初始化测次序往往无关紧要,但如果一个成员是根据其他成员初始化的,就要考虑次序了。



2 复制构造函数

只有一个形参,并且该形参是对本类型对象的引用,这样的构造函数时复制构造函数。

复制构造函数可用于:

1 根据另一个同类型的对象显式或隐式初始化一个对象

2 复制一个对象 将他作为一个实参传给一个函数
3 对象作为函数的返回值
4 初始化顺序容器的元素

若一个类需要完全禁止复制,类必须显式声明其复制构造函数为private

3 关于构造函数和复制构造函数的调用

先看如下代码

class People
{
private:
	int m;
	int n;
public:
	People()
	{
		cout<<"构造函数调用"<<endl;
	}

	 ~People()
	 {
		 cout<<"析构函数调用"<<endl;
	 }
	  People(const People&s)
	 {
		 m = s.m;
		 n = s.n;
		 cout<<"复制构造函数调用"<<endl;
	 }

	 People  operator =(const People&w)
	 {
		  m = w.m;
		  n = w.n;
		  cout<<"复制运算符重载调用"<<endl;
		  return *this;
	 }

	void SetM(int m)
	{
		this->m = m;
	}
	void SetN(int n)
	{
		this->n = n;
	}
	void show()
	{
		cout<<"M:"<<m<<endl;
		cout<<"N:"<<n<<endl;

	}
};

People func3()
{
	People people;//调用构造函数
	people.SetM(10);
	people.SetN(5);
	
	return people;//产生临时变量,调用复制构造函数,和析构函数
}<pre name="code" class="cpp">void main()
{

	  People p = func3();
	  p.show();
//运行结束后调用析构函数
}


运行的结果为:

构造函数调用

复制构造函数调用
析构函数调用
M:10
N:5
析构函数调用

对比
<span style="color:#666666;">class People
{
private:
	int m;
	int n;
public:
	People()
	{
		cout<<"构造函数调用"<<endl;
	}

	 ~People()
	 {
		 cout<<"析构函数调用"<<endl;
	 }
	  People(const People&s)
	 {
		 m = s.m;
		 n = s.n;
		 cout<<"复制构造函数调用"<<endl;
	 }

	 People  operator =(const People&w)
	 {
		  m = w.m;
		  n = w.n;
		  cout<<"复制运算符重载调用"<<endl;
		  return *this;
	 }

	void SetM(int m)
	{
		this->m = m;
	}
	void SetN(int n)
	{
		this->n = n;
	}
	void show()
	{
		cout<<"M:"<<m<<endl;
		cout<<"N:"<<n<<endl;

	}
};

People* func3()
{

	People *p = new People();//调用构造函数
	p->SetM(10);                                                                          
	p->SetN(10);
	
	return p;
}

int main()
{

	People *p = func3();
	p->show();
    delete p;//调用析构函数
}</span><span style="color:#ff6666;">
</span>
运行结果为:
构造函数调用
M:10
N:10
析构函数调用

因在func3() 中返回的是指针,复制的是指针的指向,因此不会调用复制构造函数,C++ 中 new出的对象都会调用构造函数,不会自动调用析构函数析构,需手动的delete该对象才会析构

对比
<span style="color:#666666;">class People
{
private:
	int m;
	int n;
public:
	People()
	{
		cout<<"构造函数调用"<<endl;
	}

	 ~People()
	 {
		 cout<<"析构函数调用"<<endl;
	 }
	  People(const People&s)
	 {
		 m = s.m;
		 n = s.n;
		 cout<<"复制构造函数调用"<<endl;
	 }

	 People  operator =(const People&w)
	 {
		  m = w.m;
		  n = w.n;
		  cout<<"复制运算符重载调用"<<endl;
		  return *this;
	 }

	void SetM(int m)
	{
		this->m = m;
	}
	void SetN(int n)
	{
		this->n = n;
	}
	void show()
	{
		cout<<"M:"<<m<<endl;
		cout<<"N:"<<n<<endl;

	}
};

People* func3()
{

	People *p = new People();//调用构造函数
	p->SetM(10);                                                                          
	p->SetN(10);
	
	return p;
}

int main()
{
	 People *p = func3();
     People *w = new People;
	 *w = *p;
	 delete p;
	 delete w;
}</span>

结果:
构造函数调用
构造函数调用
复制运算符重载
复制构造函数调用
析构函数调用
析构函数调用
析构函数调用



在func3()中会调用一此构造函数,在People *w = new People 中调用构造函数,在*w = *p中,调用赋值运算符重载,又因在赋值运算符重载中,返回*this,固会调用复制构造函数和析构函数,delete p和delete w调用两次析构函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: