C++类特性:this指针与函数的全局性(一)
2015-09-01 16:14
218 查看
我们通过一个例子来切入本文的主题:
大家先不要看答案,思考一下输出是什么?又或者是运行时错误?
答案是输出四行,每行都是"hello!",并且不会发生运行时错误?原因是所有的类对象都共享一份函数代码,尽量在编译时每个函数都会隐式传入一个this指针,但因为print函数里面只是输出一行字符,且这行字符是一个字符字面值,所以传进来的this指针完全是无用的,这时类对象访问print函数就和在C语言里访问全局函数没有什么差别了(这是因为C++的实现遵循着至少要有C语言的效率的缘故,所以在编译层面,很多东西不是看起来那么回事,尽管tptr[10]是不存在的,但这对编译器来说是透明的,访问print就和C访问全局函数一样)。
但如果上面的print函数改变一下,再加入打印类对象的data属性,代码如下所示:
#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数据段。
相关文章推荐
- 从逆向的角度去理解C++虚函数表
- C++文件的读取到string以及string分割
- C++ stringstream的用法
- C++智能指针
- C语言中用于修改文件的存取时间的函数使用
- C语言,realloc
- C++纯虚函数 virtual =0
- C语言中建立和删除文件连接的相关函数讲解
- SMTP基本原理与C++实现向多人发送邮件
- C语言利用链表实现有效内存管理
- 详解C语言中的rename()函数和remove()函数的使用方法
- C/C++回调函数
- C++中的PIMPL和NVI
- C++基础篇--运算符重载
- 动态规划之数钱
- C++面试常考点
- C++头文件与C头文件
- c primer plus第十一章课后习题
- i=i++的细节
- Windows下C++连接MySQL