下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++拷贝构造函数的知识点总结一拷贝构造函数是C++最基础的概念之一,大家自认为对拷贝构造函数了解么?请大家先回答一下三个问题:1.
以下函数哪个是拷贝构造函数,为什么?X::X(const
X&);
X::X(X);
X::X(X&,
int
a=1);
X::X(X&,
int
a=1,
b=2);
2.
一个类中可以存在多于一个的拷贝构造函数吗?3.
写出以下程序段的输出结果,并说明为什么?
如果你都能回答无误的话,那么你已经对拷贝构造函数有了相当的了解。#include
#include
struct
X
{
template<typename
T>
X(
T&
)
{
std::cout
<<
"This
is
ctor."
<<
std::endl;
}
template<typename
T>
X&
operator=(
T&
)
{
std::cout
<<
"This
is
ctor."
<<
std::endl;
}
};
void
main()
{
X
a(5);
X
b(10.5);
X
c
=
a;
c
=
b;
}
解答如下:1.
对于一个类X,如果一个构造函数的第一个参数是下列之一:
a)X&
b)
constX&
c)volatileX&
d)
constvolatileX&
且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数.
X::X(const
X&);
//是拷贝构造函数
X::X(X&,
int=1);
//是拷贝构造函数
2.类中可以存在超过一个拷贝构造函数,
class
X
{
public:
X(const
X&);
X(X&);
//
OK
};
注意,如果一个类中只存在一个参数为X&的拷贝构造函数,那么就不能使用constX或volatileX的对象实行拷贝初始化.class
X
{
public:
X();
X(X&);
};
const
X
cx;
X
x
=
cx;
//
error
如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数.
这个默认的参数可能为X::X(constX&)或X::X(X&),由编译器根据上下文决定选择哪一个.默认拷贝构造函数的行为如下:
默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造.
拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise
Copy)的动作.
a)如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数.
b)如果数据成员是一个数组,对数组的每一个执行按位拷贝.
c)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值.
3.
拷贝构造函数不能由成员函数模版生成.
struct
X
{
template<typename
T>
X(
const
T&
);
//
NOT
copy
ctor,
T
can't
be
X
template<typename
T>
operator=(
const
T&
);
//
NOT
copy
ass't,
T
can't
be
X
};
原因很简单,成员函数模版并不改变语言的规则,而语言的规则说,如果程序需要一个拷贝构造函数而你没有声明它,那么编译器会为你自动生成一个.所以成员函数模版并不会阻止编译器生成拷贝构造函数,赋值运算符重载也遵循同样的规则.(参见Effective
C++3edition,Item45)
二针对上面作者的讨论,理解更深了,但是下面我还是会给出一个一般的标准的实现和注意事项:#include
"stdafx.h"
#include
"stdio.h"
#include
<iostream>
#include
<string>
struct
Test1
{
Test1()
{
}
Test1(int
i)
{
id
=
i;
}
Test1(const
Test1&
test)
{
id
=
test.id;
}
Test1&
operator
=
(const
Test1&
test)
{
if(this
==
&test)
return
*this;
id
=
test.id;
return
*this;
}
int
id;
};
class
Test2
{
public:
Test2(){
m_pChar
=
NULL;}
Test2(char
*pChar)
{
m_pChar
=
pChar;}
Test2(int
num)
{
m_pChar
=
new
char[num];
for(int
i
=
0;
i<
num;
++i)
m_pChar[i]
=
'a';
m_pChar[num-1]
=
'\0';
}
Test2(const
Test2&
test)
{
char
*pCharT
=
m_pChar;
m_pChar
=
new
char[strlen(test.m_pChar)];
strcpy(m_pChar,
test.m_pChar);
if(!pCharT)
delete
[]pCharT;
}
Test2&
operator
=
(const
Test2&
test)
{
if(this
==
&test)
return
*this;
char
*pCharT
=
m_pChar;
m_pChar
=
new
char[strlen(test.m_pChar)];
strcpy(m_pChar,
test.m_pChar);
if(!pCharT)
delete
[]pCharT;
return
*this;
}
private:
char
*m_pChar;
};
int
main(int
argc,
char*
argv[])
{
const
Test1
ts(1);
//
Test1()
const
Test1*
p_ts
=
&ts;
const
Test1
ts2(ts);
//Test(const
Test1&
test)
const
Test1
ts3
=
ts;
//Test(const
Test1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金属摆件制作工岗中专业应用考核试卷含答案
- 溶剂脱沥青装置操作工安全强化模拟考核试卷含答案
- 水盆工岗前危机应对考核试卷含答案
- 班组长年度职业发展规划
- 健康宣教单设计
- 2026-2027学年统编版(新教材)四年级语文(上)类文拓展阅读专项练习卷及答案
- 中小学健康教育活动设计
- 2026年山西国际商务职业学院高职单招笔试英语历年参考题库含答案解析
- 2026年宿迁职业技术学院高职单招笔试英语历年参考题库含答案解析
- 2026年大学试题(计算机科学)-IP技术与综合宽带网历年参考题库含答案解析
- 2026年新教材人教版九年级上册英语期中复习:Unit 1-4+期中5套测试卷汇编(含答案)
- 河北省邯郸市2025-2026学年高一上学期期中联考语文试题及答案
- ESC 2026新版心力衰竭管理指南精读
- 2026智联招聘笔试题库及答案
- 2026版《药物临床试验质量管理规范》GCP考试题库(含标准答案+解析)
- EDA技术及应用项目教程 教学大纲
- 中医护理评估
- 2025年度中国展览数据统计报告
- 2026年中考作文押题指导
- 全新版大学英语视听说教程1答案
- T/CCMA 0160-2023非公路洒水车
评论
0/150
提交评论