C++有关成员函数返回类的引用的一些问题?

新手上路,请多包涵
#include<iostream>
using namespace std;

class A {
public:
    int val;
    int s;
    A(int val = 0, int s = 0 ) {
        this->val = 10;
        this->s = 12;
        cout << this << endl;  //怀疑是下面的注释处 临时创建了一个变量 所以这里输出 this值 做区别
    }
    ~A() {
    }
    A& getobj() {
        return *this;
    }
};

int main() {

    A aa;
    int m, n;
    cin >> m >> n;    //输入 2 3
    aa.getobj() = m;   //想问问 这一步具体发生了什么?
    cout << aa.s << endl; //输出12 
    cout << aa.val << endl;    //输出10 

    return 0;
}

*我在中间调试的时候发现在走到 aa.getobj()=m 这一行的时候发生了又走了一遍新的构造函数 不知道这是为什么?我怀疑是中间临时构建的一个对象 但是为什么要这么做?
还有就是 为什么int变量可以赋值给自定义的类 是类似于int 赋值给double 的情况吗?就是类型的隐式转换 是这样吗? *
求解~

阅读 2k
2 个回答

构造函数可以用于类型转换,详见class.conv.ctor。你程序中的构造函数就可以用于把 int 转换为 class A 。

对类对象的赋值本质是一个函数调用,调用的赋值运算符。没有用户定义的话,通常会生成一个,类型是 A& operator=(const A&);。 m 作为一个 int 类型的对象,可以转换为 class A 的对象,于是用于参数调用 class A 的 opertor= ,于是就赋值了。

赋值过程了,发生了 int 类型到 class A 类型的转换,这个类型转换是通过构造函数实现的,于是构造函数被调用了。类型转换的结果是一个 class A 的临时对象。

是的,这里发生了隐式转换,就相当于 aa = 2

如果定义了合适的赋值构造函数,那么这里就会走辅助构造函数,比如 A &operator=(int ) { return *this; }

如果要禁止这种隐式转换,使用 explicit 关键字

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进