为什么在声明对象时,构造函数和赋值运算符都没有执行?

Nic*_*ick 3 c++ oop constructor assignment-operator

测试程序是

#include <iostream>
using namespace std;

class A
   {public:
       A (): I(0) {cout << "default construcot" << endl; };
       explicit A (int i): I(i) {cout << "another construcot" << endl; };
       A (const A& a): I(a.I) {cout << "copy constructor" << endl; }
       A& operator = (const A& a)
          {cout << "assignment operator" << endl; 
           if (this == &a) return *this; 
           I = a.I;
           return *this; 
          }
       void show () {cout << I << endl; };
    private:
       int I;
   };

int main ()
   {A a = A(1);
    A b;
    b = A(2);
    a.show();
    b.show();
    return 0;
   }
Run Code Online (Sandbox Code Playgroud)

输出

another construcot
default construcot
another construcot
assignment operator
1
2
Run Code Online (Sandbox Code Playgroud)

表明,与'b'不同的对象'a'是从A(1)"直接"构造而不执行赋值运算符.但复制构造函数也没有被执行.为什么?在这种情况下,有没有办法强制执行赋值运算符?如果我写的话,我会期待这种行为

A a (1);
Run Code Online (Sandbox Code Playgroud)

但我想要

A a = A(1);
Run Code Online (Sandbox Code Playgroud)

这与第一种情况不同.或不?

(事实上​​,当我有一个从A派生的B类并且希望A的赋值运算符处理A a = B(...)之类的声明时,会出现问题.)

ybu*_*ill 6

这个

A a = A(1);
Run Code Online (Sandbox Code Playgroud)

不等于这个:

A a;
a = A(1);
Run Code Online (Sandbox Code Playgroud)

在第二种情况下=是操作员,在第一种情况下=不是操作员.在第一个语句中,它是一个初始化语法.编译器可以调用复制构造函数,但它可以优化它,因为它是语言允许的地方之一(RVO,异常抛出等).