1、析构函数:释放对象使用的资源,并销毁对象的非static数据成员;析构函数不接受参数,因此不能被重载。对于一个给定类,有且只有一个析构函数。
 
2、析构函数的组成:一个函数体+一个析构部分(implicit);所完成的工作:先执行函数体,然后按照初始化成员的逆序销毁成员。在这里需要注意的是销毁成员的并不是函数体,而是析构部分。
 
3、什么时候会调用析构函数
    1)变量在离开其作用域时
    2)当一个对象被销毁时,其成员被销毁
    3)容器被销毁时,其元素被销毁
    4)对于动态分配的对象,当对指向它的指针应用delete运算符时被销毁(当指向一个对象的引用或指针离开作用域时,析构函数不会执行)
    5)对于临时对象,当创建它的完整表达式结束时被销毁
{//新的作用域
Sales_data *p = new Sales_data;//指向动态分配的对象,离开作用域应该不会被销毁,这里回调用拷贝构造函数
shared_ptr<Sales_data> p2 = make_shared<Sales_data>();//离开作用域会被销毁
Sales_data item(*p);//执行了拷贝构造函数
vector<Sales_data>v;
v.push_back(*p);
//析构函数目前应该执行3次,除了p不会被释放,其他的都应该被释放
delete p;//现在应该是4次
}
4、三/五法则:描述了什么时候需要析构函数、拷贝构造函数和拷贝赋值操作。
    1)需要析构函数的类也需要拷贝构造函数和拷贝赋值函数
            通常,若一个类需要析构函数,则代表其合成的析构函数不足以释放类所拥有的资源,其中最典型的就是指针成员(析构时需要手动去释放指针指向的内存)。
            所以,若存在自定义(且正确)的析构函数,但使用合成的拷贝构造函数,那么拷贝过去的也只是指针,此时两个对象的            指针变量同时指向同一块内存,指向同一块内存的后果很有可能是在两个对象中的析构函数中先后被释放两次。所以需要            额外的拷贝控制函数去控制相应资源的拷贝。
            所以这类例子的共同点就是:一个对象拥有额外的资源(指针指向的内存),但另一个对象使用合成的拷贝构造函数也同            时拥有这块资源。当一方对象被销毁后,析构函数释放了资源,这时另一个对象便失去了这块资源(但程序员还不知道)。
class person
{
public:
std::string *name;
int age;
person(const char* the_name, int the_age)
{
name = new std::string(the_name);
age = the_age;
cout << "这是构造函数" << endl;
}
~person()
{
delete name;
}
};
int main(void)
{
person a("me", );
person b(a);
std::cout << *b.name << std::endl;
return ;
}
//在上面的代码中对象b使用合成的拷贝构造函数拷贝对象a的值,这个程序没有什么实际意义。
//在main函数返回时,a,b变量会分别被析构,它们的成员name指向同一块内存,所以在程序结束时便会发生错误。
//修改方法,添加拷贝构造函数
person(const person &np):age(np.age),name(new string("the_name")){}
  2)需要拷贝操作的类也需要复制操作,反之亦然
        
   3)析构函数是不能删除的
 
   4)如果一个类有删除的或不可访问的析构函数,那么其默认和拷贝构造函数会被定义为删除的。
 
   5)如果一个类有const或引用成员,则不能使用合成的拷贝赋值操作
 
本质上,当不可能拷贝、赋值、或销毁类的所有成员时,类的合成拷贝控制函数就被定义成删除的了。 
 
5、可以使用=default来要求编译器生成合成的版本,隐式地声明为内联函数,如果不希望是内联的,可以将成员的定义放在类外。

[C++]类的设计(2)——拷贝控制(析构和三五法则)的更多相关文章

  1. OOP3(继承中的类作用域/构造函数与拷贝控制/继承与容器)

    当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的 ...

  2. [C++] 类的设计(2)——拷贝控制(1)

    1.一个类通过定义五种特殊的成员函数来控制此类型对象的拷贝.移动.赋值和销毁:拷贝构造函数.拷贝赋值运算符.移动构造函数.移动赋值运算符和析构函数.(拷贝.移动.析构)   2.拷贝和移动构造函数定义 ...

  3. C++的那些事:类的拷贝控制

    1,什么是类的拷贝控制 当我们定义一个类的时候,为了让我们定义的类类型像内置类型(char,int,double等)一样好用,我们通常需要考下面几件事: Q1:用这个类的对象去初始化另一个同类型的对象 ...

  4. C++拷贝控制

    一.拷贝控制操作 ​ 当定义一个类时,显示或隐式地指定了此类型的对象在拷贝.赋值和销毁时所执行的操作,通过三个特殊的成员函数来控制这些操作,分别是拷贝构造函数,赋值运算符和析构函数.拷贝构造函数定义了 ...

  5. 【c++ Prime 学习笔记】第13章 拷贝控制

    定义一个类时,可显式或隐式的指定在此类型对象上拷贝.移动.赋值.销毁时做什么.通过5种成员函数实现拷贝控制操作: 拷贝构造函数:用同类型的另一个对象初始化本对象时做什么(拷贝初始化) 拷贝赋值算符:将 ...

  6. [C++]类的设计(2)——拷贝控制(拷贝控制和资源管理)

      1.类的行为分类:看起来像一个值:看起来想一个指针.     1)类的行为像一个值,意味着他应该有自己的状态.当我们拷贝一个像值的对象时,副本和原对象是完全独立的.改变副本不会对原有对象有任何影响 ...

  7. [C++]类的设计(2)——拷贝控制(阻止拷贝)

    1.阻止拷贝的原因:对于某些类来说,拷贝构造函数和拷贝赋值运算符没有意义.举例:iostream类阻止了拷贝,以避免多个对象写入或者读取相同的IO缓冲.   2.阻止拷贝的方法有两个:新标准中可以将成 ...

  8. C++类拷贝控制 深拷贝 浅拷贝

    普通类型对象之间的复制很简单,而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量,这篇文章将帮你理清C++类对象的拷贝方式 拷贝构造函数,拷贝赋值运算符 首先我们简单了解下默认的拷贝 ...

  9. C++ Primer : 第十三章 : 拷贝控制之对象移动

    右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名 ...

随机推荐

  1. 前端利器躬行记(2)——Babel

    Babel是一个JavaScript编译器,不仅能将当前运行环境不支持的JavaScript语法(例如ES6.ES7等)编译成向下兼容的可用语法(例如ES3或ES5),这其中会涉及新语法的转换和缺失特 ...

  2. CentOS -- RocketMQ 4.3.2 standalone Installation and Configuration

    1 Download RockeMQ Package: You need to download it and put it to the OS Image. wget http://apache.c ...

  3. jvm系列(七):如何优化Java GC「译」

    本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. Sangmin Lee发表在Cubrid上的”Become a Java GC Expert”系列文章 ...

  4. Java之Exception

    Exception这个东西,程序中必须会有的,尽管我们很不乐意看到它,可是从另一个角度考虑,有异常则说明程序有问题,有助于我们及时改正.有的时候程序出错的原因有很多,比如不合法的输入.类型.空指针甚至 ...

  5. Egret白鹭开发微信小游戏排行榜功能

    推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 我的个人博客 最近事情特别多,今天终于实现了排行榜功能,记录下来大家一起学习学习. 一.调用默认排行榜 首先我们需要了解: 1.白鹭开 ...

  6. 消费者、生产者Java代码示例,wait

    箱子中的苹果代表资源,现在有消费者从箱子中拿走苹果,生产者往箱子中放苹果.代码如下: 资源--箱子中的苹果: public class Box { int size; int num; public ...

  7. Elasticsearch(5)--- 基本命令(集群相关命令、索引CRUD命令、文档CRUD命令)

    Elasticsearch(5)--- 基本命令 这篇博客的命令分为ES集群相关命令,索引CRUD命令,文档CRUD命令.这里不包括Query查询命令,它单独写一篇博客. 一.ES集群相关命令 ES集 ...

  8. bzoj 4025 二分图 lct

    题目传送门 题解: 首先关于二分图的性质, 就是没有奇环边. 题目其实就是让你判断每个时段之内有没有奇环. 其次 lct 只能维护树,(反正对于我这种菜鸟选手只会维护树), 那么对于一棵树来说, 填上 ...

  9. 牛客网暑期ACM多校训练营(第三场) E Sort String 哈希处理字符串(模板)

    链接:https://www.nowcoder.com/acm/contest/141/E来源:牛客网 Eddy likes to play with string which is a sequen ...

  10. CodeForces 1042 F Leaf Sets 贪心

    Leaf Sets 题意:给你一棵树,树上有n个点,只有一条边的点叫做叶子,现在要求把所有的叶子分组,每个组内的所有叶子的距离都不能大于k. 题解: 我们可以随意找一个不是叶子的节点当做这颗树的根节点 ...