|
发表于 2009-5-1 22:32:40
|
显示全部楼层
to: mynameis
比较认同你63楼的观点. 关于64楼的问题:
1、在C ++中.结构和类基本相同
在C 中.结构体内不能有函数.但可以有函数指针.
>> 但是函数指针占用了结构体的空间. 而且函数指针需要初始化.
mynameis:函数指针确实占用了结构体的空间,也需要初始化。但是c++中的对象调用成员函数并非就没有指针
,只不过是编译器添加进去的,还记得this指针吗?所以,用c或用c++实现对象的调用几乎是一样的,没有哪
个比哪个更节省空间。
chai2010: C语言是结构体中函数指针占用空间; C++中class函数本身并没有占用空间, 只是在
使用函数的时候多传递了一个this指针而已, 如果不需要可以将函数定义为static(和C函数一样).
2、C++:
Serial.begin(9600);
>> 这里的begin是对Serial对象进行操作. 数据是核心, 函数依附于数据存在.
C:
(* Serial).begin(9600); 或: Serial-> begin(9600);
>> 1. 这里的begin和 Serial有关系吗? 它只是一个函数, 甚至连Serial结构体
>> 都不能访问. 这里函数还是独立于数据之外.
>> 2. 这里的begin函数指针缺少初始化代码.
mynameis:若是非想用c来模拟c++的对象封装,那么上面的代码大概应该是这样的:
struct SERIAL
{
//结构体的数据变量
......
void (*Begin)(struct ERIAL* pThis, UINT nBaudRate);
};
SERIAL serial;
serial.Begin(&serial, 9600);
"甚至连Serial结构体都不能访问",这句论断不知道是什么意思。为什么不能访问呢?
chai2010:
我说"甚至连Serial结构体都不能访问", 是针对60楼nops 的Serial->begin(9600); 代码.
因为这里的begin是Serial结构体中的函数指针, 但是begin指向的函数本身并不知道自己
被Serial结构体中的begin函数指针保存了, 那函数怎么访问Serial呢??
就好比, Serial认识begin, 但是begin并不知道自己被Serial认识. 指针同样是不能逆向
跟踪的!
如果确实想用C来模拟C++的封装, 那也不需要保存函数指针(因为函数都是固定地址的):
struct SERIAL
{
//结构体的数据变量
......
// 去掉Begin
// void (*Begin)(struct ERIAL* pThis, UINT nBaudRate);
};
SERIAL serial;
// 在外面定义begin
void SERIAL_begin(struct ERIAL* pThis, UINT nBaudRate)
{
...
}
// 使用
SERIAL serial;
SERIAL_begin(&serial, 9600);
但是, 这样的封装代码有必要吗? 本来是为了将问题简化, 现在却搞的更复杂了. |
|