构造函数

通过初始化列表初始的情况

邮差的信 提交于 2020-03-18 11:22:19
在构造函数中,以下几类的成员变量必须用初始化列表初始化: 1、类成员为const类型或引用类型 2、类成员为没有默认构造函数的类 3、在继承关系中,派生类必须在其初始化列表中调用基类的构造函数 原因是,const对象或引用只能初始化而不能赋值。构造函数的函数体内只能赋值而不能初始化,因此初始化const对象或引用只能在构造函数之前的初始化列表中初始化。 来源: 51CTO 作者: wx5cb188ffabeef 链接: https://blog.51cto.com/14289397/2479590

Effective C++ 读书笔记(1-7)

安稳与你 提交于 2020-03-18 07:23:31
作者 Scott Meyers 翻译作者 侯捷 C++ 神牛 台湾人 术语: 1.explicit C++提供了 关键字 explicit,可以阻止不应该允许的经过 转换构造函数 进行的隐式转换的发生。声明为explicit的 构造函数 不能在隐式转换中使用。但他们仍然可以用来进行显示转换。 示例: class Test1 { public: Test1(int n) { num = n; } //普通构造函数 private: int num; }; class Test2 { public: explicit Test2(int n) { num = n; } //explicit(显式)构造函数 private: int num; }; int main() { Test1 t1 = 12; //隐式调用其构造函数, 成功 Test2 t2 = 12; //编译错误,不能隐式调用其构造函数 Test2 t3(12); //显式调用成功 return 0; } 2 undefined behavior int *p=0; //p其实是一个NULL指针 std::cout<<*p;//对一个NULL指针取值会导致不明确行为。 条款一: 封装 encapsulation、继承 inheritance、多态 polymorphism 在STL中,迭代器和函数对象都是在C指针之上塑造的

JS函数表达式 -- 私有变量

风格不统一 提交于 2020-03-18 06:53:28
  任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。 私有变量包括函数的参数、局部变量和在函数内部定义的其它函数。 function add(num1, num2){ var sum = num1 + num2; return sum; } 在这个函数中,有三个私有变量: num1、num2和sum。在函数内部可以访问这几个变量。但在函数外部则不能访问他们。 如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量。利用这一点,就可以创建用于访问私有变量的公有方法。 我们把有权访问私有变量和私有桉树的公有方法称为特权方法(privileged method)。有两种在对象上创建特权的方法: 1. 在构造函数中定义特权方法: function MyObject(){ //私有变量 var privateVariable = 10; //私有函数 function privateFunction(){ return false; } //特权方法 this.publicMethod = function(){ privateVariable++; return privateFunction(); } } var obj = new MyObject(); alert(obj.publicMethod()); //false

【天赢金创】面向对象的程序设计之创建对象

岁酱吖の 提交于 2020-03-17 22:43:42
某厂面试归来,发现自己落伍了!>>> 对象的定义:无序属性的集合,属性的值可以是基本值、对象或者函数. 每个对象都是基于一个应用类型创建的,这个引用类型可以是内置的(例如Object Array Math),也可以是用户自定义的. 基于Object创建对象 所有的对象都是继承自Object的,因此我们可以从Object着手创建对象. //通过new 关键字创建对象 var person = new Ojbect(); person.name = 'yuhualinfeng' ; person.age = 30 ; person.job = 'web developer' ; //通过对象字面量创建对象 var person = {}; person.name = 'yuhualinfeng' ; person.age = 30 ; person.job = 'web developer' ; 基于Object创建对象有两种形式,一种是使用new关键字,另一种是使用对象字面量. 使用这种方式创建对象的缺点是:当创建多个相同类型的对象时,会产生许多重复的代码,假如我要三个person对象,我就需要写三相同结构的代码,为了解决这个问题,我们引入了工厂模式创建对象. 使用工厂模式创建对象 工厂模式是软件工厂领域一种广为认知的设计模式,这种模式抽象了创建具体对象的过程. function

用白话讲解JS中的继承核心

丶灬走出姿态 提交于 2020-03-17 14:50:49
【前言】 近来因为讲课需要,涉及到使用JavaScript中的继承,但发现遇上不懂的同学,无法用一句话带过,因为周边涉及的知识点比较多,因此决定系统的来说一说,我先简单用一点图来描述什么是继承。(不懂的同学可以先忽略英文) 请先忽略prototype等看不懂的单词,可以看到祖宗改变就能影响后代,这样也就让我们能改一处,多出发生变化,减轻了工作量,提高了效率。 【继承的思路】 总的来说继承可以理解为设置属性或功能的多复用,那么大致有2条路子实现该功能。 1:祖宗构造函数的原型,其是创建对象时参照的模板,所有实例共享该原型对象的是属性及函数。 2:祖宗构造函数本身的复用,在子孙构造函数内部调用祖宗的构造函数,因此执行了祖宗的构造方法,从而子孙享有祖宗构造过程。 【构造函数继承】 重点就是子类调用父类构造函数来创建对象 // 人类 function People () { this.description = '人类'; } // 学生 function Student () { // 调用People函数,改变this指向 People.call(this); } var s = new Student(); s.description; // 人类 【原型继承】 重点是子类使用父类原型来共享 // 人类 function People () {} People.prototype

简单一文让你认识有关继承

久未见 提交于 2020-03-17 07:07:45
1、 什么是继承 1、继承是与 构造函数 相关的应用 2、是指,让一个构造函数去继承另一个构造函数的属性和方法 3、继承是发生在两个构造函数之间的 1 两个构造函数之间 2 子级继承父级 3 继承的是父级的属性和方法 2 ES5 之继承的常见方法 1、原型继承 原型继承1 原型继承2 2、借用构造函数继承 借助构造函数继承 – 多继承 3、组合继承 ES6 class继承的语法 ES6语法中,提供了非常简单的继承方式 来源: CSDN 作者: LL-Echo 链接: https://blog.csdn.net/ephemeral0/article/details/104905631

java创建类的5种方式

匆匆过客 提交于 2020-03-17 07:04:51
1、使用new关键字 } → 调用了构造函数 这种方式,我们可以调用任意的构造函数(无参的和带参数的)。 2、使用Class类的newInstance方法 } → 调用了构造函数 使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。 3、使用Constructor类的newInstance方法 } → 调用了构造函数 和Class类的newInstance方法很像, java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。 4、使用clone方法 } → 没有调用构造函数 无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。 要使用clone方法,我们需要先实现Cloneable接口并实现其定义的clone方法。 5、使用反序列化 } → 没有调用构造函数 当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。 为了反序列化一个对象,我们需要让我们的类实现Serializable接口 代码demo 1 package javatest

Java初始化顺序

被刻印的时光 ゝ 提交于 2020-03-17 04:43:29
Java初始化顺序 1 无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); } } class Test{ static Sample sam= new Sample("静态成员sam初始化"); Sample sam1= new Sample("sam1成员初始化"); static { System.out.println("static块执行"); if (sam== null )System.out.println("sam is null"); sam= new Sample("静态块内初始化sam成员变量"); } Test() { System.out.println("Test默认构造函数被调用"); } } //主函数 public static void main(String str[]) { Test a= new Test(); } 输出结果为: 静态成员sam初始化 -----静态成员初始化 static块执行 -----静态块被执行 静态块内初始化sam成员变量 ----静态块执行 sam1成员初始化 -----普通成员初始化 Test默认构造函数被调用

JAVA初始化顺序

好久不见. 提交于 2020-03-17 04:41:21
主要内容: 1 无继承情况下的JAVA初始化顺序 2 JAVA继承情况下的初始化顺序 无继承情况下的JAVA初始化顺序 1 class Sample 2 { 3 Sample(String s) 4 { 5 System.out.println(s); 6 } 7 Sample() 8 { 9 System.out.println("Sample默认构造函数被调用"); 10 } 11 } 12 class Test{ 13 static Sample sam=new Sample("静态成员sam初始化"); 14 Sample sam1=new Sample("sam1成员初始化"); 15 static{ 16 System.out.println("static块执行"); 17 if(sam==null)System.out.println("sam is null"); 18 sam=new Sample("静态块内初始化sam成员变量"); 19 } 20 Test() 21 { 22 System.out.println("Test默认构造函数被调用"); 23 } 24 } 25 //主函数 26 public static void main(String str[]) 27 { 28 Test a=new Test(); 29 } View Code

js中的原型

天涯浪子 提交于 2020-03-16 23:42:09
对象的__proto__ js中万物皆对象,每个数据都会有一个__proto__的属性,这个属性叫隐式原型。 一个对象(obj)的隐式原型( proto )指向构造该对象(obj)的构造函数(Object())的原型属性(Object.prototype)。 这样做的原因是为了能够保证实例(obj)能够访问到在构造函数(Object())的原型属性(Object.prototype)中定义的属性和方法。 function createPerson ( ) { } console . log ( createPerson . prototype ) ; var p1 = new createPerson ( ) ; console . log ( p1 ) ; console . log ( p1 . __proto__ ) ; // 是一个对象,起名叫隐式原型 // 实例身上的隐式原型,是为了标记当前实例的来源函数的原型对象 函数对象的prototype 函数(Function)是一个特殊的对象,除了和其他对象一样有上述__proto__属性之外,还有自己特有的属性——原型(prototype),这个属性被描述成指针。他指向一个对象类型的数据,这个对象的用途就是包含所有将来使用该函数构造出来的可被共享的属性和方法(我们把这个对象叫做原型对象)。 function