引用数组是不合法的,引用不是对象
1 | ////结构体的大小 |
1 | ////newdelete全局重载 |
1 | ////void *operator new (size_t size){ |
1 | ////大数乘法与结构体 |
1 | // |
引用数组是不合法的,引用不是对象
1 | ////结构体的大小 |
1 | ////newdelete全局重载 |
1 | ////void *operator new (size_t size){ |
1 | ////大数乘法与结构体 |
1 | // |
1 | int *f(); |
w_char是Unicode 字符的数据类型
1 | typedef unsigned short wchar_t; |
一般在在头文件中有这样的定义
1 | typedef wchar_t WCHAR |
为了让编译器识别 Unicode 字符串,需要在字符串前加上 L
1 | wchar_t * a(L"china"); |
命名空间的作用是解决变量,函数重名问题
没有命名的命名空间(匿名命名空间)可以直接使用,此时编译器会在内部为这个命名空间生成一个唯一的名字,而且还会自动生成一句 using 语句
1 | namespce { |
等价于
1 | namespace __UNIQUE_NAME_ { |
注意:命名空间都是具有external 连接属性的,只是匿名的命名空间产生的UNIQUE_NAME在别的文件中无法得到,这个唯一的名字是不可见的.
C++ 新的标准中提倡使用匿名命名空间,而不推荐使用static,因为static用在不同的地方,涵义不同,容易造成混淆.另外,static不能修饰class.
命名空间还可以使用别名
1 | namespace a = mySpace; |
命名空间可以使用嵌套,使用嵌套的命名空间时需要用到::操作符
命名空间可以拓展,用于软件的迭代式开发
一般不在命名空间中定义函数,而是声明一个函数指针,这个函数指针起到一个接口的作用
namespace 所有数据都是共有,不能加 private 修饰符,全是共有的
using 的作用域,从上往下,必须在命名空间的后方,
当 using 多个时,如果变量重名则命名空间冲突,会出现不明确错误.
命名空间如果在块语句内部using,则它的作用域在块结束后同时结束
###命名空间和全局变量的区别
c中全局变量可能会被局部变量屏蔽,在c++ 中可以使用::,”::”前面不加命名空间等价于取全局变量
函数重载是设计了委托,根据参数不同委托到不同的地址执行不同的函数
函数处理参数从右到左
默认参数放在右边,默认参数中间不允许加入不默认的,这样做是因为实参传给系统之后,系统会自左向右与形参进行匹配。如果函数时add(1,2),那么a=1,b=2,c等于多少呢?我们只有把参数全部传递过去之后,系统才能获得c的值,但这样做的话,为什么还要设置函数的默认参数呢?
所以编译系统不允许程序员这么做,因为这么做是毫无意义的。
1 | void printf(int c,int a = 5){ |
1 | void printf(int c,int a = 5){ |
这种情况下不冲突,如果需要输入的参数类型不一样,数目不一样,顺序不一样,则不会出现冲突
1 | 一个引用符引用左值,两个引用符引用右值 |
1 | int& getA(){ |
在栈上面的内存会在函数调用完就清除掉
1 | //const |
c++中不行
1 | int main(){ |
1 | int main(){ |
1 | int main(){ |
1 | int main(){ |
删除数组的空间,基本数据类型可以直接 delete, 复杂类型必须[]
#打砖块-1
##Tutorial部分
首先完成功能”一个通过’a’和’d’控制左右移动的图片”
代码如下
1 | <html lang="en"> |
然后对以上代码进行优化抽象
定义一个入口_main(),将所有代码放入
将代码拆成几个函数,
paddle作为一个独立的个体,它的所有属性方法应该放到一起.
创建 guagame, 控制所有注册点击事件和setInterval函数
1 | var getImageFromStr = function(path) { |
paddle 自己的逻辑应该让自己控制,所以
1 | if (leftPressed){ |
应该用对象自己的方法moveLeft和moveRight替换
将事件注册, setInterval 、update和 draw 整体封装成一个GuaGame,作为控制对象
控制对象里面需要有
1 | var canvas = document.querySelector("#id-canvas") |
把setInterval放在GuaGame中
1 | setInterval(function(){ |
而update中的一些事件是通过注册来的,此时可以使用以下的巧妙方法完成
首先
1 | var g = { |
然后在setInterval中遍历并处理事件
1 | var actions = Object.keys(g.actions) |
##myWay部分
完成了基本环节的搭建,对象只做了挡板
思考:1. 用if语句根据条件执行方法的,可以考虑改用actions[key]()
映射
1 | actions[action] && actions[action](event) |
本篇中使用了actions: {}, keydowns: {},
两个对象来完成功能,主要原因是在于回调方法是在setInterval中调用的,而回调方法是否调用的判断和按键有关,所以需要两个对象完成
###理解原型
在 JS 中,可以通过原型实现继承
原型的概念很简单.当查找属性时,若对象本身不具有该属性,则会查找原型上是否有该属性.
通过操作符 in 我们可以测试对象是否拥有某属性
Object.setPrototypeOf(a,b)方法将 b 对象设置为第一个对象的原型,对象的原型属性是内置属性(__proto__)
每个对象都可以有一个原型,每个对象的原型也可以拥有一个原型,以此类推.形成了原型链
1 | function Ninja() { |
通过 new 操作符调用函数意味着作为构造器调用
我们创建的每一个函数都具有一个新的原型对象.最初的原型对象只有一个属性,即 constructor属性.该属性指向函数本身
实例会隐藏原型中与实例方法重名的方法
实例中可以查找到的属性也不会查找原型
对象与函数原型之间引用关系是在对象创建时建立的,如果原型在代码过程中被篡改,新创建的对象将引用新的原型,原来旧的对象保持着原有的原型的引用
1 | var log = console.log.bind(this) |
因为后面大量使用了console.log()所以可以将其简化
1 | var log = console.log.bind(this) |
函数的原型可以被任意调换,而已经构建的实例引用旧的原型
通过使用 constructor 属性,我们可以访问创建该对象时使用的函数.这个特性可以用于类型校验
1 | function Ninja() { |
instanceof:提供了一种用于检测一个实例是否由特定构造函数创建的方法
因为所有实例对象都可以访问 constructor 属性所以可以使用 const ninja2 = new ninja1.constructor()
来初始化
我们真正想要实现的是一个完整的原型链.创建这样的原型链的最佳技术方案是一个对象的原型直接是另一个对象的实例:
SubClass.prototype = new SuperClass()
通过执行 instanceof 操作符,我们可以判定函数是否继承原型链上的对象功能
instanceof 操作符的实质是:检查操作符右边的函数的原型是否存在于操作符左边的对象的原型链上
!!!不建议直接使用 Person 的原型对象作为 Ninja 的原型(Ninja.prototype = Person.prototype)这样做会导致在 Person 原型上所发生的所有变化都被同步到 Ninja 原型上(Person 原型与 Ninja 原型是同一个对象)一定会有不良的副作用
通过设置 Person 实例对象作为 Ninja 构造器的原型时,我们已经丢失了 Ninja 与 Ninja 初始原型之间的关联.这个问题需要修复.
调整属性的配置信息可以使用内置的Object.defineProperty() .
将配置项 enumerable 设为 false, 在 for-in 循环中无法遍历该属性.
底层仍然基于原型继承
使用Static关键字
或者:
1 | function Ninja() { |
You have been given a string s
, which is supposed to be a sentence. However, someone forgot to put spaces between the different words, and for some reason they capitalized the first letter of every word. Return the sentence after making the following amendments:
Example
s = "CodefightsIsAwesome"
, the output should beamendTheSentence(s) = "codefights is awesome"
;s = "Hello"
, the output should beamendTheSentence(s) = "hello"
.Input/Output
[execution time limit] 4 seconds (js)
[input] string s
A string containing uppercase and lowercase English letters.
Guaranteed constraints:3 ≤ s.length ≤ 100
.
[output] string
The amended sentence.
###题目描述
Given a string s
, find and return the first instance of a non-repeating character in it. If there is no such character, return '_'
.
Example
For s = "abacabad"
, the output should befirstNotRepeatingCharacter(s) = 'c'
.
There are 2
non-repeating characters in the string: 'c'
and 'd'
. Return c
since it appears in the string first.
For s = "abacabaabacaba"
, the output should befirstNotRepeatingCharacter(s) = '_'
.
There are no characters in this string that do not repeat.
Input/Output
[execution time limit] 4 seconds (js)
[input] string s
A string that contains only lowercase English letters.
Guaranteed constraints:1 ≤ s.length ≤ 105
.
[output] char
The first non-repeating character in s
, or '_'
if there are no characters that do not repeat.
###解法
两层循环,很低效
1 | function firstNotRepeatingCharacter1(s) { |
因为字母的数目是确定的,其实还可以借助哈希表来做
1 | //只需要一层循环 |
难点在于lastIndexOf和indexOf两个 API不知道,一个是求出最后一次出现的索引值, 一个是首次出现的 index, 两个 索引值相同表明该元素只出现了一次
##将数组顺时针旋转90度
You are given an n x n 2D matrix that represents an image. Rotate the image by 90 degrees (clockwise).
Example
For
1 | a = [[1, 2, 3], |
the output should be
1 | rotateImage(a) = |
Input/Output
[execution time limit] 4 seconds (js)
[input] array.array.integer a
Guaranteed constraints:1 ≤ a.length ≤ 100
,a[i].length = a.length
,1 ≤ a[i][j] ≤ 104
.
[output] array.array.integer
1 | function rotateImage(a) { |
仔细观察row[j] = a[n-1-j][i]
,其实可以看成row[i][j] = a[n-1-j][i]
,
所以:
1 | //评分最高的方法 |
值得注意的是:
1 | a[i][j] ^= a[j][i] |
不使用中间值,交换两个数的值
所有不使用临时变量的思路都是让其中一个变量变成一个a和b都有关系的值这样可以先改变另一个变量值,最后改变原修改的变量值
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
1 | $ hexo new "My New Post" |
More info: Writing
1 | $ hexo server |
More info: Server
1 | $ hexo generate |
More info: Generating
1 | $ hexo deploy |
More info: Deployment