博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++拷贝控制
阅读量:4464 次
发布时间:2019-06-08

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

1、拷贝构造函数

如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数是拷贝构造函数。

C(const C &);//参数通常是const的引用

拷贝构造函数在下列情况下发生:

  • 拷贝初始化时使用(=定义变量)。
  • 将一个对象作为实参传递给一个非引用类型的形参。
  • 从一个返回类型为非引用类型的函数返回一个对象。
  • 用花括号列表初始化一个数组中的元素或一个聚合类中的成员。

拷贝构造函数的参数必须是引用类型,因为如果不是引用的话,调用拷贝构造函数时要拷贝它的实参,拷贝它的实参需要调用拷贝构造函数构造函数,如此无限循环。

如果我们没有为类定义一个拷贝构造函数,编译器会自动合成一个拷贝构造函数。

(1)拷贝初始化

直接初始化是要求编译器使用普通的函数匹配选择与我们提供的实参最匹配的构造函数:

string s1(10,'c');

string s2(s1);

拷贝初始化要求编译器将右侧运算对象拷贝到正在创建的对象中(有时候需要类型转换):

string s3=s1;

string s4="abc";

string s5=string(100,'c');

拷贝初始化通常使用拷贝构造函数来完成。

如果在拷贝初始化的过程中需要类型转换,注意使用explicit的构造函数转换时只能用直接初始化:

vector<int>v1(10);//直接初始化

vector<int>v2=10;//错误,接受大小参数的构造函数时explicit的,不能类型转换后拷贝初始化

同理

void f(vector<int>);

f(10);//错误

f(vector<int>(10));正确,//直接构造一个临时的vector

2、拷贝赋值运算符

拷贝赋值是通过重载赋值运算符实现的,重载运算符本质上是个函数,由operator关键字后接要重载的运算符组成,重载赋值运算符就是一个名为operator=的函数。

Foo & operator=(const Foo&){

  //赋值操作

  return *this;

}

赋值运算符接受一个与其所在类类型相同的参数,并返回一个指向其左侧运算对象的引用。

如果我们没有为类定义一个拷贝赋值运算符,编译器会自动合成一个拷贝赋值运算符。

3、析构函数

 构造函数初始化对象的static数据成员,析构函数释放对象使用的资源,销毁对象的非static数据成员。

~C(){}

  • ~接类名构成
  • 没有返回值
  • 不接受参数(因此不重载,唯一)

析构函数由函数体和析构部分组成,首先执行函数体,然后销毁成员。如果我们没有定义析构函数,编译器会自动合成一个构造函数。

只要对象被销毁就执行析构函数:

  • 变量离开其作用域
  • 对象被销毁时,其成员也被销毁
  • 容器被销毁时,其元素被销毁
  • 对于动态分配的对象,对它的指针应用delete时被销毁
  • 对于临时对象,创建它的完整表达式结束时被销毁

隐式销毁一个内置类型的指针不会销毁其指向的对象,如果指针指向的是动态内存,注意用delete销毁对象。

转载于:https://www.cnblogs.com/StormWendy/p/8460457.html

你可能感兴趣的文章
【python】获取网页中中文内容并分词
查看>>
每周进度条(第14周)
查看>>
驱动使用的一致性
查看>>
一起搞懂PureMVC(二)
查看>>
poj 2349(最小生成树应用)
查看>>
在输入框内触发移动到特点区域事件(也可换成点击事件)
查看>>
拜师鸟哥之linux学习体会(13)——linux账号管理与ACL权限设定
查看>>
Shell编程-条件测试 | 基础篇
查看>>
[Spring Boot Reference Guide] 读书笔记一 Getting Started
查看>>
AngularJs学习笔记1——总体介绍
查看>>
C语言第十二讲,文件操作.
查看>>
绝对定位和相对定位
查看>>
处女座的测验(一)
查看>>
实习第二天——学习mac终端命令(unix命令)和git代码管理
查看>>
初识redis
查看>>
微信支付
查看>>
2018、
查看>>
iOS开发拓展篇—CoreLocation定位服务
查看>>
吴裕雄--天生自然 高等数学学习:含参变量的积分
查看>>
ServletContext对象的使用
查看>>