#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 的情况吗?就是类型的隐式转换 是这样吗?
构造函数可以用于类型转换,详见class.conv.ctor。你程序中的构造函数就可以用于把 int 转换为 class A 。
对类对象的赋值本质是一个函数调用,调用的赋值运算符。没有用户定义的话,通常会生成一个,类型是 A& operator=(const A&);
。 m 作为一个 int 类型的对象,可以转换为 class A 的对象,于是用于参数调用 class A 的 opertor= ,于是就赋值了。
赋值过程了,发生了 int 类型到 class A 类型的转换,这个类型转换是通过构造函数实现的,于是构造函数被调用了。类型转换的结果是一个 class A 的临时对象。