📄 constructordestructor.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>建构函式、解构函式</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">C++
Gossip: 建构函式、解构函式</a></h1>
在定义类别时,您可以使用建构函式(Constructor)来进行物件的初始化,而在物件释放资源之前,您也可以使用“解构函式”
(Destructor)来进行一些善后的工作,例如清除动态配置的记忆体,或像是档案的储存、记录档的撰写等等。 <br>
<br>
在C++中建构函式是与类别名称相同的方法成员,且没有传回值,而解构函式则是在与类别名称同的方法成员前加上~,不具有参数,也不具有传回值,例如:
<br>
<ul>
<li>SafeArray.h</li>
</ul>
<pre>class SafeArray { <br>public: <br> // 建构函式 <br> SafeArray(int); <br> // 解构函式 <br> ~SafeArray();<br> <br> int get(int); <br> void set(int, int);<br> <br> int length; <br>private:<br> int *_array; <br><br> bool isSafe(int i); <br>};</pre>
<br>
在这个类别定义中,您定义了一个“安全阵列”类别,并定义有一个建构函式可以指定阵列长度,可依长度来动态产生阵列,而解构函式中则要负责清除动态产生的
阵列资源,以释放动态配置时所配置的资源。在定义类别时如果没有定义任何的建构函式,则会自动产生一个没有参数、没有实作内容的建构函式,以下是对
SafeArray定义的一个实现:<br>
<ul>
<li>SafeArray.cpp</li>
</ul>
<pre>#include "SafeArray.h"<br><br>// 动态配置阵列<br>SafeArray::SafeArray(int len) {<br> length = len;<br> _array = new int[length];<br>}<br><br>// 测试是否超出阵列长度<br>bool SafeArray::isSafe(int i) {<br> if(i >= length || i < 0) {<br> return false;<br> } <br> else {<br> return true;<br> }<br>}<br><br>// 取得阵列元素值<br>int SafeArray::get(int i) {<br> if(isSafe(i)) {<br> return _array[i];<br> }<br> <br> return 0;<br>}<br><br>// 设定阵列元素值<br>void SafeArray::set(int i, int value) {<br> if(isSafe(i)) {<br> _array[i] = value;<br> }<br>}<br><br>// 删除动态配置的资源<br>SafeArray::~SafeArray() {<br> delete [] _array;<br>}</pre>
<span class="postbody"></span> <small><span style="color: rgb(255, 255, 255);"> 0 1 2 3 4 5 6 7 8 9</span></small><br>
下面的程式示范如何使用这个SafeArray类别:<br>
<ul>
<li>main.cpp</li>
</ul>
<pre>#include <iostream> <br>#include "SafeArray.h"<br>using namespace std; <br><br>int main() {<br> SafeArray safeArray(10);<br> <br> for(int i = 0; i < safeArray.length; i++) {<br> safeArray.set(i, (i + 1) * 10);<br> }<br> <br> for(int i = 0; i < safeArray.length; i++) {<br> cout << safeArray.get(i) << " ";<br> }<br> cout << endl;<br> <br> return 0; <br>}</pre>
<span class="postbody"><br>
执行结果:</span><br>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">10 20 30 40 50 60 70 80 90 100</span></small><span style="color: rgb(255, 255, 255);"><br>
</span></td>
</tr>
</tbody>
</table>
<br>
在建构函式的初始化设定语法中,您还可以使用成员初始化列表(Member initialization list),例如:<br>
<ul>
<li>SafeArray.cpp</li>
</ul>
<pre>#include "SafeArray.h"<br><br>SafeArray::SafeArray(int len) : length(len) {<br> _array = new int[length];<br>}<br><br>...略</pre>
<span class="postbody"><br>
要被初始化的成员跟在参数列之后,要被设定给成员的引数被放在括号中,如果有多个成员要初始化,则以逗号分隔。<br>
</span><br>
关于解构函式还有一个问题,如果没有定义解构函式时,程式如何结束物件?答案是程式会自动建立一个没有实作内容的解构函式并自动于适当的时机执行。 <br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -