长安的花

当学问走过漫漫古道
凿刻入千窟,心也从愚昧中苏醒

0%

cpp学习12-构造器

定义构造器

  • 回顾:之前我们讨论了使用面向对象的编程技术开发程序最基本步骤:
  • 定义一个有属性和方法的类(模板)
  • 为该类创建一个变量(实现)

构造器和通常方法的主要区别:

  • 构造器的名字必须和它所在的类的名字一样
  • 系统在创建某个类的实例时会第一时间自动调用这个类的构造器
  • 构造器永远不会返回任何值

  • 创建构造器,需要先把它的声明添加到类里:

    1
    2
    3
    class Car {
    Car( void );
    }

    构造器没有任何返回值,甚至不用在前面写上void。

定义构造器本身

1
2
3
4
5
6
7
Car::Car(void)   // 不用写 void Car::Car(void)
{
color = “WHITE”;
engine = “V8”;
wheel = 4;
gas_tank = FULL_GAS;
}

构造数组对象

数组可以是任何一种数据类型,当然也包括对象

  • 如:Car mycar[10];
  • 调用语法依旧是:mycar[x].running;
  • 注:x代表着给定数组元素的下标。
  • 每个类至少有一个构造器,如果你没有在类里定义一个构造器,编译器就会使用如下语法替你定义一个:ClassName::ClassName() { }
  • 这是一个没有代码内容的空构造器,除此之外,编译器还会替你创建一个副本构造器(CopyConstructor
  • 构造器很重要,不可或缺
    1
    2
    Car  mycar;
    mycar.setColor(“Yellow”);
    首先car里构造器是黑色,然后用car里的方法,设置成黄色;

定义析构器

在创建对象时,系统都会自动调用一个特殊的方法,即构造器。

相应地,在销毁一个对象时,系统也应该会调用另一个特殊方法达到对应效果?没错,这就是析构器。

一般来说,构造器用来完成事先的初始化和准备工作(申请分配内存),析构器用来完成事后所必须的清理工作(清理内存)。

构造器和析构器两者相辅相成

构造器和析构器两者相辅相成,有许多共同之处。首先,析构器有着和构造器/类一样的名字,只不过前边多了一个波浪符“~”前缀。

1
2
3
4
5
class Car 
{
Car(void);
~Car();
}
  • 析构器也永远不返回任何值

  • 析构器是不带参数的。所以析构器的声明永远是如下格式:~ClassName();

在我们刚刚的例子中析构器可有可无。但是在比较复杂的类里,析构器往往至关重要(可能引起内存泄露)。

例如某个类的构造器申请了一块内存,我们就必须在析构器里释放那块内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <string>
#include <fstream>

class StoreQuote
{
public:
std::string quote, speaker;
std::ofstream fileOutput;

StoreQuote();
~StoreQuote();

void inputQuote();
void inputSpeaker();
bool write();
};

StoreQuote::StoreQuote()
{
fileOutput.open("test.txt", std::ios::app);
}

StoreQuote::~StoreQuote()
{
fileOutput.close();
}

void StoreQuote::inputQuote()
{
std::getline(std::cin, quote);
}

void StoreQuote::inputSpeaker()
{
std::getline(std::cin, speaker);
}

bool StoreQuote::write()
{
if( fileOutput.is_open() )
{
fileOutput << quote << "|" << speaker << "\n";
return true;
}
else
{
return false;
}
}

int main()
{
StoreQuote quote;

std::cout << "请输入一句名言:\n";
quote.inputQuote();

std::cout << "请输入作者:\n";
quote.inputSpeaker();

if( quote.write() )
{
std::cout << "成功写入文件^_^";
}
else
{
std::cout << "写入文件失败T_T";
return 1;//调用默认的错误代码
}

return 0;
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道