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. springboot+mybatis+druid+atomikos框架搭建及测试

    前言 因为最近公司项目升级,需要将外网数据库的信息导入到内网数据库内.于是找了一些springboot多数据源的文章来看,同时也亲自动手实践.可是过程中也踩了不少的坑,主要原因是我看的文章大部分都是s ...

  2. 十款强大的IDEA插件-Java开发者的利器

    xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 插 ...

  3. springboot 整合shiro

    参考:        https://blog.csdn.net/fuweilian1/article/details/80309192(推荐)       https://blog.csdn.net ...

  4. 初学HTML5做的小知识点

    新增的HTML5标签 语义化标签 :<header> 头标签      <nav> 导航标签      <section> 表示文档的结构.栏目      < ...

  5. SharpMap V1.1 For Web教程系列之——地图展示

    开篇先说本次的开发环境吧.采用Vs2010,.Net Framework 4.0. 为了更好的调试程序,建议在IIS中进行调试及运行,个人非常不喜欢利用VS自己提供的WebServer去调试程序,而且 ...

  6. ionic $state.go() 传参

    例子: $state.go("tab.home" , {"hello": "world"}) 重点: 接受参数的页面--tab.home,需 ...

  7. ZOJ3435

    题意略. 思路: 将每一个点的坐标 (x,y,z) 与 (1,1,1) 相减,得到向量 (x - 1,y - 1,z - 1) 我们实际上就是要求出 这样互质的三元组有多少对就行了. 我们把这个长方体 ...

  8. GCN和GCN在文本分类中应用

    1.GCN的概念        传统CNN卷积可以处理图片等欧式结构的数据,却很难处理社交网络.信息网络等非欧式结构的数据.一般图片是由c个通道h行w列的矩阵组成的,结构非常规整.而社交网络.信息网络 ...

  9. 一文读懂HashMap

    推荐 转载:https://www.jianshu.com/p/ee0de4c99f87

  10. 洛谷-P1414 又是毕业季II -枚举因子

    P1414 又是毕业季II:https://www.luogu.org/problemnew/show/P1414 题意: 给定一个长度为n的数列.要求输出n个数字,每个数字代表从给定数列中最合理地取 ...