C++語法:構造函數以及析構函數

目錄

    • 定義
    • 主要特點
    • C++的構造函數定義格式
      • 示例1:不帶參數的構造函數
      • 示例2:帶參數的構造函數
      • 示例3:使用初始化列表來初始化字段
    • 類的析構函數

定義

構造函數 ,是一種特殊的方法。主要用來在創建對象時初始化對象, 即為對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中。特別的一個類可以有多個構造函數 ,可根據其參數個數的不同或參數類型的不同來區分它們 即構造函數的重載。

主要特點

1.構造函數的命名必須和類名完全相同。
2.構造函數的功能主要用于在類的對象創建時定義初始化的狀態。它沒有返回值,也不能用void來修飾。
3.構造函數不能被直接調用,必須通過new運算符在創建對象時才會自動調用;而一般的方法是在程序執行到它的時候被調用的;
4.當定義一個類的時候,通常情況下都會顯示該類的構造函數,并在函數中指定初始化的工作也可省略
5.構造函數有回滾的效果,構造函數拋出異常時,構造的是一個不完整對象,會回滾,將此不完整對象的成員釋放

C++的構造函數定義格式

C++語言為類提供的構造函數可自動完成對象的初始化任務,全局對象和靜態對象的構造函數在main()函數執行之前就被調用,局部靜態對象的構造函數是當程序第一次執行到相應語句時才被調用。然而給出一個外部對象的引用性聲明時,并不調用相應的構造函數,因為這個外部對象只是引用在其他地方聲明的對象,并沒有真正地創建一個對象。

class <類名>
{
public:
<類名>(參數表);
//...(還可以聲明其它成員函數)
};
<類名>::<函數名>(參數表)
{
//函數體
}

示例1:不帶參數的構造函數

#include <iostream>using namespace std;class Line
{public:void setLength( double len );double getLength( void );Line();  // 這是構造函數private:double length;
};// 成員函數定義,包括構造函數
Line::Line(void)
{cout << "Object is being created" << endl;
}void Line::setLength( double len )
{length = len;
}double Line::getLength( void )
{return length;
}
// 程序的主函數
int main( )
{Line line;// 設置長度line.setLength(6.0); cout << "Length of line : " << line.getLength() <<endl;return 0;
}

運行結果:

Object is being created
Length of line : 6

示例2:帶參數的構造函數

#include <iostream>using namespace std;class Line
{public:void setLength( double len );double getLength( void );Line(double len);  // 這是構造函數private:double length;
};// 成員函數定義,包括構造函數
Line::Line( double len)
{cout << "Object is being created, length = " << len << endl;length = len;
}void Line::setLength( double len )
{length = len;
}double Line::getLength( void )
{return length;
}
// 程序的主函數
int main( )
{Line line(10.0);// 獲取默認設置的長度cout << "Length of line : " << line.getLength() <<endl;// 再次設置長度line.setLength(6.0); cout << "Length of line : " << line.getLength() <<endl;return 0;
}

運行結果:

Object is being created, length = 10
Length of line : 10
Length of line : 6

示例3:使用初始化列表來初始化字段

Line::Line( double len): length(len)
{cout << "Object is being created, length = " << len << endl;
}

等同于:

Line::Line( double len)
{length = len;cout << "Object is being created, length = " << len << endl;
}

假設有一個類 C,具有多個字段 X、Y、Z 等需要進行初始化,同理地,您可以使用上面的語法,只需要在不同的字段使用逗號進行分隔,如下所示:

C::C( double a, double b, double c): X(a), Y(b), Z(c)
{....
}

類的析構函數

類的析構函數是類的一種特殊的成員函數,它會在每次刪除所創建的對象時執行
析構函數的名稱與類的名稱是完全相同的,只是在前面加了個波浪號(~)作為前綴,它不會返回任何值,也不能帶有任何參數。析構函數有助于在跳出程序(比如關閉文件、釋放內存等)前釋放資源。

#include <iostream>using namespace std;class Line
{public:void setLength( double len );double getLength( void );Line();   // 這是構造函數聲明~Line();  // 這是析構函數聲明private:double length;
};// 成員函數定義,包括構造函數
Line::Line(void)
{cout << "Object is being created" << endl;
}
Line::~Line(void)
{cout << "Object is being deleted" << endl;
}void Line::setLength( double len )
{length = len;
}double Line::getLength( void )
{return length;
}
// 程序的主函數
int main( )
{Line line;// 設置長度line.setLength(6.0); cout << "Length of line : " << line.getLength() <<endl;return 0;
}

運行結果:

Object is being created
Length of line : 6
Object is being deleted

參考:

https://www.runoob.com/cplusplus/cpp-constructor-destructor.html
https://baike.baidu.com/item/%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0/7478717?fr=aladdin

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378575.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大學各系男生追MM的專業短信

環衛系 天氣預報&#xff1a;今天凌晨到白天有時有想你&#xff0c;下午轉大到暴想&#xff0c;預計心情將由此降低五度。受延長低氣壓帶影響&#xff0c;預計此類天氣將持續到見到你為止。 歷史系 據說最早的愛情詩是這樣寫的&#xff1a;你來自云南元謀&#xff0c;我來自北京…

scala中命名參數函數_Scala中帶有命名參數的函數

scala中命名參數函數具有命名參數的函數 (Functions with named arguments ) A function is Scala can take multiple arguments. These arguments are traditionally called in sequence while calling a function. But in Scala programming, the program is given the power…

【IT筆試面試題整理】 二叉樹任意兩個節點間最大距離

求一個二叉樹中任意兩個節點間的最大距離&#xff0c;兩個節點的距離的定義是這兩個節點間邊的個數&#xff0c; 比如某個孩子節點和父節點間的距離是1&#xff0c;和相鄰兄弟節點間的距離是2&#xff0c;優化時間空間復雜度。 一種是&#xff1a;經過根節點&#xff0c;此時只…

請問染色浴比對染色性能有影響嗎?浴比對染色的哪些性能有影響?染色親和力測定有哪些實際應用意義

2.6 染色熱力學參數 染色熱、染色熵測定方法 請問染色浴比對染色性能有影響嗎&#xff1f;浴比對染色的哪些性能有影響&#xff1f;染色親和力測定有哪些實際應用意義&#xff1f; 答&#xff1a;浴比&#xff0c;又稱液比。指紡織品與染液等的重量比例&#xff0c;即被染物重…

php排序地區,怎么在php項目中實現一個地區分類排序算法

怎么在php項目中實現一個地區分類排序算法發布時間&#xff1a;2020-12-30 16:11:30來源&#xff1a;億速云閱讀&#xff1a;86作者&#xff1a;Leah怎么在php項目中實現一個地區分類排序算法&#xff1f;相信很多沒有經驗的人對此束手無策&#xff0c;為此本文總結了問題出現的…

OpenCV實戰【2】HOG+SVM實現行人檢測

目錄HOG是什么&#xff1f;HOG vs SIFTHOG步驟HOG在檢測行人中的方式Opencv實現HOGDescriptor的構造函數&#xff1a;行人檢測HOGSVM步驟簡化版的HOG計算HOG是什么&#xff1f; 方向梯度直方圖( Histogram of Oriented Gradient, HOG )特征是一種在計算機視覺和圖像處理中用來進…

wchar_t 和 char

#include <windows.h> #include <stdio.h> //function: charTowchar //purpose:char to WCHAR 、wchar_t、LPWSTR etc void charTowchar(const char *chr, wchar_t *wchar, int size) { MultiByteToWideChar( CP_ACP, 0, chr, strlen(chr)…

坐標轉換 計算機圖形學_計算機圖形學的轉換類型

坐標轉換 計算機圖形學什么是轉型&#xff1f; (What is Transformation?) Transformation refers to the mathematical operations or rules that are applied on a graphical image consisting of the number of lines, circles, and ellipses to change its size, shape, o…

win2003 IIS6配置PHP 5.3.3(fastCGI方式+eAccelerator)+ASP.NET 4.0(MVC3)

win2003 IIS6配置PHP 5.3.3(fastCGI方式eAccelerator)ASP.NET 4.0(MVC3) 直入正題。 這個環境的部署很有講究&#xff0c;折騰了一天&#xff0c;大概說一下思路&#xff1a; 自從哪個PHP的版本開始&#xff08;5.2也不知道多少&#xff09;&#xff0c;就分了thread-safe版和n…

03-圖像特效

一、灰度處理 方法一&#xff1a;imread方法 彩色圖的顏色通道為3&#xff0c;即RGB&#xff1b;而灰度圖只有一個顏色通道。 import cv2 img0 cv2.imread(E:\Jupyter_workspace\study\data/cat.png,0) img1 cv2.imread(E:\Jupyter_workspace\study\data/cat.png,1) print…

解析linux根文件系統的掛載過程

------------------------------------------ 本文系本站原創,歡迎轉載!轉載請注明出處:http://ericxiao.cublog.cn/------------------------------------------ 一&#xff1a;前言前段時間在編譯kernel的時候發現rootfs掛載不上。相同的root選項設置舊版的image卻可以。為了…

SIFT講解(SIFT的特征點選取以及描述是重點)

目錄SIFT是什么&#xff1f;尺度空間理論SIFT特征點提取SIFT特征點描述SIFT是什么&#xff1f; SIFT ,即尺度不變特征變換( Scale-invariant feature transform&#xff0c;SIFT) ,一種特征描述方法。具有 尺度魯棒性 旋轉魯棒性 光照魯棒性 SIFT本身包括了特征點篩選及特征點…

操作系統多線程實現_操作系統中的線程實現

操作系統多線程實現Each process has an address space. There is one thread of control in every traditional OS. Sometimes, it is viable to have multiple threads of control in the similar address space which is running in quasi-parallel. Though they were separ…

mysql怎么消除冗余,mysql剔除冗余數據

mysql刪除冗余數據-- -- 1. 查詢冗余數據SELECT t.id FROM t_lifeservice_orders t WHERE t.orderStatus 2 GROUP BY t.channelCode, t.orderNum, t.orderStatus HAVING COUNT(t.orderStatus) > 1;-- -- 2. 定義刪除冗余數據存儲過程DROP PROCEDURE IF EXISTS proc_delete_…

04-圖像的形狀繪制

一、線段繪制 cv2.line(dst,(100,100),(400,400),(0,0,255),2,cv2.LINE_AA) 參數一&#xff1a;目標圖片數據 參數二&#xff1a;當前線段繪制的起始位置&#xff08;也就是兩點確定一條直線&#xff09; 參數三&#xff1a;當前線段繪制的終止位置&#xff08;也就是兩點確定…

(1-e^(-j5w))/(1-e^(-jw))=e^(-j2w)*sin(5w/2)/sin(w/2)的證明過程

問題出現&#xff1a;《數字信號處理第三版》第90頁劉順蘭版 最后一步怎么得到的&#xff1f; 思路&#xff1a;觀察答案&#xff0c;有一個自然對數項。關鍵就是如何提取出這一項。 我的證明過程如下&#xff1a; 參考鏈接&#xff1a; 【和差化積】

php 移植 arm 精簡,php5.4.5移植到arm-linux摘要,lighttpd配置

php5.4.5移植到arm-linux摘要.因為有嵌入WEB服務的需求&#xff0c;再常識了N多的開源的嵌入服務后最終選擇了lighttpd.Apache太大支了&#xff0c;而且在arm上對swf的支持不好.其他的都不怎么理想.lighttpd的移植過程就省略了。這里只摘要了PHP移植,采用fastcgi與lighttpd 協作…

05-圖像的美化

一、彩色圖片直方圖 cv2.calcHist([image],[0],None,[256],[0.0,255.0]) 該方法的所有參數都必須用中括號括起來&#xff01;&#xff01;&#xff01; 參數一&#xff1a;傳入的圖片數據 參數二&#xff1a;用于計算直方圖的通道&#xff0c;這里使用的是灰度直方圖&#xff…

java 檢查目錄是否存在_如何檢查Java目錄是否存在?

java 檢查目錄是否存在We are using the File class that is an abstract representation of file and directory path. To check if a directory exists we have to follow a few steps: 我們正在使用File類 &#xff0c;它是文件和目錄路徑的抽象表示。 要檢查目錄是否存在&a…

Eclipse for android 中設置java和xml代碼提示功能(轉)

1、設置 java 文件的代碼提示功能 打開 Eclipse 依次選擇 Window > Preferences > Java > Editor - Content Assist > Auto activation triggers for Java &#xff0c;設置框中默認是一個點&#xff0c; 現在將它改為&#xff1a; 以下為引用內容&#xff1a; .a…