程序设计--各类语言风格
c++
|
delphi
|
c#
|
java
|
||
风格
|
入口
默认有个入口类,包含入口函数Main();
|
类存放
这里一个文件是一个单元(Unit);
里面存放很多类,类名和单元名并无关系。
概念上更对应java里的包。
|
类存放
一个文件可以存放很多类。
大都有个主类和文件名一直。
但不一致好像也可以
括号
调用属性不用加括号。
方法,类后面要带括号
|
入口-很独特,
每个类都可以单独运行,
每个类都可以有入口函数main()
类存放
一个文件只能存放一个主类。
主类名和文件名也要一致。
再写入的类只能裸申明class Hero,一般不用
然后差不多功能就放在一个包名中。
同个包中可以直接调用。
其它包中要import下。
括号 和C#一样?
|
|
引用
|
程序内部文件的引用
外部控件或者sdk之类的引用
一个控件往往包含很多子项目
|
通过一个头文件,里面专门放所有的子项目头文件。
c 还没有集合标签。
通过自己建一个头文件来集合需要的头文件。
c#这些,代码文件形成了集合标签结构。
引用这个集合标签就行。
c# namespace
java package
这里文件夹和包名结构是层层对应的。
|
会生成一个包,里面再包含子项目
|
||
宏
|
1.简单替换
2.条件编译
|
1.1#define MAXTIME 1000
编译器会对MAXTIME进行处理替换为1000。
CONST 则为一个常量。
1.2 #define Add(a,b) a+b;
2#ifdef WINDOWS
......
#endif
|
好像只有条件编译
|
||
变量
|
没初始化的时候好像是一个随机地址,
并不是NULL,要自己初始化。
|
引用类型,默认是null
|
|||
函数
|
内联
--编译器会把函数代码
展开到调用层运行。省了出栈入栈这些。
|
JVM自动控制,代码无法声明
|
|||
类
|
实例化
一般是先申明,再写个实例化代码
静态语言一般有两种方式。
A-在栈中分配,xx.create,对象类
B-在堆中分配。new xx,指针类
B中分配要自己来释放。、
动态语言一般都是自己释放。
ins=new class.
|
类的实例化
A-很简洁 Class Obj;
就一个申明,后续也不用实例化代码的。。
B
类方法调用
obj.fun()
如果是类指针则
pobj->fun()
一般局部用A,全局可用的基础类。占了两头?
需要在各个部件传来传去,分别保存的用B合适。
感觉大部分中间逻辑都是用B。
|
更加面向对象。同时类的创建更加多样。
赋值一个点击事件用类。
可以单独建一个事件类,然后引用。
可以建一个内部类。
可以建一个匿名类。
可能编译后还就是执行匿名类里的流程。
内部类可以访问到外部类的资源,
|
||
线程
|
Timer定时器这种,好像都是直接用的,没觉的是在线程里。
|
线程用的更普遍
更新主页面经常就是要在线程里handler.post()
|
|||
继承
|
class C1:public C0
|
TC1 = class(TC))
|
|||
模板类
|
参数通用类型。
实例化的时候再指定。
|
template<class Type> class C1
template<class BASE_CLASS, class TYPE>
class : public BASE_CLASS
BASE_CLASS是数组类,如CObArray。
里面的方法基本都是调用BASE_CLASS。只是 的时候声明下这个是Type类。
没发现有啥大用处。。
CTypedPtrArray<CObArray,CComponent*> m_LadderGroup
|
好像没类似的,缺乏泛型?
|
class Dictionary<TKey, TValue>
Dictionary<string, string> cols= new Dictionary<string, string>();
|
|
属性,方法调用
|
C1.P1
|
||||
定义类型
|
简洁的名称代替冗长的定义。
1.定义基本类,
2.定义 函数指针类型
返回类型(*函数名)(参数表)
3.定义类,c++有模板类,用处多些。
|
typedef
typedef __nullterminated CONST CHAR *LPCSTR,
2.
typedef BOOL (WINAPI *PFSETWINDOWTEXTA)(HWND hWnd, LPSTR lpString);
PFSETWINDOWTEXTA pFun;
3.
typedef basic_ofstream<wchar_t, char_traits<wchar_t> > ofstream;
|
type
1. tmyint=integer;
TFrameRecord=record
Data:string;
end
TFrameList=array of TFrameRecord;
2
TLedStateEvent = procedure(Sender: TObject; AState: TLedState) of object;
|
||
操作符
|
|||||
>>,<<
|
流向箭头的方向.
输出流-
ofs << lpString << endl;相当于字符串连接。
输入流-
cin >> dbfilename;
|
||||
::
|
调用类的静态方法,属性
不需要实例化类,直接调用?
CA::FA
全局作用域符号
char zhou;
class{
::zhou
}
作用域分解运算符-在类外定义类里的声明
class CA {
public:
int add(int a, int b);
};
//那么在实现这个函数时,必须这样书写:
int CA::add(int a, int b)
{
return a + b;
}
c#中partial class 类定义外面还能附加方法。
这个方法声明还是在类里的,只是实现放在外面。
没有那么动态。
|
||||
字符串
|
typedef CHAR *PCHAR,
typedef __nullterminated CHAR *LPSTR
指向/0结尾的字符串?
typedef __nullterminated CONST CHAR *LPCSTR
指向常量字符串
MFC中使用CString
目前规范中用std:string
转换
string s="abcde";
const char *c = s.c_str();
const不能被修改,用strcpy复制一份。
char *cStr = "C++";
std::string Str = std::string(cStr);
https://wiki.jikexueyuan.com/project/visual-studio/1.html
|
||||
指针,地址
|
地址,内容,指向
基本变量 int i
取自身地址 &i
取内容 i
指针变量 int *pi
赋值
取自身地址 &pi
取指向地址 pi
取指向内容 *pi
二级指针int **ppi
赋值 **ppi=&pi
取指向地址 ppi
取指向内容=取前序指向地址 *ppi
去前序指向内容 **ppi
*ppi改变后,pi也会改变。
指针数组 int *pa[]
pa[i]==pi
cout << *ptr[i] << endl;
但是 char * pArray[] ={"apple","pear"}
std::cout << pArray[i] << std::endl; 不需要加*。
可能cout默认会按字符处理吧。
如果要获取地址。printf("%p",pArray[1])
数组 int *pi,ai[]={1,2,3}
pi=ai;
结构体指针 一般都是 typedef 先定义好的
指针类型转换,步长会不一样。
|
取地址 i:integer;
去地址@i;
指针变量 pi:^integer;
一般都是定义好了PInteger=^integer;
取指向内容pi^
二级指针
PPChar=PChar^
|
java创建类是默认指针类型
但好像这个指针又是受限的。
|
||
集合类型
|
List
List是个接口类,一般是用ArrayList。
结构类型
字典类
Hashtable
|
||||