好吧,这对许多人来说可能是一个愚蠢的问题.让我按照我在过去10年中学到的语言顺序列出这个列表.[顺便说一句,据我所知,其中一些是脚本语言]
vb 6.0
HTML
ASP
PHP
CSS
JavaScript的
托管c ++
C#
C++
C
ASM
是的,我知道我是从完全相反的一端开始的,但希望这份名单让我不会因为这个而受到批评.
问题:是否存在普通C语言的类......我知道有结构......我还想知道你是否可以在C结构/类中声明函数(如果它们存在).我认为两者的答案都是否定的,但是很难在互联网上找到关于普通C的信息,因为大多数事情都是针对C++的.此外,我有兴趣了解与C合作的任何提示,技巧或警告.非常感谢提前.
顺便说一句:我对C的兴趣和速度感兴趣.
C中的类通常通过结合函数指针的结构来模拟.非虚函数可以与指向结构的指针一起传递,如下所示:
int obj_compare_funct(Obj *a, Obj *b); int result = compare_two_objects(obj1, obj2, obj_compare_func);
但是当你在结构中嵌入指针时,真正的乐趣开始了; 这意味着相同整体"类"的对象可以具有不同的"方法".最大的语法缺点是指向的函数不会自动知道它被调用的对象.因此,对象也需要传递,这使得打字比通常需要的更多.例如:
/***** In the animal.h header file. *****/ typedef struct Animal { char *name; void (* speak)(Animal *this); /* The speak "method" */ } Animal; /* Constructors for various animal types. Implementation detail: set the animal's speak method to the appropriate one for that animal type. */ extern Animal *make_feline(char *name); extern Animal *make_rodent(char *name); /***** Somewhere in zoo.c, which #includes animal.h. *****/ Animal *cat = make_feline("Tom"); Animal *mouse = make_rodent("Jerry"); cat->speak(cat); /* Print "Tom says meow!" */ mouse->speak(mouse); /* Print "Jerry says squeak!" */
这个例子比Java等语言提供的继承模型更松散 - 一个Animal实例可以有任何行为,而不是一个特定的行为集,具体取决于它的子类.为了使事情更严格,这些方法通常组合成一个名为vtable(虚函数表)的结构.为每个子类型预先制作一个vtable,并从实例指向适当的vtable.
请注意,这些都不能直接帮助您为每个子类型提供不同的字段 - 这比较复杂(尤其是语法上的),可以通过将对象强制转换为第一个成员来完成,例如:
/* Can be treated as an Animal if you cast its pointer. */ typedef struct Cat { Animal super; int num_fleas; } Cat;
或者使用不透明指针,例如
typedef struct Animal { char *name; void *species_specific_data; } Animal;
额外的字段将隐藏在该void *
指针后面,并可通过特定于该物种的方法访问.
C
没有课程.这是创建C++
除了函数重载,运算符重载和模板之外的一个原因.
当然,类似于类的代码有时会在存在之前写入C++
:
typedef struct class1 class1; struct class1 { int (*constructor) (class1 *this); int (*destructor) (class1 *this); ... };