来自微言板块(自言自语)的临时笔记汇总。


程序员是软件食物链的最后一环。架构师吃掉需求,设计师吃掉架构,而程序员则消化设计。

问题定义->需求->架构->构建->系统测试->将来的改进

一个程序中的设计层次:软件系统->分解为子系统和包->分解为包中的类->分解为类中的数据和子程序->子程序内部

问题“这个类需要隐藏些什么?”正切中了接口设计的核心。要养成“我该隐藏些什么?”的习惯。

好的抽象:类的接口应该展现一致的抽象层次;要理解类所实现的抽象是什么;提供成对的服务;把不相关的信息转移到其他类中;尽可能让接口可编程,而不是表达语义;谨防在修改时破坏接口的抽象;不要添加与接口抽象不一致的公用成员;同时考虑抽象性和内聚性。

好的封装:尽可能地限制类和成员的可访问性;不要公开暴露成员数据;避免把私用的实现细节放入类的接口中;不要对类的使用者做出任何假设;避免使用友元类;不要因为一个子程序里仅使用公用子程序,就把它归入公开接口;让阅读代码比编写代码更方便;要警惕从语义上破坏封装性;留意过于紧密的耦合关系。

封装:把数据声明为private,不允许外界随意存取,只能通过特定的接口来操作。继承:成员函数有一个隐藏参数,名为this指针。虚函数与多态:如果预期派生类有可能重新定义某一个成员函数,就在基类中把比函数设为virtual。纯虚函数不需定义其实际操作,它的存在只是为了在派生类中被重新定义(在函数声明之后加上“=0”即可)。虚函数派生下去仍为虚函数,而且可以省略virtual关键词。

static成员变量不属于对象的一部分,而是类的的一部分,所以程序可以在还没有诞生任何对象时处理这种成员变量,但首先必须初始化它。不要把static成员变量的初始化操作安排在类的构造函数中,因为构造函数可能一再被调用,而变量的初值却只应设定一次。也不要把初始化操作安排在头文件中,因为它可能会被载入许多地方,因此也就可能被执行许多次。应该在应用程序文件中,类以外的任何位置设定其初值。例如在main之中,或全局函数中,或任何函数之外。

所谓”Unwinding”:C++按顺序析构,但若发生异常情况(exception),且程序设计了异常情况处理程序(exception handling),控制权就会“直接跳”到你所设定的处理程序去。此时堆栈中的C++对象有没有机会被析构,要视编译器而定。若编译器支持unwinding功能,则会在异常情况发生时,将堆栈中的所有对象都析构掉。

C指针:
在C语言里,只有当你在赋值语句的参数前面加了星号(*),才能把该参数从子程序中传回去。
在内存分配中使用sizeof()确定变量的大小。由于sizeof()是在编译期间计算的,因此不会带来性能上的损失。

p p是指针,p是对象

在Java中,a==b判断的是a和b是否引用了同一个对象,而a.equals(b)判断的是这两个对象是否具有相同的值。一般来说,Java应用程序里应该使用像a.equals(b)这样的表达式,而不要用a==b。

如果一个错误无法重现,这通常会是一个初始化错误,或者是一个同时间有关的问题,或者是悬空指针(dangling-pointer)问题。如果某个求和结果时对时错,很有可能是参与计算的某个变量未能正确地初始化——可能正好在大多数情况它是从0开始。如果这个问题诡异且变幻莫测,并且又在使用指针,那么几乎可以肯定是代码中有未初始化的指针,或者用了所指向的内存区域已经被释放的指针。

windows文件结束符Ctrl+Z,UNIX(包括Mac OS X)是Ctrl+D。

“编辑-编译-调试”(edit-compile-debug)周期

计算机以比特序列存储数据,每个比特非0即1。大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为“字节(byte)”,存储的基本单元称为“字(word)”,它通常由几个字节组成。在C++中,一个字节要至少能容纳机器基本字符集中的字符。大多数机器的字节由8比特构成,字则由32或64比特构成,也就是4或8字节。大多数计算机将内存中的每个字节与一个数字(被称为“地址(address)”)关联起来。

当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8比特大小的unsigned char可以表示0至255区间内的值,如果赋了一个区间以外的值,则实际的结果是该值对256取模后所得的余数。因此,把-1赋给8比特大小的unsigned char所得的结果是255。
当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined)。此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。

如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量。
C++是一种静态类型(statically typed)语言,其含义是在编译阶段检查类型。

int i=42;
int &r=i;//&紧随类型名出现,因此是声明的一部分,r是一个引用
int p;//紧随类型名出现,因此是声明的一部分,p是一个指针
p=&i;//&出现在表达式中,是一个取地址符
p=i;//出现在表达式中,是一个解引用符
int &r2=p;//&是声明的一部分,是一个解引用符
在声明语句中,&和*用于组成复合类型;在表达式中,它们的角色又转变成运算符。

int p1=nullptr;//等价于int p1=0;
在新标准下,现在的C++程序最好使用nullptr,同时尽量避免使用NULL。

指向指针的引用
引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用:
int i=42;
int p;//p是一个int型指针
int
&r=p;//r是一个对指针p的引用
r=&i;//r引用了一个指针,因此给r赋值&i就是令p指向i
*r=0;//解引用r得到i,也就是p指向的对象,将i的值改为0

如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。

select SalesPersonID,OrderDate,Max(TotalDue) as MaximumTotalSales
from [Sales].[SalesOrderHeader]
where SalesPersonID is not null and OrderDate >=’2007/1/1’
group by SalesPersonID,OrderDate
having Max(TotalDue)>150000
order by OrderDate desc

“A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.”

建议把较大的数组放在main函数外(局部变量放在堆栈段)。栈溢出不一定是递归调用太多,也可能是局部变量太大。只要总大小超过了允许的范围,就会产生栈溢出。

计算机图形学:结构特征数据–>图像信号
计算机视觉:图像信号—>结构特征数据
数字图像处理:图像信号—>图像信号

JS中如何输出空格:
1.document.write(“ “+”1”+” “+”23”);
2.document.write(“”+” 1 2 3 “+””);
“white-space:pre;”样式表示”空白会被浏览器保留”

JavaScript为HTML赋予行为,通过ECMAScript标准,利用BOM对象来操作浏览器窗口,浏览器导航对象,屏幕分辨率,浏览器历史,cookie等,利用DOM操作HTML(核心)。