理解构造函数和复制控制成员的好例子
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个元素)
}
运行结果如下图:
#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个元素)
}
运行结果如下图:
相关文章推荐
- 理解复制控制成员和构造函数--实例
- 理解何时执行哪个构造函数和复制控制成员
- 如何理解复制控制成员和构造函数
- 理解复制控制成员和构造函数
- 构造函数,友元,static类成员,复制控制
- C++理解拷贝控制成员和构造函数
- 【c++primer——】第13章复制控制——01深入理解复制构造函数
- 构造函数和复制控制成员
- 用例子来理解c++的类,构造函数,类的多态,成员函数,成员变量
- 一段代码引起的对C++构造函数、析构函数,复制构造函数,运算符重载的深度理解
- 控制反转理解,一个简单例子
- C++ Primer 学习笔记_68_面向对象编程 -构造函数跟复制控制[续]
- 浅谈自己对构造函数、析构函数、复制构造函数的理解
- C++构造,析构,友元类,对象,static成员,复制构造函数,运算符重载杂谈
- 复制控制---复制构造函数
- 小例子 理解 laravel 中的 控制反转模式
- 轻松理解—继承成员访问控制机制
- 复制控制例子--相信对大家有帮助
- C++ primer 学习记录:面对对象编程之构造函数和复制控制
- C++复制控制成员