100分求有关this指针和反回&用类型的应用,谁给讲讲?

lq651659889 2008-11-19 12:04:37
如题
...全文
186 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
freezgw1985 2009-05-31
  • 打赏
  • 举报
回复
学习了,谢谢
leewon1988 2008-11-20
  • 打赏
  • 举报
回复
不错。。。
[Quote=引用 6 楼 zmlovelx 的回复:]
http://blog.csdn.net/feiyond/archive/2007/06/14/1652505.aspx
先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。(虽然比int char这样build-in类型复杂的多,但首先要理解它们一样是类型)。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。
理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个…
[/Quote]
Longinc 2008-11-19
  • 打赏
  • 举报
回复
翻翻书比较好..
机智的呆呆 2008-11-19
  • 打赏
  • 举报
回复
1 类的中对非静态成员变量的声明,只是声明了变量在对象模型的相对的偏移地址,this指针的值是对象在内存中起始地址值,通过this指针和类声明所获得的成员变量的相对偏移地址,就可以在分配给对象的内存中确定各成员变量的地址,进而对其访问,也就是说非静态成员变量地址运行期确定。
类中的非静态成员函数地址值编译期确定,但成员函数一般会改变成员变量的值,通过上述分析,可知this+相对偏移地址才能知道成员变量地址,所移成员函数调用的时一般会隐式传入this指针。
所以this指针的作用 是为了确定非静态成员变量的地址。
Qlaiaqu 2008-11-19
  • 打赏
  • 举报
回复
1.在c++运行过程中,类中的非静态成员函数在内存中只有一份拷贝。也就是讲无论生成多少对象,所有对象调用的函数代码段都是同样的。
改变一个对象状态的方法是使用其中的成员变量,而成员函数到底改变的是哪一个对象的成员变量了?必然要把对象本身发送给函数,而有this指针来接收了。
2.&其实和指针没有太多的区别,指针需要间接访问,引用可以直接访问。他们共同做的一件事情是,无需在传递一大块的数据了。
不过传回引用有一个好处,这使得函数本身可以作为左值了。
就呆在云上 2008-11-19
  • 打赏
  • 举报
回复
每个对象都有一个自己的this指针
而this指针的引用就是对象自身
比如:
class as{
public:
void dd(){}
as &hoho() {
this->dd();
return *this;
}
};

int main(int argc, char* argv[])
{
as a;
a.hoho().hoho().hoho();
}
glacier3d 2008-11-19
  • 打赏
  • 举报
回复
this即指向本对象的指针;
返回&即:返回时没有新的拷贝,返回值和本对象里的值共用同一块内存。
机智的呆呆 2008-11-19
  • 打赏
  • 举报
回复
引用一般说是变量的别名,编译器实现一般是以指针的形式实现,个人认为引用的赋值是把对象的地址值付给引用,根据引用的类型相关信息和引用对象的地址值就可以确定整个对象,进而对对象进行访问。之所以引用不能为空,原因也在此。
lq651659889 2008-11-19
  • 打赏
  • 举报
回复
书看了只是不怎么理解,想听听大家的观点.呵呵
cnmghi 2008-11-19
  • 打赏
  • 举报
回复
还是看书讲得比较详细
toadzw 2008-11-19
  • 打赏
  • 举报
回复
返回一个引用类型常常有二种为了提高效率与使返回值可以作为左值,如int& f(); 则可以有如下形式:f()=1; 对于定义一个类的成员函数则表示对对象的直接修改,返回值则取*this;
有时只为了提高效率而不想作为左值,可用const在返回类型前表示限定返回引用,但不可以作为左值;
cyj626 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zmlovelx 的回复:]
http://blog.csdn.net/feiyond/archive/2007/06/14/1652505.aspx
先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。(虽然比int char这样build-in类型复杂的多,但首先要理解它们一样是类型)。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。
理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个…
[/Quote]
自觉学习
valuesun 2008-11-19
  • 打赏
  • 举报
回复
1.this指针是一个特殊的指针,当类的某个非静态成员函数执行时,就会村在this指针。他指向类的一个对象,且这个对象的某个成员函数正在被调用。this指针的名字始终是this,而且总是作为隐含藏书传递给没一个被申明的成员函数。当程序调用某个对象的成员函数时,编译器会把该对象的地址加入到参数列表中.在成员函数内对任何成员的调用都隐式地传递了this指针。如:
#include<iostream>
class Date
{
int mo;
public:
Date(int);
void display();
};
Date::Date(int m)
{
mo=m;
}
void Date::display()
{
std::cout<<mo<<std::endl;
std::cout<<this->mo<<std::endl;
std::cout<<"this指针"<<this<<std::endl;
}

int main()
{
Date dt(11);
dt.display();
std::cout<<"dt地址"<<&dt<<std::endl;
return 0;
}

得到的两个地址是一样的~~~。

&引用等哈在来说~~~
太乙 2008-11-19
  • 打赏
  • 举报
回复
C++返回引用类型
A& a(){ return *this;} 就生成了一个固定地址的指针,并把指针带给你

但A a() { return *this;}会生成一个临时对象变量,并把这个临时变量给你
这样就多了一步操作

当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。

问题的关键是,当你想要返回一个引用而不是一个拷贝时,你要确保这个引用的有效性,比如:
int & fun() { int a; a=10; return a; }
这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。
这种情况下,如果fun的返回类型不是int & 而是int就没有问题了。


指针的引用
GetNearestFontInTwips(CFont *&aFont, const TFontSpec &aFontSpec);

第一个参数aFont是一个指针, 前面加上*&表示指针的引用, 其实可以如下看待这个方式(CFont*) &aFont, 这就一目了然了.






摘自:http://www.cppblog.com/gtwdaizi/articles/38521.html


帅得不敢出门 2008-11-19
  • 打赏
  • 举报
回复
http://blog.csdn.net/feiyond/archive/2007/06/14/1652505.aspx
先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。(虽然比int char这样build-in类型复杂的多,但首先要理解它们一样是类型)。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有int类型一样,变量my具有myclass类型。
理解了这个,就好解释this了,my里的this 就是指向my的指针。如果还有一个变量myclass mz,mz的this就是指向mz的指针。 这样就很容易理解this 的类型应该是myclass *,而对其的解引用*this就应该是一个myclass类型的变量。
通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。

1. this指针的用处:
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .
2. this指针的使用:
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
3. this指针程序示例:
this指针是存在与类的成员函数中,指向被调用函数所在的类实例的地址。
根据以下程序来说明this指针
#include<iostream.h>
class Point
{
int x, y;
public:
Point(int a, int b) { x=a; y=b;}
Void MovePoint( int a, int b){ x+=a; y+=b;}
Void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
};
void main( )
{
Point point1( 10,10);
point1.MovePoint(2,2);
point1.print( );
}
当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。
MovePoint函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:
void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}
即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。
即该函数过程可写成 point1.x+= a; point1. y + = b;
4. 关于this指针的一个精典回答:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。

======================================

对于值返回与引用返回,值返回回产生临时变量,引用返回不会,直接返回对该值的引用.类似函数参数类型.按值传递和引用传递,临时变量就相当于形参,他是拷贝的实参的值.引用返回就相当于引用传递.形参是实参的别名,其内存空间是一样的.
例如:A a(){...;return *this;}和A& a(){...;return *this;}中的值返回,*this相当于"实参",要用的时候他会拷贝一份给"形参"就是所谓的临时变量.然后通过临时变量来操作,用完后临时变量的空间是要释放的.所以不能用值返回做左值.而引用返回返回了一个对*this的引用,他们是一个内存空间,对返回值的操作实际就是对*this的操作.由于空间不会暂时释放,他可以做左值.

当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。

问题的关键是,当你想要返回一个引用而不是一个拷贝时,你要确保这个引用的有效性,比如:
int & fun() { int a; a=10; return a; }
这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。
这种情况下,如果fun的返回类型不是int & 而是int就没有问题了。
因此,要返回一个引用时,“临时变量”不能是“临时”的,至少得等函数外部使用完毕这个引用之后,才能销毁它。

打开链接下载源码: https://pan.quark.cn/s/589796089f72 C++课程设计任务列表,涵盖以下内容:1、识别并显示10至99范围内,各位数乘积超过各位数和的数值,例如数字12不满足条件,因为1乘以2小于1加2,故不输出;而数字27满足条件,因为2乘以7大于2加7,因此需要输出该数。2、开发一个功能,用于从用户输入的任意数量实数中找出最大值与最小值:首先要求用户输入一个正整数n,代表数值的个数,随后用户可输入任意n个实数,程序需找出这n个数中的最大值和最小值并将它们展示出来。3、实现两个已排序数组的合并操作:设有数组A和B,且假设这两个数组的元素均已按照降序排列。编写程序将A和B合并成一个新的数组C,并确保C中的元素同样保持降序排列。int A[10]={123, 86,80, 49,33,15,7,0,-1,-3};int B[10]={100,64,51,50,27,19,15,12,5,2};4、设计一个函数,用于计算特定分数序列前n项的总和,该序列为1/2,1/3,1/4,1/5,1/6,1/7,...。要求在主程序中提示用户输入一个整数n,并验证输入的合法性(n需大于1方为有效),若输入合法,则调用求和函数并显示计算结果。5、编写一个程序,计算两个用户输入日期之间的天数差:用户需以year1,month1,day1和year2,month2,day2的格式输入两个日期,程序随后计算这两个日期之间的天数间隔,并将结果输出到屏幕上。要求编制具有如下原型的函数difs2Date:long GetDayDifference(int y1,int m1,int d1,int y2,int m2,int d2);并在主函数中调用此函数,将计...
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试会话的时长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新会话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有时需要对调用堆栈的内部层级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序时。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也会导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪时,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新会话调试**:在处理异步更新任务,例如持久化业务数据时,错误可能发生在更新任务内部。激活**更新会话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本中心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程中的错误。 4. **分析调用堆栈**:在进行深入调试时,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...

65,211

社区成员

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

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