构造函数

常见问题/知识点记录(一)

冷暖自知 提交于 2020-03-10 06:27:28
一 call apply bind 相同点: 都可以改变函数内部的this指向 区别点: call和apply会调用函数 并且改变函数内部this指向 call和apply传递的参数不一样 call传递参数 arg1,arg2…形式 apply是数组形式 bind不会调用函数 可以改变this指向 传值方式类似call 主要应用场景: call经常做继承 apply经常跟数组有关系 比如借助于数学对象实现数组最大最小值 bind不调用函数 但会改变this指向 比如改变定时器的this指向 call和apply哪个性能更好一些? 两个传参数 <=3 个的时候 性能差不多 >3 的时候 call的性能比apply性能相对要好一些 一般后期开发 使用call多一点 call–前面的参数值作用域对象 后面的参数可以是多个 apply–第一个参数是作用域对象 第二个参数必须是数组 bind–绑定一个作用域 但不是立即执行 var b = a . fn var c = b . bind ( a , 1 , 2 ) c ( ) // c的作用域是a 二 什么是高阶函数 一. 函数作为参数 二. 函数作为返回值 三 箭头函数与普通函数(function)的区别是什么? 箭头函数语法比普通函数更加简洁 箭头函数没有自己的this 它里面的this继承函数所属上下文中的this

建造者模式

浪尽此生 提交于 2020-03-10 05:41:22
建造者模式 使用场景 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。 解决的问题 当一个类的构造函数参数超过4个,而且这些参数有些是可选的时,我们通常有两种办法来构建它的对象。 例如我们现在有如下一个类计算机类 Computer ,其中cpu与ram是必填参数,而其他3个是可选参数,那么我们如何构造这个类的实例呢,通常有两种常用的方式: 第一:折叠构造函数模式(telescoping constructor pattern ),这个我们经常用,如下代码所示(写很多构造方法) 第二种:Javabean 模式(用set刚刚传值) 那么这两种方式有什么弊端呢? 第一种主要是使用及阅读不方便。你可以想象一下,当你要调用一个类的构造函数时,你首先要决定使用哪一个,然后里面又是一堆参数,如果这些参数的类型很多又都一样,你还要搞清楚这些参数的含义,很容易就传混了。。。那酸爽谁用谁知道。 第二种方式在构建过程中对象的状态容易发生变化,造成错误。因为那个类中的属性是分步设置的,所以就容易出错。 为了解决这两个痛点,builder模式就横空出世了。 如何实现 传统模式 建造者(Builder):为创建一个产品对象的各个部件指定抽象接口。 具体建造者(ConcreteBuilder):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示

C#之使类型参数--泛型

孤街醉人 提交于 2020-03-09 21:58:41
1 、泛型是什么 泛型的就是“通用类型”,它可以代替任何的数据类型,使类型参数化,从而达到只实现一个方法就可以操作多种数据类型的目的。 2 、为什么使用泛型 举一个比较两个数大小的例子: 以上例子实现int类型数据的大小比较是完全没有问题的,但是如果客户现在增加需求“又可以实现两个字符串大小的比较”,此时就不得不在类中再添加一个比较字符串大小的方法了: 如果客户现在还增加需求,要求实现浮点型的比较,那么工作量就更大了,不得不再次修改代码,显然这不是我们想看到的,两个方法中有大部分代码是类似的,所以微软提出了一个激动人心的特性--泛型,他使得类型可以被参数化。 where语句是类型参数的约束它用来使参数可以适用于CompareTo方法。 向泛型中加入元素的效率远比非泛型数组高,原因是非泛型rrayList的Add(Object value)方法中,参数为object类型,当把int参数i传入方法时,会发生装箱操作,从而导致性能的损失,使运行的时间变得更长。 泛型可以保证类型安全,当你向int类型数组中添加string类型的值的时候,会造成“无法从string类型转换为int类型”的错误,因为你用int类型初始化了泛型类型。 3 、泛型参数解析 1、类型参数 根据泛型类型参数是否已经提供实际类型,可分为未绑定的泛型和已构造的泛型,如果没有给泛型提供实际类型,此时的泛型成为未绑定的泛型

从函数返回unique_ptr

烂漫一生 提交于 2020-03-09 21:47:21
unique_ptr<T> 不允许复制构造,而是支持移动语义。 但是,我可以从函数返回 unique_ptr<T> ,并将返回的值分配给变量。 #include <iostream> #include <memory> using namespace std; unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // 1 //return move( p ); // 2 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; } 上面的代码按预期进行编译和工作。 那么第 1 行如何不调用复制构造函数并导致编译器错误呢? 如果我不得不使用第 2 行,那将是有意义的(使用第 2 行也可以,但是我们不需要这样做)。 我知道C ++ 0x允许对 unique_ptr 此异常,因为返回值是一个临时对象,一旦函数退出,该对象将被销毁,从而保证了返回指针的唯一性。 我很好奇这是如何实现的,它是在编译器中进行特殊处理还是在该语言规范中使用了其他条款? #1楼 这绝不是 std::unique_ptr 特有的,而是适用于任何可移动的类。 语言规则保证了这一点,因为您按价值返回。 编译器尝试取消副本,如果无法删除副本

ES6的class 构造函数

跟風遠走 提交于 2020-03-09 17:39:37
前言 这东西私下学了n遍了,还是老记不住,这次空闲时间在学习react,常用到class,好记性不如烂笔头啊,所以专门记录一下,方便之后查看; 正文 1. 普通函数 // func语法 function Demo ( x , y ) { this . x = x this . y = y } Demo . prototype . test = function ( ) { return ` ${ this . x } 是X的值, ${ this . y } 是Y 的值` } let str = new Demo ( 2 , 3 ) . test ( ) console . log ( str ) //2是X的值,3是Y 的值 2. 使用class改写 class Demo2 { constructor ( x , y ) { this . x = x this . y = y } test ( ) { return ` ${ this . x } 是X的值, ${ this . y } 是Y 的值` } static chanage ( ) { return '测试是否能被继承' } } let str2 = new Demo2 ( 5 , 6 ) . test ( ) let str3 = Demo2 . chanage ( 2 ) // let str4 = new Demo2

c++构造函数的作用---13

人走茶凉 提交于 2020-03-09 12:25:54
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ http://blog.csdn.net/tidyjiang/article/details/52073671 一、 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0; } private: // 数据成员 int m_value; } 该类对象被创建时,编译系统对象分配内存空间, 并自动调用该构造函数->由构造函数完成成员的初始化工作 eg: Counter c1; 编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调用构造函数Counter( )自动地初始化对象c1的m_value值设置为0 故: 构造函数的作用:初始化对象的数据成员。 二、 构造函数的种类 class Complex { private : double m_real; double m_imag; public: // 无参数构造函数 // 如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做 // 只要你写了一个下面的某一种构造函数,系统就不会再自动生成这样一个默认的构造函数,如果希望有一个这样的无参构造函数

C++直接初始化,拷贝初始化,调用哪个构造函数?

浪子不回头ぞ 提交于 2020-03-09 09:46:30
很多C++新手不明白直接初始化、拷贝初始化,不清楚初始化过程中使用哪个构造函数。在学习过程中,要有基本概念,并且养成正确的认识也是非常重要的。因此整理了本文。 常见错误认识1: 1.使用()和使用=定义对象没什么区别。(直接初始化、拷贝初始化。) 2.直接初始化使用构造函数。(错,也可能使用拷贝构造函数。) 3.拷贝初始化使用拷贝构造函数。(错,也能使用构造函数。) 直接初始化 如果有一个新对象被定义(即创建了新对象),一定有构造函数被调用。 使用直接初始化时,我们实际上要求编译器使用普通的函数匹配,来提供参数最匹配的构造函数。因此直接初始化可能使用构造函数,也可能使用拷贝构造函数。 简单理解,用()来定义对象的就为直接初始化。 拷贝初始化 按字面意思理解即可,将一个对象给另一个对象初始化。 简单理解,用=定义对象的就为拷贝初始化。 注意: 拷贝赋值运算符也用在=的情况下,但是在对象已经创建并存在的情况下,只是修改对象的值而已。 而用=拷贝初始化是发生在定义一个对象的情况下,即对象此前尚未存在。 类定义如下: # include <string> # include <iostream> class Book { public : Book ( ) = default ; Book ( std :: string s ) : name ( s ) { std :: cout <<

原型 原型链

走远了吗. 提交于 2020-03-09 09:32:19
文章目录 一、构造函数和原型 二、原型 三、对象原型__proto__ 四、constructor 构造函数 五、原型链 六、原型对象this指向 一、构造函数和原型 创建对象可以通过以下三种方式: 1、对象字面量 var obj2 = { } ; 2、new Object() var obj1 = new Object ( ) ; 3、自定义构造函数(对象有很多的公共属性和方法 抽取出来做一个模板 然后再大量的生产对象) function Star ( uname , age ) { this . uname = uname ; this . age = age ; this . sing = function ( ) { console . log ( "唱歌" ) } } //利用构造函数创建对象 var ldh = new Star ( "刘德华" , 18 ) ; var zxy = new Star ( "张学友" , 19 ) ; console . log ( ldh ) ; ldh . sing ( ) ; zxy . sing ( ) ; 构造函数 是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new一起使用,我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。 new在执行时会做四件事: 在内存中创建一个新的空对象

心得---字符流、缓冲流、装饰模式

若如初见. 提交于 2020-03-09 08:11:52
1. Reader类和Writer类用来专门处理字符流。这两个类都是抽象类,从他们派生出了许多子类,增强功能、提高效率,实现各种不同要求的字符输入/输出流的处理。 IO体系中的子类名后缀都是父类名称,而前缀都是体现子类功能的名字。字符流用于存储和检索文本。两者的使用方法与InputStream类和OutputStream类基本相同,不同的是,这两个类以Unicode字符为单位进行读写,当写入一个16 位的Unicode字符时,按字节分成两部分,先写高位字节,后写低位字节。 对于读取或者写入流对象的构造函数,以及读写方法,还有刷新关闭功能都会抛出IOException或其子类,所以都要进行处理。 2. Reader 抽象类java.io.Reader是所有字符输入流类型的父类,其中声明了用于读取字符流的有关方法,其类层次关系为: 3. Reader类中定义的方法 µ public int read():读取一个字符,返回的是读到的那个字符。如果读到流的末尾,返回-1。 µ public int read(char[] cbuf):将读到的字符存入指定的数组中,返回的是实际读取的字符数。如果读到流的末尾,返回-1。 µ public abstract int read(char[]cbuf,int off,int len):将读到的字符存入数组的指定位置(off)

Angular2 constructor VS ngOnInit

怎甘沉沦 提交于 2020-03-09 07:14:24
constructor和ngOnInit钩子有什么不同? constructor constructor(构造函数)是ES6类或TypeScript类中的特殊方法,而不是Angular的方法,主要用来做初始化操作,在进行类实例化操作是,会被自动调用。通过constructor方法并不能使我们知道Angular何时完成了组件的初始化工作。 仅显示constructor方法: import { Component } from '@angular/core'; @Component({}) class ExampleComponent { // this is called by the JavaScript engine // rather than Angular constructor(name) { console.log('Constructor initialised'); this.name = name; } } // internally calls the constructor let appCmp = new ExampleComponent('AppCmp'); console.log(appCmp.name); 运行以上代码,控制台输出结果: Constructor initialization AppCmp