构造方法

【M10】在构造方法内阻止资源泄漏

时光怂恿深爱的人放手 提交于 2019-11-27 01:17:32
1、类中没有指针,如果对象构造过程中出现异常,C++保证已经构造好的那一部分自动销毁。注意:这里不是调用析构方法,而是编译器在你的构造方法中插入了一些代码,保证对已经构造好的对象析构。 2、类中有指针,比如有a, b两个指针。对象构造时,a初始化完成,b抛出异常,C++只会对已经构造好的对象析构,而不会对已经初始化好的指针执行delete。因此资源泄漏。 3、注意,这种情况下,绝不会调用析构方法,因为C++只会析构已经构造完成的对象。接着思考,在堆上分配对象,把指针传出来,对指针delete,可行吗?   不可行,因为构造过程出现异常,指针是传递不出来的。外部的指针还是null。 4、思考:为什么C++只析构已经构造完成的对象?   假如析构部分构造的对象,那么析构方法该做些什么事呢?应该是析构已经构造好的那一部分,但是这要求记录哪些内容已经构造好,哪些内容没有构造好,显然,这个代价太大,因此不执行。 5、怎么解决上面的问题呢?   对指针的初始化过程,使用try...catch。但是这里有个问题,对于const指针(不是指向const对象的指针),必须在初始化列表中进行初始化,没办法使用try...catch。该怎么办? 建立成员方法,返回指针。 6、第一条我们就提到,对象构造过程中,如果出现异常,C++会对已经构造好的对象进行析构,但是不会对已经初始化好的指针进行delete

父类构造方法中调用虚方法

旧巷老猫 提交于 2019-11-27 01:17:24
1、在C++中,明确指出,不要在父类构造方法调用虚方法,为啥?   因为,构造子类对象,首先调用父类构造方法(初始化列表,然后构造方法内代码),然后子类构造方法(初始化列表,然后构造方法内代码),在父类构造方法中,还没有子类的成分,也就是说,当前本质上还是父类对象。因此,调用的方法还是父类方法,不会产生预期的多态行为。 2、但是,最近在C#当中发现一个很奇怪的现象:父类构造方法调用虚方法,也会产生多态的行为。确实让人奇怪,只能说编程语言细节太多。C#是如何做到的呢?   自己猜测,可能是在父类构造方法之前,完成了对虚方法表的整体拷贝,并且置换为重写后的方法。 转载于:https://www.cnblogs.com/nzbbody/p/3585302.html 来源: https://blog.csdn.net/weixin_30221279/article/details/99234712

理解reserve与resize

我只是一个虾纸丫 提交于 2019-11-27 01:17:23
1、首先明白capacity与size的概念,capacity表示当前可以容纳多少个元素,size表示当前有多少个元素。为了避免频繁地分配内存,vector预留了一些内存。也就是说:size<=capacity。 2、reserve(n)的目的是:使容器可以容纳n个元素,也就是修改capacity。   a、如果n>capacity,重新分配内存,把原来的数据copy过来,修改capacity = n。   b、如果n< = capacity,什么也不做,直接返回。 3、resize(n)的目的是:修改当前元素的个数。   a、如果n<size,对尾部多余的元素进行析构。   b、如果n=size,什么也不做。   c、如果size<n<=capacity,在尾部补齐元素。没有指定构造方法,使用default构造方法。   d、如果n>capacity,重新分配内存,把原来的数据copy过来,在尾部补齐元素。没有指定构造方法,使用default构造方法。 转载于:https://www.cnblogs.com/nzbbody/p/3591406.html 来源: https://blog.csdn.net/weixin_30411997/article/details/99234711

【M27】要求或者禁止对象产生于heap之中

試著忘記壹切 提交于 2019-11-27 01:16:52
1、要求对象只能产生于heap之中,该怎么办?   栈上的对象肯定调用构造方法和析构方法(离开作用域的时候),因此,要求对象只能产生于heap之中,也就是禁止栈上产生对象,解决办法有两种:将所有的构造方法声明为private,或者将析构方法声明为private。 2、将所有的构造方法声明为private,这样就不能在栈上构造对象了。这有两点需要注意:   a、这种情况下,不能 在外部 使用new operator在堆上构造对象,因为new operator要在分配的内存上,调用构造方法构造对象。因此,需要重新暴露接口,返回堆上的对象。办法有:在类内部使用new operator,暴露static方法;使用友元方法或者友元类。   b、一个类往往有多个构造方法,必须将所有的构造方法都声明为private。对于default 构造方法,如果没有声明任何构造方法,编译器会自动生成一个。对于copy构造,没有声明,编译器也会自动生成一个。 3、将析构方法声明为private,由于栈对象离开作用域,会自动调用析构方法,出现错误,在编译时就报错。这有两点需要注意:   a、这种情况下,不能 在外部 使用delete operator删除指针,因为delete operator要调用析构方法,然后调用operator delete释放内存。因此,需要重新暴露接口,Destroy方法

Java学习笔记(2)--- 对象和类入门,java包,this 和 super区别

时光怂恿深爱的人放手 提交于 2019-11-27 00:50:20
1.对象和类(Object and class): 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。 面对对象编程是java非常重要的一部分,作者本身之前学过c++所以省略了部分基础,详见例子: https://www.runoob.com/java/java-object-classes.html 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。 类:类是一个模板,它描述一类对象的行为和状态。 a.类的内容: 方法:比如说Dog可以有 void barking(),void sleeping() 这些行为。 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。比如说我们要定义狗的年龄,就从外部引入一个 age_dog 的变量赋值给成员变量。没有默认值,必须自己赋值。 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。比如狗 dog 可以有 age,color 这种特征变量。有默认值,如果没有会系统自动分配,根据类型不同则默认值不同。 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。 注

springDataJpa入门教程(7)-基于springDataJpa投影(Projection)返回自定义实体类对象

馋奶兔 提交于 2019-11-27 00:27:37
springDataJpa入门教程 springDataJpa入门教程(1)-基于springBoot的基本增删改查 springDataJpa入门教程(2)-Specification动态条件查询+排序+分页 springDataJpa入门教程(3-1)-基于EntityManager原生sql多表联合查询+动态条件查询+分页 springDataJpa入门教程(3-2)-基于EntityManager原生sql多表联合查询+动态条件查询+分页返回自定义实体类对象 springDataJpa入门教程(4)-Example单表动态条件查询+分页 springDataJpa入门教程(5)-单表动态条件查询+分页 springDataJpa入门教程(6)-多表动态条件查询+分页 springDataJpa入门教程(7)-基于springDataJpa投影(Projection)返回自定义实体类对象 springDataJpa入门教程(8)-JPA EnableJpaAuditing 审计功能 springDataJpa入门教程(9)-spring jpa实体属性类型转换器AttributeConverter的用法 springDataJpa入门教程(10)-JPA使用过程中遇到的坑及解决方法 springDataJpa入门教程(7)-基于springDataJpa投影

Java基础第7天+成员变量和局部变量的区别、匿名对象、封装、private关键字、this关键字、构造方法、static关键字

感情迁移 提交于 2019-11-26 23:25:34
1: 成员变量和局部变量的区别 ( 理解 ) (1) 在类中的位置不同 成员变量:类中方法外 局部变量:方法定义中或者方法声明上 (2) 在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 (3) 生命周期不同 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 (4) 初始化值不同 成员变量:有默认值 局部变量:没有默认值,必须定义,赋值,然后才能使用 注意事项: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。 2: 类作为形式参数的问题 ?( 理解 ) (1) 如果你看到一个方法需要的参数是一个类名,就应该知道这里实际需要的是一个具体的对象。 3: 匿名对象 ( 理解 ) (1) 没有名字的对象 (2) 应用场景 A: 调用方法,仅仅只调用一次的时候。 注意:调用多次的时候,不适合。 那么,这种匿名调用有什么好处吗 ? 有,匿名对象调用完毕就是垃圾。可以被垃圾回收器回收。 b: 可以作为实际参数传递。 4: 封装 ( 理解 ) (1) 隐藏实现细节,提供公共的访问方式 (2) 好处: A: 隐藏实现细节,提供公共的访问方式 B: 提高代码的复用性 C: 提高代码的安全性 (3) 设计原则 把不想让外界知道的实现细节给隐藏起来,提供公共的访问方式 (4)private 是封装的一种体现。

【游戏开发】小白学Lua——从Lua查找表元素的过程看元表、元方法

流过昼夜 提交于 2019-11-26 23:00:43
【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态 阅读目录 一、简介 二、前提知识 三、Lua中实现类、继承、多态 四、总结 回到顶部 一、简介   Lua是一门非常强大、非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言。但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是一项庞大复杂的工程,如果没有面向对象功能势必会为开发带来一定的不便。不过幸好Lua中有table这样强大的数据结构,利用它再结合元表(metatable),我们便可以很方便地在Lua中模拟出类、继承和多态等面向对象编程具有的特性。 回到顶部 二、前提知识   按照惯例,我们还是先来熟悉一下必要的前提知识,以便方便我们理解后续的代码。 1.表(table)   (1)table 是 Lua 的一种数据结构,用于帮助我们创建不同的数据类型,如:数组、字典等;   (2)table 是一个关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil,所有索引值都需要用 "["和"]" 括起来;如果是字符串,还可以去掉引号和中括号; 即如果没有[]括起,则认为是字符串索引,Lua table 是不固定大小的,你可以根据自己需要进行扩容;   (3)table 的默认初始索引一般以 1 开始,如果不写索引,则索引就会被认为是数字

Java基础08 继承

落花浮王杯 提交于 2019-11-26 22:39:29
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 继承(inheritance) 是面向对象的重要概念。继承是除 组合(composition) 之外,提高代码 重复可用性(reusibility) 的另一种重要方式。我们在 组合(composition) 中看到,组合是重复调用 对象的功能接口 。我们将看到,继承可以重复利用已有的 类的定义 。 类的继承 我们之前定义类的时候,都是从头开始,详细的定义该类的每一个成员。比如下面的Human类: class Human { /** * accessor */ public int getHeight() { return this.height; } /** * mutator */ public void growHeight(int h) { this.height = this.height + h; } /** * breath */ public void breath() { System.out.println("hu...hu..."); } private int height; } 从上面的类定义,我们可以了解该类的所有细节: 该类的数据成员,该类的方法,该类的接口。 现在要定义一个新的类,比如Woman类,并假设Woman与Human类相当类似

java的封装继承和多态

女生的网名这么多〃 提交于 2019-11-26 22:04:12
this 在每个类的内部,都有一个隐含的成员变量,该类的类型就是该类的类型,该成员变量的名称是this,this是一个引用,指向自身的对象。 this的用法: 1、this调用本类中的属性,也就是类中的成员变量 2、this调用本类中的其他方法 3、this调用本类中的其他构造方法,调用时要放在构造方法的首行 面向对象特征之封装(Encapsulation) 为什么要使用封装? 1、比如打电话,我们只要按键拨打就可以,不需要知道手机的内部结构,也不需要知道怎么打出去 2、比如给手机充电,只要通过手机提供的接口,就可以,不需要知道怎么把电冲进去的 封装的含义? 1、隐藏对象内部的复杂性,只对外公开简单的接口,便于外界使用,从而提高系统的扩展性、可维护性 使用访问权限修饰符,实现封装 Java用于限定其他对象对该类内部定义的访问权限 有public、protected 、private、default(不写)四个 对于class的权限只能使用public 或 default (不写) 如何实现封装? 修改属性的可见性来限制对属性的访问。为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问。 在赋值和取值方法中,加入对属性的存取的限制 public class Person { private String name; private int age; public String