C默认构造函数
我使用以下代码得到编译错误:
main.cpp: In function aint main()a: main.cpp:38: error: no matching function for call to aComplex::Complex(Complex)a main.cpp:22: note: candidates are: Complex::Complex(Complex&) main.cpp:15: note: Complex::Complex(double,double) 但是当我将复制构造函数的参数类型更改为const Complex&时,它可以工作. #include <iostream> using namespace std; class Complex { double re; double im; public: Complex(double re=0,double im=0); Complex(Complex& c); ~Complex() {}; void print(); }; Complex::Complex(double re,double im) { cout << "Constructor called with " << re << " " << im << endl; this->re = re; this->im = im; } Complex::Complex(Complex &c) { cout << "Copy constructor called " << endl; re = c.re; im = c.im; } void Complex::print() { cout << "real = " << re << endl; cout << "imaginary = " << im << endl; } int main() { Complex a = 2; a.print(); Complex b = a; b.print(); } 解决方法
当你写作
Complex a = 2; 编译器不会直接使用0作为默认参数来调用Complex构造函数来构建a,而是考虑它是否可以“转换”2到复合体. 要进行转换,它会找到你的Complex(re,im)版本并且可以使用它,这要归功于默认值以及你没有明确声明构造函数的事实,但是它必须找到一种方法将这个值传递给一个. 这种“转移”的工具可以是复制构造函数.但是,可以使用Complex(re,im)构建的复杂值是临时的,并且由于C中的一些可疑原因,不允许将临时作为非const引用传递给函数. 因此,您的复制构造函数不能与临时使用,并且编译器被卡住,因为没有办法初始化using 2. 如果你声明你的拷贝构造函数而不是接受一个const引用,那么临时可以传递给你的拷贝构造函数来初始化a,所以一切都按预期工作. 可以使用语法Complex a(2)直接初始化a,在这种情况下,不需要使用复制构造函数. 还要注意,当你使用语法Complex a =时可能会很奇怪…编译器必须检查使用复制构造函数是否合法,但是一旦检查了合法性,就不允许调用它并直接使用初始化而不是换句话说,即使你需要声明你的拷贝构造函数接受一个const引用仍然能够编译,编译器实际上可能会跳过该部分并直接构建一个而不调用拷贝构造函数(即使复制构造函数 – 如你的情况一样 – 有副作用).添加了这个显然是疯狂的规则,以便能够在生成的代码中进行一些优化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |