理解构造函数和复制控制成员的好例子

#include <vector> #include <iostream> struct Exampl { // 默认构造函数 Exampl() { std::cout << "Exampl()" << std::endl; } // 复制构造函数 Exampl(const Exampl&) { std::cout << "Exampl(const Exampl&)" << std::endl; } // 赋值操作符 Exampl& operator = (const Exampl &rhs) { std::cout << "operator = (const Exampl&)" << std::endl; return *this; } // 析构函数 ~Exampl() { std::cout << "~Exampl()" << std::endl; } }; void func1(Exampl obj) // 形参为Exampl对象 { } void func2(Exampl &obj) // 形参为Exampl对象的引用 { } Exampl func3() { Exampl obj; return obj; // 返回Exampl对象 } int main() { Exampl eobj; // 调用默认构造函数创建Exampl对象eobj std::cout << "------------------" << std::endl; func1(eobj); // 调用复制构造函数 // 将形参Exampl对象创建为实参对象的副本 // 函数执行完后调用析构函数撤销形参Exampl对象 std::cout << "------------------" << std::endl; func2(eobj); // 形参为Exampl对象的引用,无需调用复制构造函数传递实参 std::cout << "------------------" << std::endl; eobj = func3(); // 调用默认构造函数创建局部Exampl对象 // 函数返回时调用复制构造函数创建作为返回值副本的Exampl对象 // 然后调用析构函数撤销局部Exampl对象 // 然后再调用赋值操作符 // 执行完赋值操作符后,调用析构函数撤销作为返回值副本的Exampl对象 std::cout << "------------------" << std::endl; Exampl *p = new Exampl; // 调用默认构造函数动态创建Exampl对象 std::cout << "------------------" << std::endl; std::vector<exampl> evec(3); // 调用默认构造函数创建一个临时Exampl对象 // 然后3次调用复制构造函数, // 将临时Exampl对象复制到evec的每个元素, // 然后调用析构函数撤销临时Exampl对象 std::cout << "------------------" << std::endl; delete p; // 调用析构函数撤销动态创建的Exampl对象 return 0; // evec及eobj生命周期结束,自动调用析构函数撤销 // 撤销evec需要3次调用析构函数(因为有3个元素) }

运行结果如下图:

你可能感兴趣的:(构造函数,复制控制成员)