面向对象程序设计-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 ...
随机推荐
- leetcode 算法刷题(一)
今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...
- android xml解析 sax
1.简要概述 Android 各种文件都是xml格式的,还有标准的webservice返回的是xml文件,虽然现在的json使用在移动设备端越来越广泛,但是xml格式的解析感觉还是相当必要. 2.sa ...
- 凯恩斯主义VS货币主义
Milton Friedman在1960年代后期以及整个1970年代,到处不知疲倦地像传教士一般地宣讲他的货币主义.当时,美联储成员几乎清一色地是凯恩斯主义者.你可以想像Friedman的对手是多么强 ...
- 为Delphi程序增加UAC功能
相关资料:http://bbs.csdn.net/topics/320071356# 操作方法: 在Source\VCL目录下应该有这样两个文件sample.manifest和WindowsXP.rc ...
- Android手机自带内部存储路径的获取 (转)
转自:http://my.oschina.net/liucundong/blog/288183 我有一台中兴的Android手机,型号是 ZTE U930HD,手机没有插入外置SD卡(也就是Micro ...
- UVA 674 Coin Change 换硬币 经典dp入门题
题意:有1,5,10,25,50五种硬币,给出一个数字,问又几种凑钱的方式能凑出这个数. 经典的dp题...可以递推也可以记忆化搜索... 我个人比较喜欢记忆化搜索,递推不是很熟练. 记忆化搜索:很白 ...
- Android UI ActionBar功能-在 Action Bar 上添加按钮
在ActionBar上添加按钮实现某些功能最常见的Application的功能如:在ActionBar上添加一个搜索按钮: 首先官方文档说明:http://wear.techbrood.com/tra ...
- wx.BookCtrlBase
wx.BookCtrlBase A book control is a convenient way of displaying multiple pages of information, disp ...
- 【转载】HTML和XML的区别
本文源地址 http://blog.163.com/txl129_2006@126/blog/static/1851087820103218453645/ 有改动. 什么是HTML HTML的全拼是H ...
- 查找EBS中各种文件版本(Finding File Versions in the Oracle Applications EBusiness Suite - Checking the $HEADER)
Finding File Versions in the Oracle Applications EBusiness Suite - Checking the $HEADER (文档 ID 85895 ...