`
longsy
  • 浏览: 138030 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C++复制控制

阅读更多
   当定义一个新类型时,通过使用复制构造函数,赋值操作符,析构函数来显示或隐式地完成对象的复制,赋值,撤销

1.复制构造函数:只有单个形参,而且该形参是对本类类型对象的引用(通常是const修饰)的构造函数,称为~
复制函数可用于:
1)根据另一个同类型的对象显示或隐式初始化一个对象.
2)复制一个对象,将它作为实参传给一个函数
3)从函数返回时复制一个对象
4)初始化顺序容器中的元素
5)根据元素初始化式列表初始化数组元素

a.对象初始化形式
  直接初始化:一般是将初始化式放在圆括号内
  复制初始化:使用=符号
  string str = "123"; //copy-initialization
  string str1 = str; //copy-initialization
b.形参与返回值
  当形参或返回值为类类型时,由复制构造函数进行复制
  string make_copy(size_t, const string&, const string&);
c.初始化容器元素
  vector<string> sevc(5);
  先用string默认构造函数创建一个临时值为初始化svec,然后使用复制构造函数将临时值复制到sevc的每个元素
2.合成的复制构造函数
执行逐个成员初始化,将新对象初始化原对象的副本
3.定义自己的复制构造函数
MyClass(const MyClass &mc) {//...}
复制构造函数一般不设置为explicit
4.禁止复制
可以将复制构造函数显示的声明为private

5.赋值操作符:对于已初始化过类类型的对象而言,对其赋值时调用赋值操作符函数
MyClass& operator=(const MyClass&) {//...   return *this}
6.合成的赋值操作符
逐个成员赋值
一般赋值操作符与复制构造函数一起使用

7.析构函数:撤销类对象,自动调用
三法则:如果类需要析构函数,则其也需要复制构造函数和赋值操作符
~MyClass() {//...}
8.合成析构函数:按照声明的逆序对非static对象进行撤销,但不能删除指针成员所指向的对象

示例:
头文件,rectangle.h
/*
language:c++
author:longsy
file:rectangle.h
*/
namespace longsy {
	class Rectangle {
		int width;
		int height;
	public:
                 //带默认实参的默认构造函数
		Rectangle(int w=0, int h=0);
	        //复制构造函数
                  Rectangle(const Rectangle & rect);
                  //赋值操作符
		Rectangle& operator=(const Rectangle &rect);
		//析构造函数
                  ~Rectangle();
			
		void Draw();
	};
}

实现文件,rectangle.cpp
/*
language:c++
author:longsy
file:rectangle.cpp
*/
#include "rectangle.h"
using namespace longsy;

#include <iostream>

Rectangle::Rectangle(int w,int h) : width(w),height(h) 
{
	std::cout << "Rectangle(int w,int h)" << std::endl;
}
Rectangle::Rectangle(const Rectangle &rect) 
{
	this->width = rect.width;
	this->height = rect.height;
	std::cout << "Rectangle(const Rectangle &rect)" <<std::endl;
}
Rectangle& Rectangle::operator=(const Rectangle &rect)
{
	this->width = rect.width;
	this->height = rect.height;
	std::cout << "operator=(const Rectangle &rect)" << std::endl;
	return *this;
}
Rectangle::~Rectangle()
{
	this->width = 0;
	this->height = 0;
	std::cout << "~Rectangle()" << std::endl;	
}

void Rectangle::Draw()
{
	std::cout << "Draw the rectangle,width:" << this->width \
<< ",height:" << height <<std::endl;
}

测试文件,test.cpp
/*
language:c++
author:longsy
file:test.cpp
*/
#include "rectangle.h"
using namespace longsy;

int main()
{
	Rectangle rect; //调用默认构造函数
	rect.Draw();
	
	Rectangle rect1(1,1); //Rectangle(int w,int h)
	rect1.Draw();
	
	Rectangle rect2 = rect1;//调用复制构造函数
	rect2.Draw();
	
	Rectangle rect3(2,2); //Rectangle(int w,int h)
	rect3.Draw();
	rect3 = rect1; //调用赋值操作符
	rect3.Draw();
	
	return (0); //调用析构函数
}
/*
运行结果:
Rectangle(int w,int h)
Draw the rectangle,width:0,height:0
Rectangle(int w,int h)
Draw the rectangle,width:1,height:1
Rectangle(const Rectangle &rect)
Draw the rectangle,width:1,height:1
Rectangle(int w,int h)
Draw the rectangle,width:2,height:2
operator=(const Rectangle &rect)
Draw the rectangle,width:1,height:1
~Rectangle()
~Rectangle()
~Rectangle()
~Rectangle()
*/




分享到:
评论

相关推荐

    c++ 复制控制和智能指针

    总结了c++中三种复制控制的场合和具体实现方法,再次基础上设计自己的智能指针类。

    C++复制控制之复制构造函数

    所谓的“复制控制”即通过这三个成员函数控制对象复制的过程。本篇文章将介绍复制构造函数。  复制构造函数  复制构造函数是什么  复制构造函数首先是一个构造函数,它同所有其他的构造函数一样与类同名,没有...

    C++ 设置主屏 复制屏幕

    C++代码。当有两个屏幕的时候,可以设置一个是主屏一个是扩展屏。并且可以复制屏幕,但是不能设置为扩展模式

    C++API函数 多显示器设置(内含代码复制即用)

    C++API函数 多显示器设置(内含代码复制即用),大量注释方便修改

    编译器角度看C++复制构造函数

    关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义、调用时机、也对编译器合成的复制构造函数行为做了简单说明。本文因需要会涉及到上文的一些...

    C++跑跑卡丁车游戏实例

    C++跑跑卡丁车游戏是一款基于C++语言开发的模拟赛车游戏。下面是对这个游戏的描述,不包含具体的代码实现: 游戏目标:玩家扮演卡丁车赛车手,在赛道上驾驶卡丁车与其他竞争对手进行比赛,争夺第一名。 赛道设计:...

    c++builder与rs232串行通信控制(光盘)2

    《C++ Builder与RS-232串行通信控制》配书光盘自述文件 1.光盘内容 Readme.txt 光盘说明文件 \EX 《C++ Builder与RS-232串行通信控制》书中各章范例所在的文件 夹,包含完整的工程范例程序代码。 \Other 此...

    c++builder与rs232串行通信控制(光盘)6

    《C++ Builder与RS-232串行通信控制》配书光盘自述文件 &lt;br&gt;1.光盘内容 Readme.txt 光盘说明文件 \EX 《C++ Builder与RS-232串行通信控制》书中各章范例所在的文件 夹,包含完整的工程范例程序代码。...

    c++builder与rs232串行通信控制(光盘)1

    《C++ Builder与RS-232串行通信控制》配书光盘自述文件 1.光盘内容 Readme.txt 光盘说明文件 \EX 《C++ Builder与RS-232串行通信控制》书中各章范例所在的文件 夹,包含完整的工程范例程序代码。 \Other 此...

    C++ Builder与RS-232串行通信控制配书光盘Part1

    \EX 《C++ Builder与RS-232串行通信控制》书中各章范例所在的文件 夹,包含完整的工程范例程序代码。 \Other 此文件夹中包含以下内容:骅达科技公司授权提供的产品 PSIS仿真器的相关文件,四零四科技公司授权提供...

    C++ 中的模型预测控制(012)

    以下文章介绍了应用模型预测控制器的简单控制系统方法。本文讨论了这种控制的基本机制,该机制适用于各种...出于本文的目的,我在 C++ 中准备了简单的模拟。其目的是展示可以轻松复制的原理,用于更高级的模型动力学。

    c++builder与rs232串行通信控制(光盘)7

    《C++ Builder与RS-232串行通信控制》配书光盘自述文件 &lt;br&gt;1.光盘内容 Readme.txt 光盘说明文件 \EX 《C++ Builder与RS-232串行通信控制》书中各章范例所在的文件 夹,包含完整的工程范例程序代码。...

    《C++编程艺术》教程+代码

    非常优秀的C++教材,并且附有源码。 目 录 第1章 C++的功能 1 1.1 简洁而丰富的语法 1 1.2 功能强大的库 2 1.3 STL 2 1.4 程序员控制一切 3 1.5 细节控制 3 1.6 运算符重载 3 1.7 一种简洁精练的对象模型 4 1.8 C++...

    C++ Primer第四版【中文高清扫描版】.pdf

    17.3.3 多重继承派生类的复制控制 619 17.3.4 多重继承下的类作用域 620 17.3.5 虚继承 622 17.3.6 虚基类的声明 624 17.3.7 特殊的初始化语义 625 小结 628 术语 628 第18章 特殊工具与技术 631 18.1 优化内存分配...

    C++primer 课后题答案

    C++primer 课后题答案 ...第十三章 复制控制 94 第十四章 重载操作符与转换 102 第十五章 面向对象编程 116 第十六章 部分选做习题 133 第十七章 用于大型程序的工具 138 第十八章 特殊工具与技术 138

    c++编程思想(含源码)

    文档为PDF格式,有标签,可复制和打印,学习c++从这里开始,值得一看, 本书作者根据自己学习C++的亲身体会及多年教学经验,用简单的例子和简练的叙述讲解C++编程,别具特色。 全书共分十八章,内容涉及对象的演化、...

    详解在C++中显式默认设置的函数和已删除的函数的方法

    在 C++11 中,默认函数和已删除函数使你可以显式控制是否自动生成特殊成员函数。已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型...

    C++ 文件管理 实验报告

    1. 编写一个控制台程序fm.exe,可利用命令行参数控制其完成如下功能(使用C风格文件操作实现):  在控制台显示一个文本文件。其Usage为:fm /t &lt;文本文件名&gt;  复制一个文件。其Usage为:fm /c &lt;源文件名&gt; &lt;目标...

    C++ 编程思想 打印版 pdf

    3.2 C++的存取控制 42 3.3 友元 44 3.3.1 嵌套友元 45 3.3.2 它是纯的吗 48 3.4 对象布局 48 3.5 类 48 3.5.1 用存取控制来修改stash 50 3.5.2 用存取控制来修改stack 51 3.6 句柄类(handle classes) 51 3.6.1 ...

Global site tag (gtag.js) - Google Analytics