您的位置:首页 > 其它

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

2013-05-17 22:22 113 查看
#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个元素)
}

运行结果如下图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: