2013-04-09 171 views
-1

这里是基本上实现对类名为CMyString =赋值的代码,代码是正确的。关于运算符的C++访问

CMyString& CMyString::operator =(const CMyString &str) { 
if(this == &str) 
    return *this; 

delete []m_pData; 
m_pData = NULL; 

m_pData = new char[strlen(str.m_pData) + 1]; 
strcpy(m_pData, str.m_pData); 

return *this; 
} 

该实例通过引用传递,第一个'if'检查传入的实例是否为自身。我的问题是:为什么它使用&str来比较,而不是str已经包含实例的地址?任何人都可以解释这条线的工作原理吗?

此外,我只是想确保this包含对象的地址:这是正确的吗?

+0

的建议,中序进行赋值运算execption SAFTY其更好地存储临时指针中的m_pData在末尾删除临时指针,以便即使在为m_pData = new分配内存时发生异常char [strlen(str.m_pData)+ 1];源对象的数据是安全CMyString&CMyString ::运算符=(const的CMyString&STR){ 如果(这==&STR) 返回*此; char * temp = m_pData; m_pData =新的char [strlen的(str.m_pData)+ 1]; strcpy(m_pData,str.m_pData); delete [] temp; temp = NULL; return * this; } – shivakumar 2013-04-09 06:11:31

+0

我知道,我还想着把类似的功能,但没有异常处理,但是这不是真的什么,我就在这里...但我还是谢谢你 – fiftyplus 2013-04-09 06:14:49

回答

1

Address-of OperatorReference Operator是不同的。

&除了作为地址运算符之外,还用于C++中作为参考声明。意义不一样。

int target; 
int &rTarg = target; // rTarg is a reference to an integer. 
         // The reference is initialized to refer to target. 
void f(int*& p);  // p is a reference to a pointer 

如果你拿一个引用的地址,它会返回它的目标地址。使用之前的声明,& rTarg是与&目标相同的内存地址。

4

尚未str的包含实例

号的参考文献是对象本身的地址。它不是一个指向对象的指针。 。

(一,即在函数的声明,&str代表“参考str”和“的str地址” - 如果函数被宣布像你说什么是正确的这样的:

CMyString& CMyString::operator =(const CMyString *str); 

但它不是)

+0

一个跟进的问题: – fiftyplus 2013-04-09 06:43:11

+0

刚刚发现有一个关于差异由C和C++,在C之间引用传递,参考通过使用&一个过去了,一相同类型的指针将被用于访问存储在该指针的值。但似乎在C++中,不需要使用&a,它可以使用a,参数必须是引用类型。在我的情况是(CMyString&str)。所以当一个str对象被传入时,这个引用类型究竟意味着什么?与原来的一样吗?看起来像这个引用类型对象的用法看起来非常类似于一个值类型对象。 THANKs – fiftyplus 2013-04-09 07:17:49

+2

@fifty C没有引用。 C有指针。当您使用富(一)C,你传递一个指针,和Foo的签名是FOO(type_of_a *)。在C++中,你可以做同样的事情,加上通过引用。 foo的签名变为foo(type_of_a&),并将其用作foo(a)。这里不是一个指针,它是一个参考。正如H2CO3所说的那样,一个参考是物体本身。您可以像使用该对象一样使用此引用。看到杰梅因徐对操作员的回答,这可能会解释你的困惑。 – undu 2013-04-09 08:01:27

0

strstr传递给赋值运算符是通过引用,所以它包含了实际的对象,而不是它的地址。 A this是指向正在调用方法的类的指针,因此如果想要比较,传递的对象是否是同一个对象本身,则必须获取str的地址才能进行比较。

请注意,&的行为有所不同,具体取决于它的使用位置。如果在声明中,它意味着获取它应用于的对象的地址。另一方面,如果它用于声明中,则表示声明的对象是参考

请看下面的例子:

int i = 42; 
int & refToI = i; // A reference to i 
refToI = 99; 
std::cout << i; // Will print 99 

int j = 42; 
int * pJ = &j; // A pointer to j 
*pJ = 99; 
std::cout << j; // Will print 99 

this是一个指向实例,所以是的,它包含了地址。

验证的整点,如果传递的对象是this或不是为了避免不必要的(或可能是破坏性的)赋值给自己。

0

确实是一个变量引用 - 在类型名称后面用符号&表示 - 底层实现通常是一个指针,C++标准看起来并没有指定它。

在它的使用,无论如何,在语法级别,参考使用一样的相同类型的非参考值,即。更严格地说:

如果变量的类型是T &,那么它应该像使用T那样来使用。

如果你必须写str.someMethod()而不是str->someMethod()(不箭头操作符的任何重载),则必须使用&获得值的地址。换句话说,引用或多或少地像变量的别名,而不像指针。

有关引用和指针的更多信息,请参见以下问题: