这样初始化没有问题么?

YuHao 2001-01-08 08:46:00
最近看到这样的代码:
class CMyClass
{
public:
CMyClass() { memset(this,'\0',sizeof(CMyClass));}
...
};

这样对类进行初始化的方法我还是第一次看到(从前都是对类中成员一个一个初始化的),按例子编译运行了一遍,好象也没有什么问题,不过心里还是不大踏实,请问这样初始化是否正确?sizeof(MyClass)是什么概念,除了清空成员变量以外,不会覆盖函数和VTable么?

还有一个小问题请教:this->m_hWnd和this->GetSafeHwnd(),这两种方法究竟有什么不同?
...全文
152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
无我无人 2001-01-08
  • 打赏
  • 举报
回复
同意YuHao().
To In355Hz:上面那段程序是我看到帖子后写的测试程序,当然试过!我的问题的答案是 32!
YuHao 2001-01-08
  • 打赏
  • 举报
回复
各位,我发现在计算sizeof的时候,普通的成员函数是不计算在内的,但是VTable要计算,我刚刚写了这样的测试程序:
class CMyClass
{
protected:
int n;
float f;
public:
CMyClass() {n=1;f=0; }
virtual void display() { printf("My Class Display\n"); }
CMyClass* GetThis() { return this; }
}


void main()
{
CMyClass MyClass;
printf("size=%d\n",sizeof(MyClass));
char* p=(char*)MyClass.GetThis();
for(int i=0;i<sizeof(MyClass);i++) printf("%02X\n",p[i]);
}

结果得到大小是12,也就是除了成员变量还有4字节的东西,输出的16进制内容应该是个指针(我怀疑应该就是VTable指针),如果用memset(this,0,sizeof(MyClass))的方法,一定会把不应该清除的内容给覆盖掉了.
当然这只是小弟的想法,各位有什么高见,欢迎指正.
YuHao 2001-01-08
  • 打赏
  • 举报
回复
各位,我发现在计算sizeof的时候,普通的成员函数是不计算在内的,但是VTable要计算,我刚刚写了这样的测试程序:
class CMyClass
{
protected:
int n;
float f;
public:
CMyClass() {n=1;f=0; }
virtual void display() { printf("My Class Display\n"); }
CMyClass* GetThis() { return this; }
}


void main()
{
CMyClass MyClass;
printf("size=%d\n",sizeof(MyClass));
char* p=(char*)MyClass.GetThis();
for(int i=0;i<sizeof(MyClass);i++) printf("%02X\n",p[i]);
}

结果得到大小是12,也就是除了成员变量还有4字节的东西,输出的16进制内容应该是个指针(我怀疑应该就是VTable指针),如果用memset(this,0,sizeof(MyClass))的方法,一定会把不应该清除的内容给覆盖掉了.
当然这只是小弟的想法,各位有什么高见,欢迎指正.
In355Hz 2001-01-08
  • 打赏
  • 举报
回复
为什么不可以,newx你试过了吗:
你这样写B从两个途径继承了I,所以数据将包含两个I的对象,所以:
sizeof(B)=2*sizeof(I)+sizeof(int)+sizeof(char);
还有继承虚基类没有必要加virtual吧。
vcmfc 2001-01-08
  • 打赏
  • 举报
回复
第一个问题我也没见过,来听课,关于第二个问题,我的看法是这样的:共同点:取得当前窗口句柄。异常点:当m_hWnd无效时,如果你引用this->m_hWnd会产生一个Assert()错误,而引用this->GetSafeHwnd()时,当m_hWnd无效时返回NULL,可能不会产生错误?,主要是看函数功能。
无我无人 2001-01-08
  • 打赏
  • 举报
回复
你认为我的例子中
cout<<sizeof(B);
将输出什么呢?
告诉你,决不是sizeof(char)或sizeof(char)+sizeof(int)!
无我无人 2001-01-08
  • 打赏
  • 举报
回复
不可以,请看例子,GPF!

struct I {
virtual void foo(void) = 0;
};

class A :
virtual public I
{
virtual void foo2(void) = 0;
private:
int m_i;
};

class B :
virtual public I,
virtual public A
{
public:
B();
~B();

void foo(void) {}
void foo2(void) {}
void goo(void) {}

private:
char m_c;
};

B::B()
{
// BUGBUG!
ZeroMemory(this, sizeof(B));
}

B::~B()
{
}

int main(int argc, char* argv[])
{
B b;

cout<<sizeof(B);

return 0;
}

In355Hz 2001-01-08
  • 打赏
  • 举报
回复
不会覆盖函数的,class在数据实质上与struct是一样的,比如:
class A
{
int a,b;
...
};
struct B
{
int a,b;
}
sizeof(A)与sizeof(B)是相同的。

In355Hz 2001-01-08
  • 打赏
  • 举报
回复
不会覆盖函数的,class在数据实质上与struct是一样的,比如:
class A
{
int a,b;
...
};
struct B
{
int a,b;
}
sizeof(A)与sizeof(B)是相同的。

In355Hz 2001-01-08
  • 打赏
  • 举报
回复
sizeof(MyClass)是取得MyClass按位计算的长度。
这种初始化方法我也没见过。应该就是把所有的数据清零吧。
GetSafeHwnd好象就只是简单判断了一下m_hWnd是否有效,没什么特别的。
breath 2001-01-08
  • 打赏
  • 举报
回复
不小心贴上了
第一个问题我头回看到,类的实例在创建的时候自动分配内存。反正我没有这么用过
breath 2001-01-08
  • 打赏
  • 举报
回复
m_hWnd在窗口未建立的时候是空的
不过这两个办法是一样的,GetSafeHwnd可以在别的类中调用,因为m_hWnd是保护类型的

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧