读书人

关于类成员函数的调用机制奇怪,该怎

发布时间: 2012-03-27 13:44:24 作者: rapoo

关于类成员函数的调用机制,奇怪
请提出以下程序运行的结果.并说明为什么
#include <iostream>
using namespace std;
class A
{
public:
void dis(){cout < < "AAA " < <endl;}
};
int main()
{
A *p;
{
A a;
p=&a;
}
p-> dis();
return 1;
}


[解决办法]
从软件工程的角度来说,这个程序有问题,p指向了非法地址。但从程序本身运行来讲,没有问题
[解决办法]
从析构函数角度来说,析构函数已经执行,它通知系统并不再为这块内存维护类对象的一个数据结构了,此时如果其他线程访问这块内存,系统可以分配给其他线程使用,这个程序能够
正常的执行因为单线程,无其他线程可能马上破坏析构后的对象所占据的内存空间,希望说清楚了
[解决办法]
class object如何调用class memmber functions
------------------------------------------
类的成员函数在编译时会被“name mangling(名称重整)”,下面具个例子给楼主说明一下如何通过类对象调用member function(仅仅是个例子,编译器的做法可能大同小异)。

class foo{
public:
int i;
void test(int a){
i = a;
}
};
foo f;
f.test(5);//调用成员函数

上面程序经过编译器整理后可能变成下面样子:
struct foo{
public:
int i;
};
void test_foo(foo *const this, int a){//原来的成员函数现在变成了一个全局函数(或者说是“名字空间域函数”),而且名字被“重整”了,以反映出原来是“class foo”的成员(再次强调一下,不同编译器有不同的重整方法)。而且,增加了一个新的参数 "this ",见下面的调用方式,就明白他的用途了
this-> i =a;//通过this指针访问对象的数据成员
}

foo f;
test_foo(&f, 5);//将对象f的地址作为this指针传递给test_foo函数,以便访问数据成员

[解决办法]
对这个问题的详细讨论可以看这个帖子
http://community.csdn.net/Expert/topic/5526/5526033.xml?temp=4.172915E-02

我觉得这是出题者的疏忽,不应该出这种有争议的题目

读书人网 >C++

热点推荐