Oracle笔试题

kongzhp 2012-04-28 10:19:27
今天参加了oracle笔试,遇到了以下一题:

class A
{
public:
void sayHi(){
cout<<"hello "<<endl;
}

};
int main(){
A *p = new A(10);
p->sayHi();
p = NULL;
p->sayHi();
}

为何第二个p->sayHi还有输出??
...全文
329 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
映维网 2012-04-29
  • 打赏
  • 举报
回复
受教!!!
pathuang68 2012-04-29
  • 打赏
  • 举报
回复
对象级别的东西,比如类中的某个非静态成员变量,这种东西和类的实例有关,因此它使用this指针,这样的情况下,就不能像上面那么写了,参考下面的代码:

#include <iostream>
using namespace std;

class A
{
public:
int a; // 对象级别的
public:
void sayHi() // 类级别的
{
cout<<"hello "<<endl;
}

void print()
{
cout << a << endl;
}
};
int main(int argc, char** argv)
{
((A*)123456)->sayHi(); // 只要->左边的对象的数据类型是A*就OK

A* p = new A;
p->a = 10; // OK
p->print(); // 输出10

p = NULL;
p->a = 20; // Not OK,会报access violation之类的错
p->print(); // (有些编译器可能不会报错,不过后面的语句也肯定不会执行。但如果是debug单调到此,应该所有的编译器都会报错)

return 0;
}
kongzhp 2012-04-29
  • 打赏
  • 举报
回复
那请问能具体地分别说一下什么才是类级别和对象级别的变量或方法吗?
[Quote=引用 6 楼 的回复:]

对象级别的东西,比如类中的某个非静态成员变量,这种东西和类的实例有关,因此它使用this指针,这样的情况下,就不能像上面那么写了,参考下面的代码:
C/C++ code

#include <iostream>
using namespace std;

class A
{
public:
int a; // 对象级别的
public:
……
[/Quote]
cattycat 2012-04-29
  • 打赏
  • 举报
回复
不需要this指针的都可以直接这样使用。
hackbuteer1 2012-04-29
  • 打赏
  • 举报
回复
C++真是博大精深啊
pathuang68 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

因为A::sayHi()并未使用this指针。因此尽管this指针是NULL,只要不去解引用它,便没事儿。
[/Quote]

++
sayHi是一个类级别的东西,也就是说它和类的实例(或者类的对象)没有任何关系,这也就是2楼说的“并未使用this指针”,在这种情况下,sayHi仅与p的类型有关,而不管p是什么东西,实际上,你甚至可以写下面这样的代码:

#include <iostream>
using namespace std;

class A
{
public:
void sayHi()
{
cout<<"hello "<<endl;
}

};
int main(int argc, char** argv)
{
((A*)123456)->sayHi(); // 只要->左边的对象的数据类型是A*就OK
return 0;
}
max_min_ 2012-04-28
  • 打赏
  • 举报
回复
自己new的空间存放在堆区,这个区是由程序员自己分配的内存,只要没动delete,这个就一直存在的
evencoming 2012-04-28
  • 打赏
  • 举报
回复
好强大...

Jim_King_2000 2012-04-28
  • 打赏
  • 举报
回复
因为A::sayHi()并未使用this指针。因此尽管this指针是NULL,只要不去解引用它,便没事儿。
kongzhp 2012-04-28
  • 打赏
  • 举报
回复
A *p = new A(10);
更改为:A *p = new A;

64,701

社区成员

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

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