1. A a = 0; 首先, compiler(编译器)认为这样写是不符合规矩的, 因为A = A才是正常行为。 但是她并不放弃, 通过搜索, 发现A可以根据一个int构造, 同时这个A(int i)没有用explicit修饰过。 那么A a = 0; 这样的一句话随即转变成: A tmp(0); A a = tmp; 需要说明的是, A a = tmp是调用的copy ctor(拷贝构造函数), 虽然class A中并没有, 但是通常不写copy ctor的话,compiler都会生成一个默认操作性质的ctor, 底层实现通常会以memcpy进行。
2. a = 10; 首先, 这样同ctor的情况一样, compiler无法直接进行操作。 类推, 等同于代码: A tmp(10); a = tmp; 需要注意的是, a = tmp是调用的assignment操作, 同ctor一样,我们自己不写, 编译器同样进行memberwise assignment操作。
3. fn(A a) 同样, fn(10)也是不对的, 但是"按照惯例", 呵呵, 会有: A tmp(10); fn(tmp);
另外, 为你解惑: copy ctor的写法只能是T::T(const T &); 而assignment的写法可以多变, 即任意. 以T为例, 可以有 T &operator = (int n); 也可有 T &operator = (const char *); 当然, 你要确认如此的定义是对T而言有意义.
class A{public:A(int i) : m_i(i){}int m_i;};int main(){A a = 0;a = 10; }1. A a = 0;首先, compiler认为这样写是不符合规矩的, 因为A = A才是正常行为。但是她并不放弃, 通过搜索, 发现A可以根据一个int构造, 同时这个A(int i)没有用explicit修饰过。那么A a = 0; 这样的一句话随即转变成:A tmp(0);A a = tmp;需要说明的是, A a = tmp是调用的copy ctor, 虽