一旦写了一个类,给它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拷贝构造Ⅱ的更多相关文章

  1. [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

    [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitS ...

  2. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  3. [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  4. Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)

    一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...

  5. 201771010118马昕璐《面向对象程序设计java》第八周学习总结

    第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...

  6. 201771010134杨其菊《面向对象程序设计java》第八周学习总结

    第八周学习总结 第一部分:理论知识 一.接口.lambda和内部类:  Comparator与comparable接口: 1.comparable接口的方法是compareTo,只有一个参数:comp ...

  7. 杨其菊201771010134《面向对象程序设计(java)》第六周学习总结

    <面向对象程序设计(java)>第六周学习总结 第一部分:理论知识 1)类.超类和子类2)Object:所有类的超类 3)泛型数组列表4)对象包装器和自动打包 5)参数数量可变的方法 6) ...

  8. (C/C++学习笔记) 十七. 面向对象程序设计

    十七. 面向对象程序设计 ● 面向对象程序设计的基本概念 ※ 类实际上是一种复杂的数据类型,它不仅包含不同类型的数据,还包含对这些数据的一些必要的操作. 而对象则是这种复杂的数据类型的一个变量. 类是 ...

  9. 201871010111-刘佳华《面向对象程序设计(java)》第八周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第八周学习总结 实验七 接口的定义与使用 实验时间 2019-10-18 第一部分:知识总结 接口的概念: ①java为了克 ...

  10. 201871010113-刘兴瑞《面向对象程序设计(java)》第四周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...

随机推荐

  1. AlarmManager与PendingIntent

    1.AlarmManager的作用与PendingIntent的关系 顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent.简单的说就是 ...

  2. Smarty3配置

    下载Smarty压缩包并解压,复制其中的libs文件夹到我们的PHP工程目录下(可将其改名为smarty).同时,在工程目录下新建三个文件夹,分别取名为templates.templates_c和sm ...

  3. VB MSFlexGrid 用法

    http://blog.itpub.net/15453304/viewspace-445608/ 问题一,MSFlexGrid 点击一行,显示背景颜色,然后得到行号 首先,右键单击Msflexgrid ...

  4. POJ 1052 Plato's Blocks

      Plato's Blocks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 734   Accepted: 296 De ...

  5. 好的组件,无须太复杂 – KISSY Slide 组件简介

    KISSY Slide 组件首页:http://gallery.kissyui.com/slide/1.1/guide/index.html V1.1 New Featurs Slide是一个幻灯切换 ...

  6. Android stagefright与opencore对比

      [转载至其它博客] http://blog.csdn.net/djy1992/article/details/9339917 1引言 Android froyo版本多媒体引擎做了变动,新添加了st ...

  7. windows和linux下获取当前程序路径以及cpu数

    #ifdef WIN32 #include <Windows.h> #else #include <stdio.h> #include <unistd.h> #en ...

  8. JAVA的IO运用

    IO OF JAVA想写好一篇关于JAVA的IO的文章不容易,因为它涉及的东西很多难以写得有深度和有思路.我虽不才但也写.这篇文章有我个人不少的见解,虽然涉足计算机不深但我不想用一大堆这个可能那个可能 ...

  9. Android UI ActionBar功能-Action Bar 左上角的向上或返回按钮

    ActionBar在左上角还提供了一个向上或返回的按钮,默认情况下是隐藏的需要在代码中开启: 官方文档:http://wear.techbrood.com/training/basics/action ...

  10. javascript的模块开发方法;

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...