1. 例子一
#include <iostream> using namespace std; class sp { public: sp() {cout<<"sp()"<<endl;} sp(sp *other) { cout<<"sp(sp *other)"<<endl; } /* * 此例子中这个拷贝构造函数要么不存在, * 只要存在参数必须加const修饰。 */ sp(const sp &other) { cout<<"sp(sp &other)"<<endl; } ~sp() { cout<<"~sp()"<<endl; } }; int main(int argc, char **argv) { sp other = new sp(); return 0; }
执行结果:
sp() sp(sp *other) ~sp()
1.拷贝构造函数没有使用但是其参数必须是const引用的原因:
sp other = new sp();
① new sp()生成一个sp*的临时指针变量。
② 然后使用这个临时的sp*为参数调用构造函数sp(sp *other)构造出一个临时的sp对象。
③ 使用这个临时的sp对象来调用拷贝构造函数来初始化sp other。
由于此例中拷贝构造函数的参数传递的是一个sp的临时变量,所有需要是const引用。
从执行结果上拷贝构造函数的确没有调用,那是高版本的编译器做了优化,但是在编译期编译器仍然做了检查,所以会报这个错!
2.const引用就不可再拷贝构造函数中修改参数other的成员了(read only), 也不存在这个需求。
原文:https://www.cnblogs.com/hellokitty2/p/10645807.html