关于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也是能通过


非常感谢回答。

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

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

m_pName是字符数组,不是c++的string,<<重载中,需要强制转换成指针,才能输出
cout << (char *)(c.m_pName) << '\n';
这样也可以