【问题标题】:C++ interview about operator关于运算符的 C++ 面试
【发布时间】:2013-03-31 10:00:07
【问题描述】:

这里的代码基本上实现了一个名为CMyString的类的=赋值,代码是正确的。

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 包含对象的地址:这是正确的吗?

【问题讨论】:

  • 一个建议,为了让赋值操作执行安全,最好将m_pData存储在一个临时指针中,在最后删除临时指针,这样在为m_pData分配内存时甚至会发生异常 = new char[strlen(str .m_pData) + 1];源对象数据是安全的 CMyString& CMyString::operator =(const CMyString &str) { if(this == &str) return *this;字符 *temp = m_pData; m_pData = 新字符[strlen(str.m_pData) + 1]; strcpy(m_pData, str.m_pData);删除 [] 温度;临时=空;返回*这个; }
  • 我知道,我正在考虑放一些类似功能但没有异常处理的东西,但这并不是我真正关心的......但无论如何谢谢

标签: c++ pointers reference variable-assignment


【解决方案1】:

str不是已经包含了实例的地址

没有。引用是对象本身。它不是指向对象的指针。

(即,在函数的声明中,&str 代表“对 str 的引用”和 notstr 的地址” - 你在说什么如果函数是这样声明的,about 是正确的:

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

但事实并非如此。)

【讨论】:

  • 刚刚发现C和C++的引用传递是有区别的,在C中,引用是用&a传递的,并且会使用同一个类型的指针来访问存储在这个指针中的值.但是好像在C++中,不需要使用&a,可以使用a,并且参数必须是引用类型。在我的情况下是(CMyString &str)。那么当传入一个str对象时,这个引用类型到底是什么意思呢?这和原来的一样吗?看起来这个引用类型对象的用法看起来非常类似于值类型对象。谢谢
  • @fifty C 没有引用。 C有指针。当你在 C 中使用 foo(&a) 时,你传递一个指向 a 的指针,而 foo 的签名是 foo(type_of_a*)。在 C++ 中,你可以做同样的事情,加上引用传递。 foo 的签名变成 foo(type_of_a&),你把它当作 foo(a) 使用。这里 a 不是指针,它是一个引用。正如 H2CO3 所说,引用是对象本身。您可以像使用对象一样使用此引用。请参阅 Jermaine Xu 对 operator& 的回答,这可能会解释您的困惑。
【解决方案2】:

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 与 &target 的内存地址相同。

【讨论】:

    【解决方案3】:

    str 传递给赋值运算符是由 reference 传递的,所以它包含实际对象,而不是它的地址。 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 的全部目的是避免对自身进行不必要的(或可能具有破坏性的)赋值。

    【讨论】:

      【解决方案4】:

      虽然确实是一个变量引用 - 在类型名称后用符号 &amp; 表示 - 底层实现通常是一个指针,但 C++ 标准似乎没有指定它。

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

      如果变量的类型是T &amp;,那么它应该被当作T类型来使用。

      如果你必须写str.someMethod()而不是str-&gt;someMethod()(没有任何箭头运算符的重载),那么你必须使用&amp;来获取值的地址。换句话说,引用的行为或多或少类似于变量的别名,而不是指针。

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

      【讨论】:

        猜你喜欢
        • 2011-01-28
        • 1970-01-01
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        相关资源
        最近更新 更多