您的位置:首页 > 编程语言 > C语言/C++

C++类特性:this指针与函数的全局性(一)

2015-09-01 16:14 218 查看
我们通过一个例子来切入本文的主题:

#include<iostream>

using namespace std;
class test1
{
public:
test1(int data)
{
this->data = data;
}
void print()
{

cout << "hello!" << endl;
}
public:
int data;
};

int main()
{
test1 *tptr;
tptr = new test1(1);
tptr->print();
tptr[0].print();
tptr[10].print();
tptr[1000].print();
cin.get();
return 0;
}


大家先不要看答案,思考一下输出是什么?又或者是运行时错误?

答案是输出四行,每行都是"hello!",并且不会发生运行时错误?原因是所有的类对象都共享一份函数代码,尽量在编译时每个函数都会隐式传入一个this指针,但因为print函数里面只是输出一行字符,且这行字符是一个字符字面值,所以传进来的this指针完全是无用的,这时类对象访问print函数就和在C语言里访问全局函数没有什么差别了(这是因为C++的实现遵循着至少要有C语言的效率的缘故,所以在编译层面,很多东西不是看起来那么回事,尽管tptr[10]是不存在的,但这对编译器来说是透明的,访问print就和C访问全局函数一样)。

但如果上面的print函数改变一下,再加入打印类对象的data属性,代码如下所示:

void print()
{
cout<<this->data<<"-";
cout << "hello!" << endl;
}
这时再运行main函数,那么很有可能就会出来运行时错误了。因为data属性是每个对象都有一份的,传递进来的this指针起了作用,这将查找本对象的data属性,但tptr[10]和tptr[1000]都是不存在的(但相应的内存位置上可能存在其他数据),这时就很有可能访问到不能访问的内存了,这时程序就崩溃(被程序系统杀死)了。在内存层面,“对象”是不存在的,访问的函数代码仍然是同一份函数代码,这里只是根据传入的this指针来区分data数据段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: