引用,指针,地址和this 求详细的区分

llwwzz 2014-09-09 07:28:42
书上在函数返回this和*this的时候,使用了*this让我迷惑:
this是本对象的地址,
*this是本对象,是一个对象,
但是返回对象的一个引用,,

我觉得我在这里不懂,引用是"一种"对象,还是指针?

我吧引用和指针搞混了,,但是引用不就是指针的一种?

引用不是因该是个地址?

所以在我看来,返回引用,因该返回一个地址即this啊!


...全文
187 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-09-09
  • 打赏
  • 举报
回复
引用即别名 指针即地址 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
JPF1024 2014-09-09
  • 打赏
  • 举报
回复
引用 3 楼 lovesmiles 的回复:
[quote=引用 楼主 u010583072 的回复:] 书上在函数返回this和*this的时候,使用了*this让我迷惑: this是本对象的地址, *this是本对象,是一个对象, 但是返回对象的一个引用,, 我觉得我在这里不懂,引用是"一种"对象,还是指针? 我吧引用和指针搞混了,,但是引用不就是指针的一种? 引用不是因该是个地址? 所以在我看来,返回引用,因该返回一个地址即this啊!
引用 楼主 u010583072 的回复:
书上在函数返回this和*this的时候,使用了*this让我迷惑: this是本对象的地址, *this是本对象,是一个对象, 但是返回对象的一个引用,, 我觉得我在这里不懂,引用是"一种"对象,还是指针? 我吧引用和指针搞混了,,但是引用不就是指针的一种? 引用不是因该是个地址? 所以在我看来,返回引用,因该返回一个地址即this啊!
你的问题应该是对函数的返回引用没有理解吧。 如果你明白函数的参数使用引用是避免参数传递变成值传递,使得参数不在函数内部生成另外一个副本。 你应该就会理解函数返回参数是引用的意义是一样的。它是避免返回值传递到函数外面时被重新生成了副本。 你写一个拥有拷贝构造函数的类看看就知道返回值是个引用和不是引用的不同了,你会发现拷贝构造函数被调用了多一次。[/quote] 简单理解就是:函数返回引用会减少资源重复,是吧?参数使用引用传递也会相应的少一分拷贝
勤奋的小游侠 2014-09-09
  • 打赏
  • 举报
回复
引用 楼主 u010583072 的回复:
书上在函数返回this和*this的时候,使用了*this让我迷惑: this是本对象的地址, *this是本对象,是一个对象, 但是返回对象的一个引用,, 我觉得我在这里不懂,引用是"一种"对象,还是指针? 我吧引用和指针搞混了,,但是引用不就是指针的一种? 引用不是因该是个地址? 所以在我看来,返回引用,因该返回一个地址即this啊!
引用 楼主 u010583072 的回复:
书上在函数返回this和*this的时候,使用了*this让我迷惑: this是本对象的地址, *this是本对象,是一个对象, 但是返回对象的一个引用,, 我觉得我在这里不懂,引用是"一种"对象,还是指针? 我吧引用和指针搞混了,,但是引用不就是指针的一种? 引用不是因该是个地址? 所以在我看来,返回引用,因该返回一个地址即this啊!
你的问题应该是对函数的返回引用没有理解吧。 如果你明白函数的参数使用引用是避免参数传递变成值传递,使得参数不在函数内部生成另外一个副本。 你应该就会理解函数返回参数是引用的意义是一样的。它是避免返回值传递到函数外面时被重新生成了副本。 你写一个拥有拷贝构造函数的类看看就知道返回值是个引用和不是引用的不同了,你会发现拷贝构造函数被调用了多一次。
wanght99 2014-09-09
  • 打赏
  • 举报
回复
引用和指针不是一回事, 引用是一个变量, 它的存储空间跟另一个变量是一样的. 指针它的存储空间里存的是一个地址, 通过这个地址可以找到另一个变量, 这里有一个间接访问的过程, 引用不存在.
我看你有戏 2014-09-09
  • 打赏
  • 举报
回复
引用 楼主 u010583072 的回复:
书上在函数返回this和*this的时候,使用了*this让我迷惑: this是本对象的地址, *this是本对象,是一个对象, 但是返回对象的一个引用,, 我觉得我在这里不懂,引用是"一种"对象,还是指针? 我吧引用和指针搞混了,,但是引用不就是指针的一种? 引用不是因该是个地址? 所以在我看来,返回引用,因该返回一个地址即this啊!
引用就是别名,就好比一个人的绰号 所以定义引用的时候必须赋值 深入研究下引用操作的时候,其实还是通过地址去操作对应的数据 只不过c++体系帮你搞定了
llwwzz 2014-09-09
  • 打赏
  • 举报
回复
我在六楼的补充有误,,,刚刚写程序试试的时候发现了 结论,,,,需要返回类型引用的时候只能使用*this,,,,,不能使用this 语法上的问题,,,,,,

llwwzz@Ubuntu-llwwzz:~/test$ g++ -o t t1.cpp
t1.cpp: In member function ‘A& A::fc()’:
t1.cpp:19:9: error: invalid initialization of non-const reference of type ‘A&’ from an rvalue of type ‘A* const’
  return this;


#include<iostream>
using namespace std;

class A
{
	public:
		A(int);
		A & fc();
		void show();
		~A();
	private:
		int a;
};
A::A(int b):a(b){}
	
A & A::fc()
{
	this->a += 2;
	return this;
}
void A::show()
{
	cout << a << endl;
}
A::~A()
{
	cout << "~A()" << endl;
}
int main()
{
	A a(2);
	a.fc();
	a.show();
	return 0;
}
赵4老师 2014-09-09
  • 打赏
  • 举报
回复
mujiok2003的别名就是mujiok2003的乳名。 你能不用概念给瞎子解释清楚啥叫太阳吗?搜“盲人摸太阳”。
mujiok2003 2014-09-09
  • 打赏
  • 举报
回复
引用
引用是别名
这句话呢, 没有错, 什么又是别名呢? 用概念来解释概念。 C++设计者觉得指针的语法(&, *, ->)等“看起来”丑陋, 所以加入了引用,有指针的好处, 没有指针的丑陋语法, 仅此而已。 引用等价于常指针。
风行踩火轮 2014-09-09
  • 打赏
  • 举报
回复
1楼说的比较正确,参考1楼的吧
xiaohuh421 2014-09-09
  • 打赏
  • 举报
回复
为更好的理解引用, 你可以按宏的方法理解引用. (但注意, 宏跟引用完全是不同的东西). 引用就好比把一个变量的名字改成了另一个, 但使用的是同的内存空间. 比如 int iStudentOfBookOfTeacherOfBufferLen = 10; int &len = iStudentOfBookOfTeacherOfBufferLen; //名字太长, 我给它弄短点吧. int heIsADog = 1; int &person = heIsADog; //他是一个有人名的狗.
llwwzz 2014-09-09
  • 打赏
  • 举报
回复
int & add(int &a) { a += 2; return this;// return *this 两者用哪个?为什么?用另一种方式可不可以?为什么? }

65,186

社区成员

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

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