构造函数

C++ 右值引用

蓝咒 提交于 2020-02-24 14:19:55
左值和右值 左值:当一个对象被用作左值的时候,用的是对象的身份(在内存中的位置)。 右值:当一个对象被用作右值的时候,用的是对象的值(内容)。 右值引用 重要性质:右值引用只能绑定到一个将要销毁的对象。因此,我们可以自由的将一个右值引用的资源移动到另一个对象中。 标准库move函数 move函数定义在头文件utility中,通过调用move函数可以获得绑定到左值上的右值引用。 int &&rr3 = std::move(rr1); move调用告诉编译器:我们有一个右值,但我们希望像一个右值一样处理它。意味着,除了对rr1赋值或销毁它外,我们将不再使用它的值。 注意:使用move应该使用std::move而不是move。这样可以避免潜在的名字冲突。 移动构造函数 类似拷贝构造函数,移动构造函数的第一个参数是该类类型的一个引用。不同于拷贝构造函数的是,这个引用参数在移动构造函数中是一个右值引用。与拷贝构造函数一样,任何额外的参数都必须有默认实参。 与拷贝构造函数不同,移动构造函数不分配任何新内存;它接管给定的对象中的内存。在接管内存之后,它将给定对象中的指针都置为nullptr。这样就完成了从给定对象的移动操作,此对象将继续存在。 移动赋值运算符 来源: https://www.cnblogs.com/xiaobaizzz/p/12356541.html

js对象

十年热恋 提交于 2020-02-24 04:14:16
对象 定义 无序的键值对的集合 创建对象的两种方式 字面量: var student = {};建了一个空对象 内置构造函数 var student = new Object(); 对象的赋值和取值 取值 对象名.属性名 ------如果存在,返回响应值;如果不存在,undefined 对象名.方法名------直接获取,返回函数体,对象名.方法名(),即调用这个方法 赋值(类似数组) 对象名.属性名-----存在,直接覆盖,不存在,新建属性,在赋值 操作对象的两种语法 点语法 对象名.属性名: 简单方便,不支持变量 中括号语法: 对象名[‘属性名’] 灵活,支持字符串和变量 对象名[变量名] :通过变量值找到属性名,然后再去对象里面查找对应的值 对象的遍历 for(var k in obj){……} k键(属性名) obj[k] 值(属性值) 批量创建对象 工厂函数 本质就是一个函数,将创建对象的代码进行封装成函数 特点:创建出来的类型都时Object类型 function createObject()({ var obj = {……}; return onj; } 注意点:1.返回值—调用时通过传过来的实参对对象进行具体的赋值 对象的方法中,this指的是当前的对象 自定义构造函数 特征:需要结合new使用,创建出来的对象有自己的类型 构造函数中new的作用 建立一个新对象

C++11的右值引用

北慕城南 提交于 2020-02-24 02:24:45
右值引用 :int &&p 左值引用:即普通引用 int& p 常量左值引用:const int& p 共同点:都是变量,都是引用 区别:左值引用只能绑左值,右值引用只能绑右值,但注意 右值引用同样也是变量,是左值! 常量左值引用却是个奇葩,它可以算是一个“万能”的引用类型,它可以绑定非常量左值、常量左值、右值,而且在绑定右值的时候,常量左值引用还可以像右值引用一样将右值的生命期延长,缺点是,只能读不能改。 如: 1 int f(); 2 vector<int> p(100); 3 4 int &&r1=f();    //f()返回int,是右值 5 int& r2=p[0];    //p的[]重载函数返回int&,是左值 6 int& r3=r1;     //r1虽然是右值引用,但它本身是左值 7 int&& r4=p[0]*f(); //表达式结果是右值 转载一个知乎的回答: 知乎链接: https://www.zhihu.com/question/64205844/answer/217733257 std::move 并不会真正地移动对象,真正的移动操作是在移动构造函数、移动赋值函数等完成的,std::move 只是将参数转换为右值引用而已(相当于一个 static_cast)。 std::string str = "test"; string&& r = std:

JavaScript面向对象

家住魔仙堡 提交于 2020-02-24 02:11:55
js就是个面向对象语言,一切皆对象 一、什么是面向对象? 举个最简单点的例子来区分 面向过程和面向对象 有一天你想吃鱼香肉丝了,怎么办呢?你有两个选择 1、自己买材料,肉,鱼香肉丝调料,蒜苔,胡萝卜等等然后切菜切肉,开炒,盛到盘子里。 2、去饭店,张开嘴:老板!来一份鱼香肉丝! 看出来区别了吗?这就是1是面向过程,2是面向对象。 二、对象实例化方式 1.字面量创建 弊端:这样的写法如果多生成几个(100个!)实例,写起来就非常麻烦,并且造成代码冗余。 2.内置构造函数 弊端:通过写一个函数,解决代码重复的问题,但还是造成了代码冗余。 3.工厂函数 弊端:无法判断对象属于哪个类型。 4.构造函数模式 弊端:每个实例调用的方法应该是一致的,但是实际上在生成实例时,各自都创建了自己的方法。消耗了内存。 三、Prototype 原型 .Javascript中所有的对象都是Object的实例,并继承Object.prototype的属性和方法,也就是说,Object.prototype是所有对象的爸爸。 四、原型链 让一个类型(构造函数)的原型对象 访问另外一个函数的s属性 查找顺序 在Js中 1.在自身的私有属性查找 2.沿着原型(链)向上查找 一直到objec.prototype为止 五、this指向 1.普通模式下 指向调用函数的对象。 对象里面指向obj

了解js设计模式

随声附和 提交于 2020-02-24 01:02:20
什么是设计模式? 针对 特定问题 , 给出的简洁而优化的处理方案 一个设计模式 A 只能解决 A 类型的问题 针对 B 类型的问题, 设计模式 A 解决不了 同一个问题, 再不同的位置, 是不一定能用同一种方案解决 设计模式, 只在特定的情况, 特定的时期, 针对特定的问题使用 市场上常见的设计模式 单例模式 组合模式 观察者模式 适配器模式 代理模式 工厂模式 构建模式 单例模式 单: 单一, 一个, 独个 例: 实例(构造函数的实例化对象) 让一个构造函数一辈子只有一个实例对象 当你需要一个构造函数一生只能 new 出一个对象的时候 就可以使用单例模式. 单例模式的简单应用: 弹出层 alert() 比较丑, 用户体验极度不好 好多网站会使用一个自己写的 div 盒子, 当作弹出层 再自己写的过程中, 一个网站不可能只弹出一次 创造 div 并显示出来的构造函数 用代码来表示 组合模式 组合模式: 举例: 当你回家的时候, 你一打开门家里的所有东西就启动了, 灯会亮起来, 电视打开了, 空调打开了, 窗帘拉开了, … 组合模式: 把我们若干这启动方式一样的构造函数放在一起准备一个总开关, 总开关一启动, 那么这些个构造函数就都启动了 实现组合模式: 需要一个承载所有构造函数实例的数组 需要一个方法, 向数组里面添加内容 需要一个方法, 能把数组里面的所有内容启动了 应用场景

java面向对象入门(3)-java构造方法

烂漫一生 提交于 2020-02-24 00:00:09
Java构造函数 是特殊的方法(没有返回类型),使您可以在应用程序内部的其他类使用对象之前完全初始化对象状态。Java中的构造方法是使用 new 关键字调用的。 下面让我们更深入地了解构造函数。 1.什么是java构造函数 构造函数是一种特殊的方法,类似于(没有确切的方法)构造,它可以帮助程序员在对象可被应用程序中的其他对象使用之前编写对象初始化代码。 每当应用程序需要任何类的新实例时,JVM就会在堆内部分配一个内存区域。然后,JVM执行调用的构造函数(类可以具有多个构造函数)并初始化对象状态。在构造函数内部,您可以访问所有对象属性,并将它们分配给它们的默认值或任何所需的值。 2.构造函数类型 2.1.默认构造函数(无参数构造函数) 如果程序员在类定义中不提供任何构造函数,则JVM在运行时为该类提供默认构造函数。 程序员还可以覆盖类中的默认构造函数。让我们看一下语法。 public class Employee { public Employee() { } } 在默认构造函数中,构造函数的名称必须与类名称匹配,并且不应具有任何参数。 2.2通过构造函数重载进行参数化构造函数 如上所述,一个类中可以有多个构造函数。这可以通过重载构造函数来实现。在 构造函数重载中 ,您可以根据要求传递参数列表,即可以初始化类的数量。 public class Employee { private

实现一个new操作符

有些话、适合烂在心里 提交于 2020-02-23 19:39:01
实现一个new操作符 new操作符会返回一个对象,即构造函数当中的this,它可以访问构造函数原型上的属性以及方法 function create(Con, ...args) { this.obj = {};//创建一个空的对象 //将空对象指向构造函数的原型链 Object.setPrototypeOf(obj, Con.prototype); //obj绑定到构造函数上,便可以访问构造函数中的属性 let result = Con.apply(obj, args); //如果返回的result是一个对象则返回该对象,new方法失效,否则返回obj return result instanceof Object ? result : obj; } function Test(name, age) { this.name = name; this.age = age; } let test = create(Test, 'yin', 20); console.log(test.name);//yin console.log(test.age);//20 来源: https://www.cnblogs.com/yinping/p/11263108.html

JavaScript 构造函数的继承

大憨熊 提交于 2020-02-23 17:58:43
JavaScript 构造函数的继承 传奇文学 https://www.xs86.com 在上一篇 文章 中讲述了 JS 对象、构造函数以及原型模式,这篇文章来讨论下 JavaScript 的继承 继承是 OO 语言中的一个最为人津津乐道的概念。许多 OO 语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。如前所述,由于函数没有签名,在 ECMAScript 中无法实现接口继承。ECMAScript 只支持实现继承,而且其实现继承主要是依靠原型链来实现的。 一、使用 call 或 apply 假如有一个 "人" 对象,还有一个 "学生" 对象。 function Person(name, age) { this.name = name this.age = age } function Student(subject) { this.subject = "语文" } 我们怎样才能使 "人" 对象继承 "学生" 对象的属性或方法呢。第一种方法,也是最简单的方法,使用 call 或 apply 来改变 this 指向使其调用对象的属性或方法。 function Person(name, age) { this.name = name this.age = age Student.call(this, name, age) } var

this 指向

試著忘記壹切 提交于 2020-02-23 03:43:10
使用 JavaScript 开发的时候,很多开发者多多少少会被 this 的指向搞蒙圈,但是实际上,关于 this 的指向,记住最核心的一句话: 哪个对象调用函数,函数里面的 this 指向哪个对象。 普通函数:谁调用指向谁 全局变量指向全局对象-window var username = 'cn' function fn() { alert(this.username) //cn } fu() 有一点需要注意,let 声明的全局变量,不是指向 window 对象 let username = 'cn' function fn() { alert(this.username) //undefined } fn() 对象函数调用 就是那个函数调用,this 指向哪里 window.b = 2222 let obj = { a: 111, fn: function() { alert(this.a) //111 alert(this.b) //undefined } } obj.fn() 构造函数中调用 JS里的普通函数可以使用new操作符来创建一个对象,此时该函数就是一个构造函数,箭头函数不能作为构造函数。执行new操作符,其实JS内部完成了以下事情: 1、创建一个空的简单JavaScript对象(即{}); 2、将构造函数的prototype绑定为新对象的原型对象 ; 3

C++构造函数和深拷贝与浅拷贝

痴心易碎 提交于 2020-02-22 23:51:17
构造函数 构造函数: · 对象被创建时 自动调用 · 函数名与类名相同 · 可以有形参,可以没有 · 可以重载 · 可以有默认参数值 · 可以是内联函数 · 不能有return语句 //构造函数的实现 Clock :: Clock(int newH,int newM,int newS):hour(newH),minite(newM),second(newS){ //类的成员变量初始化(prior) } 这样的初始化方式 ,效率高于表达式赋值 已有构造函数,还想让系统生成默认构造函数 语法: 类名() = default; 如果没有构造方法来初始化,便会使用内类初始值; 默认构造函数 Clock(); Clock(int newH = 1,int newM = 2); 这两种都是默认构造函数(不给参数都能调用),不能同时出现 委托构造函数 利于保持代码一致性。 形参列表不同,初始化列表不同,而其他的都是一样的。 Clock :: Clock(int newH,int newM,int newS):hour(newH),minite(newM),second(newS){ } Clock :: Clock():hour(0),minite(0),second(0){} 以上两个函数,初始化的过程是一样的 以上代码可以 使用 委托构造函数 简写为: Clock :: Clock(int