博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++题目--拷贝构造函数概念
阅读量:2382 次
发布时间:2019-05-10

本文共 2571 字,大约阅读时间需要 8 分钟。

拷贝控制操作

5种特殊的成员函数:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符、析构函数。

这5种特殊的成员函数用来控制定义一个类对象拷贝、移动、赋值和销毁操作,统称为拷贝控制操作

拷贝和移动构造函数:定义了当用同类型的另一个对象初始化本对象时的操作。

拷贝和移动赋值运算符:定义了将一个对象赋予同类型的另一个对象时的操作。

析构函数:定义了当此类型对象销毁时的操作。

缺点:我们没有显示定义这些操作函数,系统就会自动为它定义缺失的操作,有时默认定义会导致灾难。

拷贝构造函数

class CExample{public:         CExample(){pBuffer=NULL;nSize=0;}         ~CExample(){delete[] pBuffer;}         void Init(int n){pBuffer=new char[n];nSize=n;}public:         char*pBuffer;         int nSize;         CExample(const CExample &RightSides)         {                   nSize=RightSides.nSize;                   pBuffer=new char[nSize];                   memcpy(pBuffer,RightSides.pBuffer,nSize*sizeof(char));         }};    int main(){         CExample theObjone;         theObjone.Init(40);         CExample theObjtwo=theObjone;    if(theObjtwo.pBuffer==theObjone.pBuffer)//没有拷贝构造函数时,系统就会崩溃,无限复制,并修改了原对象。         cout<<"你"<

拷贝构造函数的定义

class Foo{public:Foo();         //默认构造函数Foo(const Foo &f)//拷贝构造函数}                                             /*Foo(const Foo& f):第一个参数f必须是一个引用类型。假如我们定义一个类没有拷贝构造函数,如:          */class Foo{public:Foo();         //默认构造函数//Foo(int n);    //即便定义重载构造函数,编译器仍会为我们自动合成一个拷贝构造函数。}

那么编译器会为我们隐式地定义一个拷贝构造函数Foo(const Foo& )。

拷贝构造函数的特点:

1.阻止拷贝该类类型的对象。

2.编译器从给定对象中依次将每个非静态成员拷贝到正在创建的对象中。

拷贝方式:

(1)类类型的成员:使用其拷贝构造函数来拷贝。

(2)内置类型的成员直接拷贝。

class Sales_data{public:     Sales_data(const Sales_data&);private:     string bookNo;     int units_sold=0;     double revenue=0.0;};//与Sales_data的合成的拷贝构造函数等价Sales_data::Sales_data(const Sales_data &orig):bookNo(orig.bookNo),//使用string的拷贝构造函数units_sol(orig.units_sold),//拷贝orig.units_soldrevenus(orig.revenue)//拷贝orig.revenue{  }

拷贝初始化

直接初始化:要求编译器使用普通的函数匹配选择与我们提供的参数最匹配的构造函数,即普通构造函数或重载构造函数。

拷贝初始化:要求编译器将右侧运算对象拷贝到正在创建的对象中。

string dots(10,’.’);//直接初始化string s(dots);//直接初始化string s2=dots;//拷贝初始化string null_book=”9-999-99999-9”;//拷贝初始化string nines=string(100,’9’);

拷贝初始化不仅在‘=’运算符定义变量时会发生,在以下情况也会发生:

1.将一个对象作为实参传递给一个非引用类型的形参

2.从一个返回类型为非引用类型的函数返回一个对象

3.用花括号列表初始化一个数组中的元素或一个聚合类中的成员

4.容器拷贝,

 string word;while(cin>>word)container.push_back(word);

在容器尾部创建的新元素值是word的一个拷贝。

直接初始化,不是拷贝

c.emplace_back(“978-0590353403”,25,15.99);

拷贝赋值运算符

Sales_data trans,accum;trans=accum;//使用Sales_data的拷贝赋值运算符

重载赋值运算符

拷贝赋值运算符

class Foo{public:     Foo& operator=(const Foo&);//赋值运算符};

合成拷贝赋值运算符

作用:

1.用来禁止该类类型对象的赋值

2.将右侧运算符对象的每一个非static成员赋予左侧运算对象的对应成员。

等价于

Sales_data& Sales_data::operator=(const Sales_data &rhs){bookNo=rhs.bookNo;      //调用string::operator=units_sold=rhs.units_sold;   //使用内置的int赋值revenue=rhs.revenue;      //使用内置的double赋值return *this;              //返回一个此对象的引用}

--

转载地址:http://dwwab.baihongyu.com/

你可能感兴趣的文章
va_start va_end 的使用和原理
查看>>
Linux 中的零拷贝技术,第 2 部分
查看>>
零拷贝技术的研究与实现
查看>>
零拷贝与 sendfile
查看>>
directfb显示中文
查看>>
关于SIGPIPE导致的程序退出
查看>>
setsockopt()函数用法
查看>>
TCP之send函数研究
查看>>
Linux下访问内存物理地址
查看>>
mmap测试程序
查看>>
linux 启动详解
查看>>
在linux内核中操作文件的方法
查看>>
Linux下Socket编程
查看>>
Linux内核和用户空间通信的方式— proc文件和mmap共享内存
查看>>
基于DSP/BIOS和NDK的嵌入式网络操作系统设计方案
查看>>
CCS开发环境搭建小结
查看>>
DM642 gel文件和.cmd文件参考
查看>>
DSP软件优化小实验
查看>>
DSP/BIOS 介绍
查看>>
多线程编程之重点--使用DSP/BIOS时选择线程类型的参考方法
查看>>