可能重复:
What are the differences between pointer variable and reference variable in C++?
What are the distinctions between the various symbols (*,&, etc) combined with parameters?
我在解决下面粘贴的示例代码时遇到了一些麻烦。具体来说,功能Buf& operator=( const Buf & );
。根据我的理解,此函数需要返回类Buf
的对象的地址。出现了两个问题:
同样适用于将此声明为Buf* operator=( const Buf* );
,因为Buf*
也是类Buf
的实例的地址吗?如果没有,为什么不呢?如果是这样,它只是编码风格的偏好吗?哪个更好?
在相应的函数定义中,返回*this
。据我所知,this
是一个指针或地址,对应于类Buf
的对象。所以*this
是指针所指向的,即类Buf
的对象。这与回归Buf*
有冲突吗?函数应该返回this
而不是*this
吗?
我想我今天有一天......请有人帮忙!!
using namespace std; class Buf { public: Buf( char* szBuffer, size_t sizeOfBuffer ); Buf& operator=( const Buf & ); void Display() { cout << buffer << endl; } private: char* buffer; size_t sizeOfBuffer; }; Buf::Buf( char* szBuffer, size_t sizeOfBuffer ) { sizeOfBuffer++; // account for a NULL terminator buffer = new char[ sizeOfBuffer ]; if (buffer) { strcpy_s( buffer, sizeOfBuffer, szBuffer ); sizeOfBuffer = sizeOfBuffer; } } Buf& Buf::operator=( const Buf &otherbuf ) { if( &otherbuf != this ) { if (buffer) delete [] buffer; sizeOfBuffer = strlen( otherbuf.buffer ) + 1; buffer = new char[sizeOfBuffer]; strcpy_s( buffer, sizeOfBuffer, otherbuf.buffer ); } return *this; } int main() { Buf myBuf( "my buffer", 10 ); Buf yourBuf( "your buffer", 12 ); // Display 'my buffer' myBuf.Display(); // assignment opperator myBuf = yourBuf; // Display 'your buffer' myBuf.Display(); }
答案 0 :(得分:4)
此:
Buf& operator=( const Buf & );
返回对Buf
对象的引用,而不是Buf
对象的地址。因此,当方法返回*this
时,调用者将获得对该对象的引用。
此: Buf * operator =(const Buf *);
返回指向Buf
的指针,因此相应的函数确实会返回this
。
请注意:
Buf& b = <some code returning Buf&>;
b
是对Buf
的引用,而不是地址。另一方面,
Buf c = ...
Buf* pBuf = &c;
上面代码中的 &c
是 c
的地址,可用于初始化pBuf
,这是Buf
的指针。因此,*
和&
可能具有不同的含义,具体取决于上下文。
答案 1 :(得分:3)
据我所知,这个函数需要一个对象的地址 将返回Buf类。
没有
返回对Buf对象的引用,而不是地址。引用不是地址。它是一个别名 - 用来指代那个精确对象的东西。引用与指针不同。
我建议你谷歌搜索C ++引用和指针,或者甚至更好,你阅读a good C++ book来解释这个概念。
答案 2 :(得分:3)
Buf&
不是“地址”,而是一个参考。从语法上讲,您只需返回一个对象,调用者就可以访问原始对象。在上面的例子中,return *this;
返回当前对象。
(请注意,通过引用返回自动对象是违法的,因为当调用者稍后尝试访问它们时它们将不再存在。)
答案 3 :(得分:1)
在幕后,引用被称为指向对象的指针。当您返回*this
作为参考时,您实际上将确切的对象(没有任何复制)返回到接收它的引用。引用和指针之间的主要区别在于您可以操作指针(比如更改它们指向的地址),但引用不能。
示例:
int val = 4;
int *p = &val;
int &r = val;
p++ // Will pointer to the next memory located to val (addr(val) + sizeof(int))
(*p)++ // Will NOT increment val anymore as p pointer to another location
r++ // will increment value of val (you cannot increment the location r is pointing to). This is same as (*p)++.
p
和r
都指的是内存中的相同位置(val
的地址),但唯一的区别是您访问val值的方式。 (*p
vs r
)
答案 4 :(得分:1)
如果您对参考概念(SomeType&
)和地址获取运算符(&SomeObject
)之间的差异有所了解,您可以查看C++ FAQ,其中有一个很好的解释什么是参考,你应该如何使用它。