C++ 拷贝构造函数

作者 : 卿笃军


1)定义:拷贝构造函数,是一种特殊的构造函数。它由编译器调用来完毕一些基于同一类的其它对象的构建及初始化。

其唯一的形參必须是引用,但并不限制为const,一般普遍的会加上const限制。

此函数经经常使用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。假设能够的话,它将用常量方式调用,另外,也能够用很量方式调用。



2)调用拷贝构造函数的情形:
在C++中。以下三种对象须要调用拷贝构造函数(有时也称“复制构造函数”):
a) 一个对象作为函数參数,以值传递的方式传入函数体;
b) 一个对象作为函数返回值,以值传递的方式从函数返回;
c) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);

假设在前两种情况不使用拷贝构造函数的时候。就会导致一个指针指向已经被删除的内存空间。对于第三种情况来说,初始化和赋值的不同含义是拷贝构造函数调用的原因。其实,拷贝构造函数是由普通构造函数和赋值操作符共同实现的。描写叙述拷贝构造函数和赋值运算符的异同的參考资料有非常多。


通常的原则是:①对于凡是包括动态分配成员或包括指针成员的类都应该提供拷贝构造函数;②在提供拷贝构造函数的同一时候。还应该考虑重载"="赋值操作符号。原因详见后文。


拷贝构造函数必须以引用的形式传递(參数为引用值)。其原因例如以下:当一个对象以传递值的方式传一个函数的时候。拷贝构造函数自己主动的被调用来生成函数中的对象。假设一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才干够传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外。拷贝构造函数在对象被函数返回的时候也相同的被调用。

(以上文字段来自百度百科拷贝构造函数)


3)另外须要提一下的是explicit:

C++提供了keywordexplicit,能够阻止不应该同意的经过转换构造函数进行的隐式转换的发生。

声明为explicit的构造函数不能在隐式转换中使用。


#include <iostream>
using namespace std;

class A
{
public:
	A(int a){ m_a = a; }
//	explicit A(int a){ m_a = a; }   //explicit:使构造函数不能对单个数字进行强制转换
private:
	int m_a;
};
int main()
{
	A a(3);
	A b = 6;   //相当于A b = A(6),将6强制转换

	return 0;
}

注意:仅仅有单个的数字才干够A b = 6; 这样。可是不建议这么使用。

请依照上面的A a(3);方式使用。


演示样例:C++ 拷贝构造函数

#include <iostream>
using namespace std;

class Cpy
{
public:
	Cpy(int nA = 0, double douB = 0.0);  //构造函数
	Cpy(Cpy &p);                         //拷贝构造函数

private:
	int m_nA;
	double m_douB;
};
//构造函数
Cpy::Cpy(int nA, double douB)
{
	m_nA = nA;
	m_douB = douB;
	cout<<"Tip : Cpy::Cpy(int nA, double douB) ..."<<endl;
}
//拷贝构造函数
Cpy::Cpy(Cpy &p)
{
	m_nA = p.m_nA;
	m_douB = p.m_douB;
	cout<<"Tip : Cpy::Cpy(Cpy &p) ..."<<endl;
}
//外部函数,返回值为一个类对象.
Cpy fn()
{
	cout<<"Tip : Cpy fn() ..."<<endl;
	Cpy buf;

	return buf;
}

int main()
{
	Cpy a;       //调用构造函数
	Cpy b(a);    //调用拷贝构造函数
	Cpy c = a;   //调用拷贝构造函数
	fn();        //return时,调用拷贝构造函数

	return 0;
}
执行结果:


參考文献:百度百科,拷贝构造函数。http://baike.baidu.com/view/1266959.htm,2014年5月24日

百度百科,explicit,http://baike.baidu.com/view/2422253.htm,2014年5月24日

熊思的CSDN博客,C++构造函数,http://blog.csdn.net/u010056396/article/details/26623069,2014年5月24日

转载于:https://www.cnblogs.com/jzssuanfa/p/7069438.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值