关于实例化一个对象的两种模式,为什么不选择更安全的方式
关于实例化一个对象的两种方式,为什么不选择更安全的方式
举例:在一个函数内,如果我要用DC进行绘图,可以有两种处理方式(MFC环境):
方式一:(用new分配内存)
Function1()
{
CClientDC *pDC;
pDC = new CClientDC(this);
pDC->SelectObject(....);
pDC->TextOut(.....);
....
delete pDC;
}
方式二:(直接定义一个类对象)
Function2()
{
CClientDC dc(this);
dc.SelectObject(........);
dc.TextOut(......);
....
}
显然,方式二的代码更简洁,也更安全(不需要人工delete释放资源,函数调用完自动释放dc(?))
那么为什么看到的大多数代码都用方式一去编写呢?
请高手指教!谢谢!
注:这里只是以CClientDC类举例,问题的关键是,为什么一般先声明一个类对象的指针后再动态创建对象,而不是直接定义成类对象,而且只用一个“.”访问对象的成员函数,比那个“->”更节省打字工作量啊
------解决方案--------------------
1.this指针指向的是当前的对象,使用CClientDC dc(this);
会调用拷贝构造函数,如果没写拷贝构造函数,那么this,dc这两个
其中一个改变都会造成另外一个改变,使用new开辟空间是pDC和this指向不同的
空间,就不会出现上面的情况。
2.指针使用起来较灵活,但也容易出错。
3.一般情况下使用这两个的哪一个都可以
------解决方案--------------------
嗯,仅从C++语言的角度,实在是很难看出二者的区别。
难道是因为不想在栈上定义大对象?楼主可以试着输出一下sizeof(CClientDC),看看有多大。
------解决方案--------------------
"大多数代码"?
------解决方案--------------------
当然是2好
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
效果一样,但系统内存的操作不同,应向合理的方向靠近,感觉2种是教科书的东西
------解决方案--------------------
我基本没见到过楼主所说的第一种方式。
若说是自绘时,
举例:在一个函数内,如果我要用DC进行绘图,可以有两种处理方式(MFC环境):
方式一:(用new分配内存)
Function1()
{
CClientDC *pDC;
pDC = new CClientDC(this);
pDC->SelectObject(....);
pDC->TextOut(.....);
....
delete pDC;
}
方式二:(直接定义一个类对象)
Function2()
{
CClientDC dc(this);
dc.SelectObject(........);
dc.TextOut(......);
....
}
显然,方式二的代码更简洁,也更安全(不需要人工delete释放资源,函数调用完自动释放dc(?))
那么为什么看到的大多数代码都用方式一去编写呢?
请高手指教!谢谢!
注:这里只是以CClientDC类举例,问题的关键是,为什么一般先声明一个类对象的指针后再动态创建对象,而不是直接定义成类对象,而且只用一个“.”访问对象的成员函数,比那个“->”更节省打字工作量啊
------解决方案--------------------
1.this指针指向的是当前的对象,使用CClientDC dc(this);
会调用拷贝构造函数,如果没写拷贝构造函数,那么this,dc这两个
其中一个改变都会造成另外一个改变,使用new开辟空间是pDC和this指向不同的
空间,就不会出现上面的情况。
2.指针使用起来较灵活,但也容易出错。
3.一般情况下使用这两个的哪一个都可以
------解决方案--------------------
嗯,仅从C++语言的角度,实在是很难看出二者的区别。
难道是因为不想在栈上定义大对象?楼主可以试着输出一下sizeof(CClientDC),看看有多大。
------解决方案--------------------
"大多数代码"?
------解决方案--------------------
当然是2好
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
效果一样,但系统内存的操作不同,应向合理的方向靠近,感觉2种是教科书的东西
------解决方案--------------------
我基本没见到过楼主所说的第一种方式。
若说是自绘时,
- C/C++ code
CDC* pDC = CDC::FromHandle(lpDIS->hDC); ...
------解决方案--------------------
没仔细研究过。。。
------解决方案--------------------
基本没见过第一种
------解决方案--------------------
如果类对象比较大,栈上放不下,比如有个成员char m_sz[10000000],那只能用第一种方式创建。不过一般设计好的类不会这样,1,2种方式创建都可以。
第2种方式适合局部变量,临时使用一下对象,用完出作用域就销毁了,比较方便。但是如果是很多地方都用到,还是用第1种方式好一点。
------解决方案--------------------
习惯了就好了,偶一般用第二个
------解决方案--------------------
两种方式一样,第一种方式我也见过的,好象在一本VC入门的书本上见过,好久了难记起来了。
------解决方案--------------------