C++ 为什么这个函数在类中用这个奇怪的调用初始化成员值?

C++ 为什么这个函数在类中用这个奇怪的调用初始化成员值?,c++,class,oop,pointers,C++,Class,Oop,Pointers,为什么这是更改对象foo中“x”值的合法方法 还有,为什么这个foo=30在地址0x7fffc44ef924处构造一个新对象?这个对象是什么类型的 还有为什么:cout可以通过在构造函数之前添加explicit关键字将构造函数更改为显式构造函数,如下所示: constructed :0x7fffc44ef920 x is : 10 x is : 20 constructed :0x7fffc44ef924 0x7fffc44ef920 x is : 30 阅读并理解它们。如果它们没有意义,那么

为什么这是更改对象foo中“x”值的合法方法

还有,为什么这个
foo=30
在地址
0x7fffc44ef924
处构造一个新对象?这个对象是什么类型的


还有为什么:
cout可以通过在构造函数之前添加
explicit
关键字将构造函数更改为显式构造函数,如下所示:

constructed :0x7fffc44ef920
x is : 10
x is : 20
constructed :0x7fffc44ef924
0x7fffc44ef920
x is : 30
阅读并理解它们。如果它们没有意义,那么你需要更多地学习C++,例如,./P> 为什么这个foo.get()=20是更改对象foo中“x”值的合法方法

因为你要返回一个对x的引用,这就是引用的行为。事实上,我所知道的从函数(
int&get()
)返回引用的唯一原因就是允许这种行为。例如,如果您正在实现运算符[],则可以执行此操作

有时,为了避免复制值,您希望返回一个常量引用(
const int&foo()
),但您只能使用类或结构来执行此操作

还有,为什么这个foo=30在地址处构造一个新对象 0x7fffc44ef924?这个对象是什么类型的

因为MyClass有一个构造函数,它接受一个
int
参数,所以编译器将其解释为一种将int转换为MyClass的方法,这就是这里发生的情况。这相当于
foo=MyCLass(int)
如果您不希望出现这种行为,可以将MyCLass(int)声明为显式:

prog.cc: In function 'int main()':
prog.cc:18:22: error: converting to 'MyClass' from initializer list would use explicit constructor 'MyClass::MyClass(int)'
     MyClass foo = {10};
                      ^
prog.cc:21:11: error: no match for 'operator=' (operand types are 'MyClass' and 'int')
     foo = 30;
           ^~
prog.cc:5:7: note: candidate: 'constexpr MyClass& MyClass::operator=(const MyClass&)'
 class MyClass {
       ^~~~~~~
prog.cc:5:7: note:   no known conversion for argument 1 from 'int' to 'const MyClass&'
prog.cc:5:7: note: candidate: 'constexpr MyClass& MyClass::operator=(MyClass&&)'
prog.cc:5:7: note:   no known conversion for argument 1 from 'int' to 'MyClass&&'
还有,为什么这个foo=30在地址处构造一个新对象 0x7fffc44ef924?这个对象是什么类型的


还有,为什么会这样:在单参数构造函数前面尝试
显式
——它应该会教你很多东西。听起来你可以每个问题问一个问题
explicit  MyClass (int val) : x(val) {
  cout << "constructed :" << this << endl;
}
prog.cc: In function 'int main()':
prog.cc:18:22: error: converting to 'MyClass' from initializer list would use explicit constructor 'MyClass::MyClass(int)'
     MyClass foo = {10};
                      ^
prog.cc:21:11: error: no match for 'operator=' (operand types are 'MyClass' and 'int')
     foo = 30;
           ^~
prog.cc:5:7: note: candidate: 'constexpr MyClass& MyClass::operator=(const MyClass&)'
 class MyClass {
       ^~~~~~~
prog.cc:5:7: note:   no known conversion for argument 1 from 'int' to 'const MyClass&'
prog.cc:5:7: note: candidate: 'constexpr MyClass& MyClass::operator=(MyClass&&)'
prog.cc:5:7: note:   no known conversion for argument 1 from 'int' to 'MyClass&&'
explicit MyClass( int val ) {...