struct的疑问
最近用c++写程序,发现有些语法上的问题还没有搞清楚
比如下面关于struct的一个问题,
ITEMIDLIST是一个item ID 的列表.
也就是说 ITEMIDLIST应该包括1个到多个SHITEMID类型的.可为什么头文件的定义里只有一个?
typedef struct _ITEMIDLIST
{
SHITEMID mkid; //????一个还是多个
} ITEMIDLIST;
其中 SHITEMID在头文件中定义如下:
typedef struct _SHITEMID
{
USHORT cb;
BYTE abID[ 1 ];
} SHITEMID;
我的问题是:根据我的理解,按照上面的定义,ITEMIDLIST 和SHITEMID应该是几乎一样的。 但是实际上, SHITEMID是表示一个ID, 而ITEMIDLIST是用来表示由多个ID组成的列表。
请大家帮助我解释一下上面这种定义方式。
还有一个问题:在c++中, class 和struct有什么区别? 语义上是一样的么? 内存分配上是不是相同? (因为.net平台上,struct是分配栈空间,而class在堆上分配空间,两者有本质的不同)
谢谢
[解决办法]
SHITEMID是表示一个ID, 而ITEMIDLIST是用来表示由多个ID组成的列表。
===========================================
其实是一样的,你说的ID列表是靠这个 BYTE abID[ 1 ];来实现的,其实就是一种越界操作。
[解决办法]
1. 是实际上, SHITEMID是表示一个ID, 而ITEMIDLIST是用来表示由多个ID组成的列表。
////////////////////////////////////////////////////////
不是很理解这话的意思,但是你说定义的2个结构应该是差不多的,ITEMIDLIST也并非是表示多个ID组成的列表。
2. 对于class和struct,他们的区别在于:
c中只有struct
c++中有class,为了兼容c代码也有struct
c中的struct只有成员变量
c++中的struct可以有成员变量,也可以有成员函数
c++的class默认是private,struct默认是public
你可以把c++中的struct理解为一种默认级别是public的class
下面是一套c++代码
#include <string>
#include <iostream>
using namespace std;
struct myStruct
{
void test();
myStruct():a(0){};
private:
int a;
};
inline void myStruct::test()
{
cout < <a < <endl;
}
int main()
{
myStruct aStruct;
aStruct.test();
}
[解决办法]
struct是c语言,class是c++语言
在c++中,一般二者都可以替换使用
但是在STL,模板不支持struct,只支持class
[解决办法]
数组的扩展用法,当大小不能确定的时候,可以定义成BYTE arr[1]的形式。通常的用法可能是下面这样的:
int nCnt = 10; //比如别的函数经过计算需要记录10个id
//然后分配10个id需要的空间,要包括计数字段的空间
char *pBuf = new char[sizeof(SHITEMID) + nCnt];
//将新分配的连续空间作为ITEMIDLIST操作
ITEMIDLIST* pList = (ITEMIDLIST*)pBuf;
pList-> mkid.cb = nCnt;
for(int i=0; i <nCnt; i++)
{
pList-> mkid.abID[i] = i; //然后就可以向操作数组一样了
}
[解决办法]
coding_hello(coding) ( 一级(初级)) :正解,这个是C语言实现动态扩展数组的方式,现在C++都不用,如果写C++要用,说明你没有入门C++,至于struct在C++的语法中本来就与class没什么不一样,这一方面你可以看看下面这本书《深入C++对象模型》里面有很详细而且足够让人信服的说明
[解决办法]
你看代码的时候往上看一看
// SHITEMID -- Item ID (mkid)
// USHORT cb; // Size of the ID (including cb itself)
// BYTE abID[]; // The item ID (variable length)
//
#include <pshpack1.h>
typedef struct _SHITEMID
{
USHORT cb;
BYTE abID[ 1 ];
} SHITEMID;
// BYTE abID[]; // The item ID (variable length)
看到这个了每, abID 的变长的,至于怎么实现,楼上有人说了
struct内数据默认是public类型的,
class内数据默认是private类型的。
继续用struct是为了向下兼容啊,习惯问题,以后发展会只用class的
你可以
template <class T>
但是
template <struct T>
并不总是可以用的。
class中有个默认的this指针,struct没有
不同点:构造函数,析构函数 this 指针
error:struct仅仅能定义数据,而CLASS可以定义操作!
class exp
{
int x;
int y;
};
int main()
{
class exp a(1,2);
cout < < a.x < < a.y;
}
应该可以吧
细微区别:
struct也可以作为C语言中单纯的结构体用,如果里面一个函数都没有的话。而class则无论如何也是个类。考虑如下例子:
struct exp
{
int x;
int y;
};
int main()
{
struct exp a={1,2};
cout < < a.x < < a.y;
}
这个是成立的,输出12
而
class exp
{
int x;
int y;
};
int main()
{
class exp a={1,2};
cout < < a.x < < a.y;
}
则不成立了。这个区别很细微。
基本上就这些区别了。
[解决办法]
上面关于struct 和 class 是专了别人的文章
里面
template <struct T>
并不总是可以用的。
class中有个默认的this指针,struct没有
不同点:构造函数,析构函数 this 指针
error:struct仅仅能定义数据,而CLASS可以定义操作!
class exp
{
int x;
int y;
};
int main()
{
class exp a(1,2);
cout < < a.x < < a.y;
}
说错了
template <struct T>
是不可以的
其他的跟class一样 构造函数,析构函数 this 指针