复制构造函数在构造函数中的使用

原创 2018年04月17日 19:59:09

类可以用常量,也可以用对象来初始化,但是用对象来初始化时,如果用来初始化的对象是new出来的空间,初始化时需要加入指针

#include<iostream>
using namespace std;
class A
{
public:
	int a, b;
	A(int m,int n=0):a(m),b(n){}
	A(A aa, A bb)
	{
		a = aa.a + aa.a;
		b = bb.b + bb.b;
	}
};
int main()
{
	A a1(3);
	//A a2(2, 3);
	A *a2 = new A(2, 3);
	A a3(a1, a2);
	cout << a3.a << " " << a3.b << endl;

}
上述编译不通过,但是如果改成
#include<iostream>
using namespace std;
class A
{
public:
	int a, b;
	A(int m,int n=0):a(m),b(n){}
	A(A aa, A bb)
	{
		a = aa.a + aa.a;
		b = bb.b + bb.b;
	}
};
int main()
{
	A a1(3);
	A a2(2, 3);
	//A *a2 = new A(2, 3);
	A a3(a1, a2);
	cout << a3.a << " " << a3.b << endl;

}

或者

#include<iostream>
using namespace std;
class A
{
public:
	int a, b;
	A(int m,int n=0):a(m),b(n){}
	A(A &aa, A &bb)
	{
		a = aa.a + aa.a;
		b = bb.b + bb.b;
	}
	A(A &aa)
	{
		a = aa.a + 10;
		b = aa.b + 10;
	}
};
int main()
{
	A a1(3);
//	A a2(2, 3);
	A *a2 = new A(2, 3);
	A a3(a1, *a2);
	cout << a3.a << " " << a3.b << endl;

}

即可完成初始化

注意用类的对象初始化的时候可能会调用复制构造函数,例如

#include<iostream>
using namespace std;
class A
{
public:
	int a, b;
	A(int m,int n=0):a(m),b(n){}
	A(A aa, A bb)
	{
		a = aa.a + aa.a;
		b = bb.b + bb.b;
	}
	A(A &aa)
	{
		a = aa.a + 10;
		b = aa.b + 10;
	}
};
int main()
{
	A a1(3);
	A a2(2, 3);
	//A *a2 = new A(2, 3);
	A a3(a1, a2);
	cout << a3.a << " " << a3.b << endl;

}

最终会输出为26 26

如果不想让程序调用复制构造函数,则需要在构造函数中添加引用符号

#include<iostream>
using namespace std;
class A
{
public:
	int a, b;
	A(int m,int n=0):a(m),b(n){}
	A(A &aa, A &bb)
	{
		a = aa.a + aa.a;
		b = bb.b + bb.b;
	}
	A(A &aa)
	{
		a = aa.a + 10;
		b = aa.b + 10;
	}
};
int main()
{
	A a1(3);
	A a2(2, 3);
	//A *a2 = new A(2, 3);
	A a3(a1, a2);
	cout << a3.a << " " << a3.b << endl;

}

C++中类的构造函数与复制构造函数

在网络上有朋友提到“主要原因在于编译器的优化,当复制构造函数是public时,编译器就会根据这个特性来对代码进行优化。当程序运行时,编译器发现复制构造函数是public,则说明程序允许对象之间的复制,...
  • hou09tian
  • hou09tian
  • 2017-04-27 10:52:42
  • 310

关于c++中不允许复制构造函数传值参数的理解

问题源于看剑指offer上的一道面试题,题目如下: class A{ private: int value; public: A(int n){ value = n; } A...
  • xiaoquantouer
  • xiaoquantouer
  • 2017-04-12 17:27:23
  • 1809

什么是复制构造函数

复制构造函数又称为拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。它存在唯一一个参数是不可变的。这个函数经常在函数调用期间于用户定义类型的值传递及返回。...
  • Jake2549794390
  • Jake2549794390
  • 2016-03-14 13:58:06
  • 1418

C++的简单总结(复制构造函数,深拷贝,前拷贝,默认属性)

类的三大属性: private,public,protected 1,对于类的成员变量或者函数,缺省即为私有 #include using namespace std; class A { ...
  • msdnwolaile
  • msdnwolaile
  • 2016-07-17 18:56:04
  • 1924

C++普通构造函数和复制构造函数的区别

(1)形式上   类名(形参列表)//普通构造函数的声明,如Box(int h ,int w,int len); leim(类名 & 对象名)//复制构造函数的声明,如Box(Box &b); (2)...
  • Jeaniowang
  • Jeaniowang
  • 2017-09-14 11:44:03
  • 127

C++语法,复制构造函数与=运算符重载

C++:复制构造函数在什么时候被调用?它和operator = 区分 1、对象在创建时使用其他的对象初始化 Person p(q); //此时复制构造函数被用来创建实例p Perso...
  • u010003835
  • u010003835
  • 2015-08-06 11:15:19
  • 787

C++复制构造函数和拷贝构造函数

1 拷贝构造函数参数的特点 赋值构造函数要申请内存。就像一般的构造函数一样。 而赋值操作,是已经申请好了内存。只是赋值。 对于一个类X,如果一个构造函数的第一个参数是下列之一: a) ...
  • hongkangwl
  • hongkangwl
  • 2014-03-04 14:53:03
  • 2390

C++中构造函数,拷贝构造函数和赋值函数的区别和实现

C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。 构造函数就是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。拷贝构造函数是一种特殊的构造函数,...
  • zcyzsy
  • zcyzsy
  • 2016-08-05 21:54:00
  • 22976

VC++复制构造函数使用的三种情况—整理范磊VC++

上面不执行复制构造函数,
  • hgeternal
  • hgeternal
  • 2014-11-12 20:00:18
  • 973

复制构造函数在什么时候被调用?

转自:http://www.slyar.com/blog/cpp-copy-constructor.html   这个问题不是疑问了,查了一下国外网站,总结一下。假设Person是一个类,复制构造...
  • xdonx
  • xdonx
  • 2013-07-30 12:00:02
  • 1602
收藏助手
不良信息举报
您举报文章:复制构造函数在构造函数中的使用
举报原因:
原因补充:

(最多只允许输入30个字)