egmkang 服务端开发工程师

C++里面的构造函数

2014-10-21

C++有构造函数, 拷贝构造函数, 赋值函数. 很多初学者分不清这些, 外加上编译器的优化, 会导致他们调试的时候以为赋值函数就是拷贝构造函数.

#include <iostream>

struct C {
  explicit C(int) { std::cout << "C::C(int)" << std::endl; }
  C(const C&) { std::cout << "C::C(const C&)" << std::endl; }
};

int main() {
  C c1(42);
  C c2 = C(42);
  return 0;
}

如上代码, explicit C(int)就是构造函数; C(const C&) 就是拷贝构造函数; 如果有一个C& operator = (const C&)那么就是赋值函数了. 上面的C c2 = C(42), 先会调用右边临时变量的构造函数, 然后才会去调用左边c2的拷贝构造函数; 如果有赋值函数, 那么就是先调用构造函数, 然后再去调用c2的赋值函数.

编译的时候, 需要用上-fno-elide-constructors这个参数, 来关掉构造函数的优化:

$ g++ 1.cc -g -O0 -fno-elide-constructors
$ ./a.out

这就是输出:

C::C(int)
C::C(int)
C::C(const C&)

下一篇 P2P贷款

Comments