ramshadom 2019-01-07 23:16 采纳率: 71.4%
浏览 860
已采纳

关于C++引用传递参数以及this指针的疑问?

void swapint(int &a, int &b)
{
    cout << a << '\n' << b << endl;
    int temp;
    temp = a;
    a = b;
    b = temp;
}

class Critter
{
public:
       Critter(const string& name = "", int age = 0);
       ~Critter();                   
       Critter(const Critter& c);   
       Critter& operator=(const Critter& c); 
       void Greet() const;
private:
       string* m_pName;                       
       int m_Age;
};

void testAssignmentOp()
{
       Critter crit1("crit1", 7);
       Critter crit2("crit2", 9);
       crit1 = crit2; //这里会调用重载的复制运算符
       crit1.Greet();
       crit2.Greet();
       cout << endl;
       Critter crit3("crit", 11);
       crit3 = crit3;
       crit3.Greet();
}

Critter& Critter::operator=(const Critter& c)
{
    if (this != &c)
        {
            cout << *(c.m_pName) << '\n';
            delete m_pName;
            m_pName = new string(*(c.m_pName));
            m_Age = c.m_Age;
        }
        return *this; 
}

上面两个代码块,第一个是通过引用传递来交换a和b的值,另一个是重载赋值运算符。

我的疑问是:第一个代码块的cout << a << '\n' << b << endl; 输出的就是实参的值。但是为什么第二个代码块的c.m_pName却需要间址运算符才能输出实参的值,只写c.m_pName只会输出对应的地址。


另外关于this指针的问题是:第二个代码块中,为什么编译器可以自动识别出m_pName, m_Age指代的就是this?我编译过是能通过的。当然this->m_pName 和,this->m_Age也是能通过


非常感谢回答。

  • 写回答

2条回答 默认 最新

  • 六碗铁biu_ 2019-01-08 22:34
    关注

    第一个:你代码里的m_pName类型是string*, 是一个string类的指针,如果你直接打印,打印的是地址,*m_pName才代表这个数据的值,
    比如int a = 0;你可以打印出a的值,但是 int * b = &a; 你直接打印b就是地址 打印*b才是数据。

    第二个: 因为你是在定义成员函数 ,m_pName 是成员变量,都是在同一个类里,所以this可以不写,默认就是this->m_pName.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!