- 浏览: 896133 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
天天来注册:
...
try catch finally 用法 -
tadpole_java:
谢谢你的分享。
二十七、Qt数据库(七)QSqlRelationalTableModel(转) -
359449749tan:
android之EditText文本监听(addTextChangedListener) -
michael_wang:
人过留名 多谢分享
Android NOtification 使用 -
wilsonchen:
wangqi0614 写道这个删除是删除所有的把?能不能值删除 ...
Android的SharedPreferences保存与删除数据简单实例
this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: void Date::setMonth( int mn ) { month = mn; // 这三句是等价的 this->month = mn; (*this).month = mn; }
1. this只能在成员函数中使用。 全局函数,静态函数都不能使用this。 实际上,成员函数默认第一个参数为T* const register this。 如: class A{public: int func(int p){}}; 其中,func的原型在编译器看来应该是: int func(A* const register this, int p);
2. 由此可见,this在成员函数的开始前构造的,在成员的结束后清除。 这个生命周期同任一个函数的参数是一样的,没有任何区别。 当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。如: A a; a.func(10); 此处,编译器将会编译成: A::func(&a, 10); 嗯,看起来和静态函数没差别,对吗?不过,区别还是有的。编译器通常会对this指针做一些优化的,因此,this指针的传递效率比较高--如vc通常是通过ecx寄存器来传递this参数。
3. 回答
#1:this指针是什么时候创建的? this在成员函数的开始执行前构造的,在成员的执行结束后清除。
#2:this指针存放在何处? 堆,栈,全局变量,还是其他? this指针会因编译器不同,而放置的位置不同。可能是栈,也可能是寄存器,甚至全局变量。
#3:this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的? this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。
#4:this指针如何访问类中变量的/? 如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中的变量呢?如果你明白这一点的话,那就很好理解这个问题了。 在C++中,类和结构是只有一个区别的:类的成员默认是private,而结构是public。 this是类的指针,如果换成结构,那this就是结构的指针了。
#5:我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的位置可以直接使用吗? this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。
#6:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数? 普通的类函数(不论是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。只有虚函数才会被放到函数表中。 但是,既使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数。
# 7:这些编译器如何做到的?
8:能否模拟实现? 知道原理后,这两个问题就很容易理解了。 其实,模拟实现this的调用,在很多场合下,很多人都做过。 例如,系统回调函数。系统回调函数有很多,如定时,线程啊什么的。 举一个线程的例子: class A{ int n; public: static void run(void* pThis){ A* this_ = (A*)pThis; this_->process(); } void process(){} }; main(){ A a; _beginthread( A::run, 0, &a ); } 这里就是定义一个静态函数来模拟成员函数。 也有许多C语言写的程序,模拟了类的实现。如freetype库等等。 其实,有用过C语言的人,大多都模拟过。只是当时没有明确的概念罢了。 如: typedef struct student{ int age; int no; int scores; }Student; void initStudent(Student* pstudent); void addScore(Student* pstudent, int score); ... 如果你把 pstudent改成this,那就一样了。 它相当于: class Student{ public: int age; int no; int scores; void initStudent(); void addScore(int score); } const常量可以有物理存放的空间,因此是可以取地址的 ///this指针是在创建对象前创建. this指针放在栈上,在编译时刻已经确定. 并且当一个对象创建后,并且运行整个程序运行期间只有一个this指针.
当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向接受该函数调用的对象的指针。在程序中用this来引用该指针。 void Tdate::Set(int m,int d,int y) { month = m;day = d; year = y; } C++ 编译器所认识的指针成员函数Set的定义形式是: void Tdate::Set(int m,int d,int y) { this->month = m;this->day = d;this-> year = y; } 对于该成员函数中访问的任何类成员,C++编译器都认为是访问this指针所指向对象的成员。 定义一个对象: Tdate dd; dd.Set(6,25,2011); 不同的对象调用Set()成员函数时,this指针指向不同的对象,就可以实现为不同的对象赋初值。 关于this指针的一个经典回答: 当你进入一个房子后, 在Qt 中应用: Qt中,如果申明了两个数组: QLabel *label[8]; 这两个都是QLabel类型的指针数组,希望在以后的使用中动态的分配其内存; for(int i=0;i<8;i++) QLabel的构造函数的原形为: QLabel ( const QString & text, QWidget * parent, const char * name = 0, WFlags f = 0 ) text: Label上要显示的字符串; 从上面的代码容易得知label数组每个元素是以当前MyLabel类对象为父对象的;而sLabel里的元素是以对应的label为父对象的; 这里要是不注释掉上面第3行的语句就会出现段错误,原因经过查找资料得知在Qt中如果在创建组件对象时设置了父对象时,由父对象负责释放其子对象的空间.所以上面第2行已经释放了label的空间,而其子对象的sLabel也随之被释放,所以如果第三行再进行释放就会出现之前所说的错误. Qt虽然提供了这种机制,自动回收部分的内存,但是自己写程序的时候还是要小心,不要造成内存泄漏,这对于嵌入式的应用来说更加是件重要的事.毕竟现在的嵌入式硬件还是内存较小,而且要求程序可以长期稳定,高效节能的运行
QLabel *sLabel[8];
那么就应该:
在class MyLabel中...
{
label[i] = new QLabel("This is a Label",this,0);
//申请空间.
sLabel[i] = new QLabel("",label[i],0);
//第二个Label指针数组的父对象为上面申请过空间的Label.
}
parent: Label的父对象的指针;
name: Label的名字;
f: Label的Flags;
在MyLabel的析构函数中就有相应的释放空间的代码:
for(int i=0;i<8;i++)
{
delete label[i];
//delete sLabel[i];
}
发表评论
-
破解VS2008
2012-07-30 10:22 0对于VS2008 Team System 版本的破解 开始- ... -
无法解析的外部符号的 3 种可能
2011-08-19 13:21 26561. lib 文件未引入。可使用“#pragma commen ... -
Qt容器测试
2011-08-14 23:39 982#include "vectortest.h&quo ... -
const_cast,reinterpret_cast,static_cast,dynamic_cast
2011-08-14 13:34 1051static_cast:用于非多态类型的转换。 dynami ... -
C++调用JAVA方法详解
2011-08-13 20:38 942http://public0821.iteye.com/blo ... -
Music Studio项目心得--JNI实现C++调用JAVA (转)
2011-08-13 19:38 2855http://blog.csdn.net/mdl13412/a ... -
让C++和Java相互调用(2)
2011-08-13 12:53 1110http://chnic.iteye.com/blog/236 ... -
JNI编程 —— 让C++和Java相互调用 (一)
2011-08-13 12:51 1203http://chnic.iteye.com/blog/228 ... -
ava生成dll工具ikvm.net
2011-08-08 14:24 1029IKVM.NET的是开源的基于.NET CLR 的Java虚拟 ... -
Vc中得combox的使用
2011-08-01 00:14 1692一、如何添加/删除Combo Box内容1,在Combo Bo ... -
QT中的元对象系统
2011-07-29 23:42 922Qt中的元对象系统是用来处理对象间通讯的信号/槽机制、运 ... -
QT Designer
2011-07-28 21:44 1092(一)简单继承方式的实现1、QT Designer ... -
QWidget QMainWindow QDialog 之间的区别
2011-07-28 20:27 1108QWidget类是所有用户界面对象的基类。 窗口部件是 ... -
Qt达人
2011-07-27 23:19 904http://www.yafeilinux.com/ ... -
二十七、Qt数据库(七)QSqlRelationalTableModel(转)
2011-07-27 23:16 5701QSqlRelationalTableModel,该类为单张的 ... -
Qt的LineEdit 输入内容控制
2011-07-24 19:42 3303默认下,LineEdit接受任何字符输入,如何让LineEdi ... -
QT + VS2008 环境配置
2011-07-23 10:26 1727最近学习QT,配置环境 ... -
qt4:读取 access 数据库
2011-07-22 09:04 1007一个读取access的例子 1。---------- ... -
QT安装
2011-07-17 22:48 813http://hexlee.iteye.com/blog/49 ... -
写一个C++程序,二进制十进制互换
2011-06-16 19:00 1095现在提供一个C语言程序给你,可以实现任何进制(1~16)到任何 ...
相关推荐
C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法C++中this指针的用法
精讲C++中this指针的用法,一学就会的、
this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: 代码如下: void Date::setMonth( int mn ) { month = mn; // 这三句是等价的 this->month = mn; (*this).month = mn; } 1. this...
C++中this指针用法详解及实例 概要: 本文简单介绍this指针的基本概念,并通过一个实际例子介绍this指针用于防止变量命名冲突和用于类中层叠式调用的两个用法。 this指针概览 C++中,每个类 对应了一个对象,每个...
当你进入一个房子后, 你可以看见桌子、椅子、地板等, 但是房子你是看不到全貌了。 对于一个类的实例来说, 你可以看到它的成员函数、成员变量, ... this是一个指针,它时时刻刻指向你这个实例本身
本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...
比较齐全的this的用法.this在不同的情况下用法的说明和一些相关的总结。
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
在本教程中,那些ANSI-C++中新增的而老一代C++编译器大多不支持概念将备用如下标志标出: ANSI C++新增的概念 同样对于C和C++在实现上有明显不同的概念,将备用如下标志标出: C 与 C++不同的地方 编译器 本教程中...
禁⽌通过shared_from_this()返回this指针,这样做可能也会造成⼆次析构。 避免循环引⽤。智能指针最⼤的⼀个陷阱是循环引⽤,循环引⽤会导致内存泄漏。解决⽅法是AStruct或BStruct改为weak_ptr。 struct AStruct; ...
3.2.4 this指针 3.2.5 友元函数 3.3 类的继承机制 3.3.1 基类与派生类概念 3.3.2 单一派生 3.3.3 多重继承 3.3.4 虚基类 3.4 多态性与虚函数 3.5 抽象类与纯虚函数 3.6 C++模板 3.6.1 函数模板 3.6.2 类模板 第4章 ...
3.2.4 this指针 3.2.5 友元函数 3.3 类的继承机制 3.3.1 基类与派生类概念 3.3.2 单一派生 3.3.3 多重继承 3.3.4 虚基类 3.4 多态性与虚函数 3.5 抽象类与纯虚函数 3.6 C++模板 3.6.1 函数模板 3.6.2 类模板 第4章 ...
12.2 隐含的this指针 376 12.3 类作用域 380 类作用域中的名字查找 382 12.4 构造函数 385 12.4.1 构造函数初始化式 387 12.4.2 默认实参与构造函数 391 12.4.3 默认构造函数 392 12.4.4 隐式类类型转换 393 12.4.5 ...
尽管这样的用法是正确的,但大多数C和C++的编译器都会给出一个警告,说参数y在程序中没有被用到。为了避免这样的警告,C++允许声明一个无名形参,以告诉编译器存在该参数,且调用者需要为其传递一个实际参数,但是...
大多数在C++实现属性的库和编译器使用扩展技术,如Managed C++或C++ Builder,或者他们使用如通常函数的set和get方法,但那不是属性。 详述 我们首先看一下什么是属性。一个属性表现为一个字段或者成员变量,但它...