谁能帮我这个处学者"this"到底怎么用

mengsu 2003-08-23 08:19:42
开始学习C++遇到指针就懂得很一般,单类和对象中的this指针就没看懂!那为高手能帮我,感激不尽。多维数组指针又怎么用?
...全文
28 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengsu 2003-08-26
  • 打赏
  • 举报
回复
谢谢各位的帮忙!我什么时候能想你们那样呀
积木 2003-08-23
  • 打赏
  • 举报
回复
啊,是啊,我想起来了,非模态好像是这么用的,ft,
正象晨星大哥所说,堆上的对象可以delete,不过
vc中的代码是出了名的不标准
积木 2003-08-23
  • 打赏
  • 举报
回复
嗯,不过这个问题挺有意思的,嘿嘿
好怪的用法。
ttlb 2003-08-23
  • 打赏
  • 举报
回复
回复人: goodboy1881(三井) ( ) 信誉:105 2003-08-23 22:46:00 得分:0


哎~我用bcc55,怎么就没有看到呢?
实际上我也觉得这个根本就不符合编程逻辑
而且我觉得this就不应该被delete,没有什么用啊
但是问题我编了例子竟然没有观察到运行错误,ft


但是我看到一些MFC代码中有delete this;
甚至MSDN中非模态对话框的示例就用到了delete this;

到底什么时候用?一般用来干吗?MSDN的示例代码我看不太懂。
晨星 2003-08-23
  • 打赏
  • 举报
回复
“因为delete this可以用很多种替代的方式啊”,完全同意,比如上面的p->Release(),其实就相当于delete p;

不过ttlb(小鸟)只是问可不可以。(:
Salam2001 2003-08-23
  • 打赏
  • 举报
回复
Dev-C++ 编译通过,没问题。
Healer 2003-08-23
  • 打赏
  • 举报
回复
delete this; 奇怪啊
也许行吧:)
但是delete完了还能print??

this 是 类指向该类的对象的指针。 通常可以省略不用。
积木 2003-08-23
  • 打赏
  • 举报
回复
应该可以在语法上就禁止吧,呵呵,我觉得是,
因为delete this可以用很多种替代的方式啊
晨星 2003-08-23
  • 打赏
  • 举报
回复
呵呵。不过至少从理论上,使用delete this来销毁堆对象也未尝不可。所以说最好使用方法确保该类对象只能在堆上创建。
积木 2003-08-23
  • 打赏
  • 举报
回复
哎~我用bcc55,怎么就没有看到呢?
实际上我也觉得这个根本就不符合编程逻辑
而且我觉得this就不应该被delete,没有什么用啊
但是问题我编了例子竟然没有观察到运行错误,ft
晨星 2003-08-23
  • 打赏
  • 举报
回复
To:goodboy1881(三井)
“一点异常都没有”?你的编译器也真大度。:)
我在VC6里编译并运行你的代码,马上给我跳出一个大对话框,上面密密麻麻写着好多字。(:
积木 2003-08-23
  • 打赏
  • 举报
回复
to steedhorse(晨星) ( )
你的第一句话好像不是很准确,看看这个例程吧,我实验了一下,竟然一点异常没有
#include<iostream>
using namespace std;
class a
{
int i;
public:
a():i(10){};
void del(){ delete this; };
void print(){ cout<<i<<endl; }
};
main()
{
a mya;
mya.del();
mya.print();
}
不过说实话,那个什么对象“自尽”倒是很有趣啊
晨星 2003-08-23
  • 打赏
  • 举报
回复
呵呵,怎么我自己说话也不严格了?:)

“栈上的对象肯定不可以”应改为:“delete栈上对象的this指针肯定不可以”,还是那句话,this指针是属于非静态成员函数的,而指向的才是触发这个函数调用的对象。
晨星 2003-08-23
  • 打赏
  • 举报
回复
To:ttlb(小鸟)
栈上的对象肯定不可以,这一点我想就用不着解释了。
所以,要这样作,最好确保你的对象都在堆上创建(方法之一是私有化所有构造函数,然后提供静态接口来创建对象),这样,通过delete this来释放对象占用的内存空间是完全可以的。比如:

#include <iostream>
using namespace std;

class A
{
private:
A(){}
~A(){}

public:
static A* CreateObject();
void Release();

private:
int mem1 , mem2;
};

A* A::CreateObject()
{
A * p = new A;
cout << "Object created!" << endl;
return p;
}

void A::Release()
{
delete this;
cout << "Object destroyed!" << endl;
}

int main()
{
A *p = A::CreateObject();
p->Release();
return 0;
}
ttlb 2003-08-23
  • 打赏
  • 举报
回复
to steedhorse(晨星):
那么请问,this指针可以delete吗?delete的时候有什么要注意的?
nirvana_li 2003-08-23
  • 打赏
  • 举报
回复
to steedhorse(晨星):厉害!~
晨星 2003-08-23
  • 打赏
  • 举报
回复
不能说this指针属于某个对象,this指针是隐含属于类的非静态成员函数的,当从一个对象上调用某个成员函数时,这个成员函数的this指针就指向该对象,当再次从另一个对象上调用这个成员函数时,这个函数的this指针就指向另一个对象。原因是成员函数的代码每个类只有一份,而不是每一个对象都有一份,因此需要有一种内部机制保证调用a.f()时,操纵的是a对象,而不是b对象,this指针就是这种机制的实质。

全局函数和类的静态成员函数没有this指针,这也是类的静态成员函数不能访问类的非静态成员的原因。全局函数根本不属于任何一个类,就更不需要this指针了,因此,他只能访问它自己的局部变量和整个程序的全局变量。

多维数组相当于多级指针,但用起来有好多问题需要注意,还是多看看书吧。我的感觉是应尽量避免3维以上的数组,维数一多,在数组和指针之间转换来转换去时,一不小心就出错。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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