面向对象程序设计-C++_课时26拷贝构造Ⅰ_课时27拷贝构造Ⅱ
一旦写了一个类,给它3个函数:
1default construtor
2virtual destructor
3copy constructor
Constructions vs. assignment
Every object is constructed once
Every object should be destroyed once
--Failure to invoke delete()
--invoke delete() more than once
Once an object is constructed, it can be the target of many assignment operations
Copy ctor guidelines
In general, be explicit
--Create your own copy ctor--don't rely on the default
If you don't need one declare a private copy ctor
--prevents creation of a default copy constructor
--generates a compiler error if try to pass-by-value
--don't need a definition
复制构造函数,不是字节对字节的拷贝,而是成员对成员的拷贝
构造函数,参数是引用一个类
正确
#include <iostream>
#include <string>
using namespace std; static int objectCount = ; class HowMany
{
public:
HowMany() { objectCount++; print("HowMany()"); }//构造函数,没有参数
HowMany(int i) { objectCount++; print("HowMany(int)"); }//构造函数,参数是一个int
HowMany(const HowMany& o) { objectCount++; print("HowMany(HM)"); }//构造函数,参数是引用一个类
void print(const string& msg = "")
{
if (msg.size() != )
{
std::cout << msg << ": ";
}
std::cout << "objectCount="
<< objectCount << std::endl;
}
~HowMany()
{
objectCount--;
print("~HowMany()");
}
}; HowMany f(HowMany x)
{
std::cout << "begin of f" << std::endl;
x.print("x argument inside f()");
std::cout << "end of f" << std::endl;
return x;
} void main()
{
HowMany h;
h.print("after construction of h"); HowMany h2 = f(h);
//HowMany h2 = h;
//HowMany h2(10);//构造函数,参数是一个int
//HowMany h2(h);//构造函数,参数是一个类 h.print("after call to f()"); system("pause");
}
构造函数,参数是新建一个类,形成死循环
错误
1>main.cpp(13): error C2652: “HowMany”: 非法的复制构造函数: 第一个参数不应是“HowMany”
1> main.cpp(8): note: 参见“HowMany”的声明
1>main.cpp(13): error C2333: “HowMany::HowMany”: 函数声明中有错误;跳过函数体
1>main.cpp(44): error C2440: “return”: 无法从“HowMany”转换为“HowMany”
1> main.cpp(44): note: 由于复制构造函数不明确或没有可用的复制构造函数,因此无法复制构造 class“HowMany”
1>main.cpp(52): error C2664: “HowMany f(HowMany)”: 无法将参数 1 从“HowMany”转换为“HowMany”
1> main.cpp(52): note: 由于复制构造函数不明确或没有可用的复制构造函数,因此无法复制构造 class“HowMany”
#include <iostream>
#include <string>
using namespace std; static int objectCount = ; class HowMany
{
public:
HowMany() { objectCount++; print("HowMany()"); }//构造函数,没有参数
HowMany(int i) { objectCount++; print("HowMany(int)"); }//构造函数,参数是一个int HowMany(HowMany o) { objectCount++; print("HowMany(HM)"); }//构造函数,错误,参数是新建一个类,形成死循环 //1>main.cpp(13) : error C2652 : “HowMany” : 非法的复制构造函数 : 第一个参数不应是“HowMany”
// 1> main.cpp(8) : note : 参见“HowMany”的声明
// 1>main.cpp(13) : error C2333 : “HowMany::HowMany” : 函数声明中有错误;跳过函数体
// 1>main.cpp(44) : error C2440 : “return” : 无法从“HowMany”转换为“HowMany”
// 1> main.cpp(44) : note : 由于复制构造函数不明确或没有可用的复制构造函数,因此无法复制构造 class“HowMany”
// 1>main.cpp(52) : error C2664 : “HowMany f(HowMany)” : 无法将参数 1 从“HowMany”转换为“HowMany”
// 1> main.cpp(52) : note : 由于复制构造函数不明确或没有可用的复制构造函数,因此无法复制构造 class“HowMany” void print(const string& msg = "")
{
if (msg.size() != )
{
std::cout << msg << ": ";
}
std::cout << "objectCount="
<< objectCount << std::endl;
}
~HowMany()
{
objectCount--;
print("~HowMany()");
}
}; HowMany f(HowMany x)
{
std::cout << "begin of f" << std::endl;
x.print("x argument inside f()");
std::cout << "end of f" << std::endl;
return x;
} void main()
{
HowMany h;
h.print("after construction of h"); HowMany h2 = f(h);
//HowMany h2 = h;
//HowMany h2(10);//构造函数,参数是一个int
//HowMany h2(h);//构造函数,参数是一个类 h.print("after call to f()"); system("pause");
}
如果一个类有指针,需要另外写复制构造函数,否则出错
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std; class Person
{
public:
Person(const char *s);
~Person();
void print();
char *name;
}; Person::Person(const char *s)
{
name = new char[::strlen(s) + ];
::strcpy(name, s);
} Person::~Person()
{
delete[] name;//array delete
} void Person::print()
{
std::cout << name << std::endl;
} void main()
{
Person p1("John");
Person p2(p1); p1.print();
p2.print(); printf("p1.name=%p\n", p1.name);//一样
printf("p2.name=%p\n", p2.name);//一样 system("pause");
}
面向对象程序设计-C++_课时26拷贝构造Ⅰ_课时27拷贝构造Ⅱ的更多相关文章
- [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit
[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitS ...
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)
[.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...
- Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)
一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...
- 201771010118马昕璐《面向对象程序设计java》第八周学习总结
第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...
- 201771010134杨其菊《面向对象程序设计java》第八周学习总结
第八周学习总结 第一部分:理论知识 一.接口.lambda和内部类: Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数:comp ...
- 杨其菊201771010134《面向对象程序设计(java)》第六周学习总结
<面向对象程序设计(java)>第六周学习总结 第一部分:理论知识 1)类.超类和子类2)Object:所有类的超类 3)泛型数组列表4)对象包装器和自动打包 5)参数数量可变的方法 6) ...
- (C/C++学习笔记) 十七. 面向对象程序设计
十七. 面向对象程序设计 ● 面向对象程序设计的基本概念 ※ 类实际上是一种复杂的数据类型,它不仅包含不同类型的数据,还包含对这些数据的一些必要的操作. 而对象则是这种复杂的数据类型的一个变量. 类是 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第八周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第八周学习总结 实验七 接口的定义与使用 实验时间 2019-10-18 第一部分:知识总结 接口的概念: ①java为了克 ...
- 201871010113-刘兴瑞《面向对象程序设计(java)》第四周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...
随机推荐
- Drawable类及XMLDrawable的使用
一.性质 可直接使用.png..jpg..gif.9.png等图片作为资源,也可使用多种XML文件作为资源.(就是这些资源都能生成Drawable对象).并对XML文件作出相关处理 二.XMLDraw ...
- eclipse中调出android sdk manager和android virtual device manager图标
有时候在安装ADT插件后,eclipse菜单栏上不会显示android sdk manager和android virtual device manager两个图标, 这个时候,如果安装ADT插件的步 ...
- 计算机专业-世界大学学术排名,QS排名,U.S.NEWS排名
2015年美国大学计算机专业排名 计算机专业介绍:计算机涉及的领域非常广泛,其分支学科也是非常多.所以在美国将主要的专业方向分为人工智能,程序应用,计算机系统(Systems)以及计算机理论(theo ...
- aix6.1 openssh安装
环境: IBM AIX6.1 1.下载(可以直接从附件中下载): openssl IBM官方网站下载:https://www14.software.ibm.com/webapp/iwm/web/reg ...
- 高效 Java Web 开发框架 JessMA v3.2.3 beta-2 发布
JessMA(原名:Portal-Basic)是一套功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hib ...
- heap creation
There two methods to construct a heap from a unordered set of array. If a array has size n, it can b ...
- Linux内核中常见内存分配函数(一)
linux内核中采 用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表. * 页全局目录(Page Global Dir ...
- 把给定的字符串解析为Date对象
把给定的字符串解析为Date对象: /** * <pre> * 把给定的字符串解析为Date对象 * </pre> * * @param str 要进行解析的字符串 * @pa ...
- 无线网破解软件|一键式破解无线网|BT17软件包下载[笔记本+软件就行]
从新版BT17发布到现在已经有一段时间,谢谢大家的一直来的关注.现在给大家讲解一下无线网破解问题,告诉 大家如何一键式破解WPA,WPA2,AES.Tkip等加密方式以及新版BT17软件包的下载地址. ...
- java——推断日期是否在今天之前
这里说的日期是指字符串的日期格式,如"2014-10-15",我们要推断这个日期是否在今天之前,网上看到好多推断的方法,都是拿这个日期转换成Date对象 然后与new Date() ...