-
2011-11-01
C++构造函数与析构函数及函数栈 - [Technology]
#include <iostream.h>
using namespace std;
class A{
int a;
public :
A( int aa = 0 ){
a = aa;
}
~A(){
cout << "Destructor A!" << a << endl;
}
};
class B : public A {
int b;
public:
B( int aa = 0, int bb = 0):A(aa){ // 分析 —— 构造函数后面加冒号“:”,表示成员参数设置。
b = bb;
}
~B(){
cout << "Destructor B!" << b << endl;
}
};
int main(){
B z(10); // 分析 —— x、y、z作为main函数的临时变量,入栈,由于栈的先入后出性质,所以析构函数的调用次序是y、x、z。
B x(5),y(6,7); // 分析 —— 继承条件下,实例化子类时,先调用基类的构造函数,再调用基类的构造函数;
// 析构子类时,先调用子类的析构函数,再调用基类的析构函数。
return 0;
}
输出结果:
Destructor B!7
Destructor A!6
Destructor B!0
Destructor A!5
Destructor B!0
Destructor A!10 -
程序设计定名 1.0 通用版
使用场合
Amy 例子
Toy 例子
补充说明
类对象
CAmyClassName
CToyClassName
Java 、 Python 等语言也有对应的类概念,通用
结构体变量
typedef SAmy_Struct_Name{...}
SAmyStructName;
typedef SToy_Struct_Name{...}
SToyStructName;
const SAmyStructNameSize =
sizeof(SAmyStructName)
常规函数
FAmyPrint(char rgBuf[])
FToyPrint(int nCount)
函数参数中, n 类型缩写 代表 int 型, rg 类型缩写 代表静态数组,不用释放
类成员函数
CAmyClassName::Clean()
CToyClassName::Clean()
类成员函数不需要个性标签,直接表意
类成员变量
…
private:
MUTEX m_Lock;
…
…
private:
void* m_pPoint;
// (类型缩写 p
表示动态指针,
可能会被释放)
…
类成员变量全部私有( private )或( protect ),不允许 public ,同时以 m_ 作为前缀
结构体成员变量
以 m_ 作为前缀
函数成员变量
函数内部变量,原则上不加 m_ 作为前缀
全局变量
void* g_pBuffer
void* g_ulCount
全局变量显式以 g_ 前缀 区分,如果编码的语言逻辑中,始终不用全局变量,可取消 m_ 和 g_ 的 前缀 规则
类型缩写
n int; c char; b bool; rg 静态数组 ; p 动态指针 ; us unsigned short; ui unsigned int; ul unsigned long; d double; …
不同的程序设计语言,有多样的类型缩写,需要积累。(匈牙利缩写法)
宏定义
无通用性,尽量全部大写,表意的单词加下划线:
#define USER_ID_LENGTH (256) // 定义用户 ID 的长度为 256 字节
goto 语句的标签
无通用性
“类名 + 下划线 + 函数名 + 下划线 + 用途”
注:
l 当 rg 或 p 两个类型缩写同 n 、 c 、 b 等基础类型缩写同时出现时,如何处理?
n int* m_pIntBuffer; 这样好不好?如果 int 换成 unsigned long 呢?
n int m_rg_nBuffer[MAX ]; 这样好不好?前缀是不是太长了?
n 统一一下,上述两个例子改为:
u int* m_pnBuffer;
u int m_rgnBuffer[MAX ];
n 即直接采用类型缩写拼接的方式, p 和 rg 放在前面。
n 考虑 “ int* m_rgnPointerBuffer[MAX ]; ” 的定名含义。
l 自定义类型(结构体、类)不用本身类型缩写,保留数组 rg 和指针 p 的缩写用法,如:
1. CAmyClassName m_ClassName; 局部类变量
a) 当同一作用域有两个以上同类型变量出现时,灵活使用后缀区分, m_ClassName2 或 m_ClassNameTmp 或 m_ClassNameWay 即以用途区分等等。
2. CAmyClassName* m_pClassName; 局部类指针变量
3. CAmyClassName g_rgClassName[MAX ]; 全局类数组变量
4. CAmyClassName* g_rgClassNamePointer[MAX ]; 全局类指针数组变量
a) 考虑 g_rg_pClassName 的方式容易混乱,将 p 作为类的谓语后缀出现,表示一个静态数组,里面存储了指向这种类型的指针。即类型缩写只保留第一属性。
5. CAmyClassName g_rgClassNameArray[MAX0 ][MAX1 ]; 全局类二维数组变量
a) 把 g_rg_rgClassName 改为 g_rgClassNameArray ,只保留第一层属性的原则。
6. 现在如果在像 JAVA 一样的语言环境下,我们不使用 m_ 、 g_ 前缀机制,则把上面的规则更改为——去掉前缀,若此时的首字母为大写,则改为小写,完毕。对应 1~5 的转化,结果如下:
a) CAmyClassName className;
b) CAmyClassName* pClassName;
c) CAmyClassName rgClassName[MAX ];
d) CAmyClassName* rgClassNamePointer[MAX ];
e) CAmyClassName rgClassNameArray[MAX0 ][MAX1 ];
结束语 :好的定名是良好沟通的开始。版权 —— Amy and Toy
-
2011-10-08
金山网络快盘使用心得 - [Technology]
功能定位:网络U盘、文档仓库
快盘理解:一个巨大的文件夹镜像
细节描述:
- 不使用本地客户端,只用网页管理,就能对文件夹镜像里面的内容进行浏览,删除,上传,创建子文件夹等功能。在公用的计算机上,或者不常用的(别人的)(公司的)(手机,存储有限)的环境下,使用浏览器对文件夹镜像进行网页管理是最合适的,有点类似网络U盘。(并不在本地残留同等大小的文件夹镜像)
- 使用本地客户端,建议在个人最常用的,私人的电脑上,存储空间允许的情况下,安装本地客户端,建立本地的文件夹镜像,此镜像与网络服务器上的文件夹镜像是同步的,两者内容保持一致性。本地的文件夹镜像就是某磁盘目录下的一个文件夹,此文件夹下的内容与网络服务器上的镜像内容同步。本地文件夹镜像可执行搬迁操作。鉴于本地文件夹的操作比网页管理来的更加的快捷方便,所以私人主打PC推荐安装本地客户端。
几点注意:
- 当你在一个新的计算机环境安装本地客户端的时候,指定本地文件镜像路径时,此路径下原有的文件会被删除,同步为网络文件镜像上的文件结构,所以一般默认的“D:\快盘”是没有问题的,如果要自定义,请确保自定义目录下的文件是没有用的,或者是一个空路径。
- 本地客户端还有一个优势:可以编辑文件镜像中的已有文件,如123.doc,同一个文件在本地镜像中编辑,并能自动更新。如果换作网页操作,需要删除原有123.doc,接着把本地编辑过的版本再次上传。
- 后期考虑在个人主打PC上再次架设SVN版本控制服务器,并把服务器的数据仓库放在快盘中,防止因为个人系统奔溃,导致SVN版本控制数据库丢失。
-
2011-09-29
三角公式 - [Mathematica]
圆弧:S / R = 夹角(弧度)
180度 = PI 弧度
tan( A + B ) = ( tanA + tanB ) / ( 1 - tanA * tanB ); tan( A - B ) = ( tanA - tanB ) / ( 1 + tanA * tanB )
sin( A - PI/2 ) = -cosA; cos( A - PI/2 ) = sinA; sin( A + PI/2 ) = cosA; cos( A + PI/2 ) = -sinA
sinA * sinB = 1/2 * cos( A - B ) - 1/2 * cos( A + B );
cosA * cosB = 1/2 * cos( A - B ) + 1/2 * cos( A + B );
sinA * cosB = 1/2 * sin( A - B ) + 1/2 * sin( A + B );
sinA + sinB = 2 * sin( 1/2 * ( A + B ) ) * cos( 1/2 * ( A - B ) );
sinA - sinB = 2 * cos( 1/2 * ( A + B ) ) * sin( 1/2 * ( A - B ) );
cosA + cosB = 2 * cos( 1/2 * ( A + B ) ) * cos( 1/2 * ( A - B ) );
cosA - cosB = -2 * sin( 1/2 * ( A + B ) ) * sin( 1/2 * ( A - B ) );
sin( A + B ) = sinA * cosB + cosA * sinB;
sin( A - B ) = sinA * cosB - cosA * sinB;
cos( A + B ) = cosA * cosB - sinA * sinB;
cos( A - B ) = cosA * cosB + sinA * sinB;
sin2A = 2 * sinA * cosA;
cos2A = cosA * cosA - sinA * sinA = 2 * cosA * cosA - 1 = 1 - 2 * sinA * sinA;
-
2011-06-02
office 2010 word 和 visio 使用心得 - [Technology]
由于最近做毕业设计的关系,对这两个工具用的比较多,在这里做一个总结。
visio画图力求简洁、清晰,不需要花哨,要求风格统一,结构清晰。
word新建样式表,为防止样式表被改变,从其他word中复制内容过来时,最好将其放入记事本中,消除其格式,或者将来源的正文格式暂时调节成和目标样式表中的正文样式相同。
所以最好是建立好样式表之后,就在这个样式表中写文档。
添加分节符,然后重新编写文章页数。
给图片和表添加题注,这样就可以建立图标目录。
更新全文的域。
格式刷使用时对于包不包括回车符有一定区别,需要注意。