在C++中,一般定義一個對象之後,我們最好是能夠將其初始化,使他有一個確定的初始狀態,這樣能避免很多不確定因素,那麼在C++中是如何做的呢?
這時候就需要引入建構函式的概念了。
一、所謂建構函式
C++中的類可以定義和類名相同的特殊成員函數,這種函數就叫做建構函式。
注意:定義建構函式的時候可以有參數的,但是定義的建構函式不能有返回值的
但是,但是在建構函式中是可以有return語句的。
舉個例子:
#include <iostream>using namespace std;class example{public:example(int m){x = y = m;}int print_value(void){cout<<"x = "<<x<<" y = "<<y<<endl;return 0;}private:int x;int y;};int main(int argc,char** argv){example exam1(1);example exam2 = 2;exam1.print_value();exam2.print_value();return 0;}
二、建構函式的調用
1.一般情況下C++編譯器會自動建構函式
2.特殊情況下需要手動調用建構函式
舉例如下:
#include <iostream>using namespace std;class example{public:example(int m){x = y = m;}int print_value(void){cout<<"x = "<<x<<" y = "<<y<<endl;return 0;}private:int x;int y;};int main(int argc,char** argv){example exam1(1);//自動調用example exam2 = 2;//自動調用example exam3 = example(3);//手動調用exam1.print_value();exam2.print_value();exam3.print_value();return 0;}
三、建構函式和成員函數都是可以重載的,重載規則相同。
四、兩個特殊的建構函式
1.無參數建構函式
當類中沒有定義建構函式時,,編譯器預設提供一個無參 編譯器預設提供一個無參
建構函式,,並且其函數體為空白。
2.拷貝建構函式
當類中沒有定義拷貝建構函式時,,編譯器預設提供一個 編譯器預設提供一個
拷貝建構函式,,簡單的進行成員變數的值複製。不進行空間的開闢
一個執行個體:數組類的建立
main.cpp
#include <iostream>#include "array.h"using namespace std;int main(int argc, char** argv){ARRAY array1(5);//建立對象,並且初始化對象為5個元素for(int i = 0;i < 5; i ++){array1.Set_Data(i,-i); //給數組賦值}for(int i = 0; i < 5; i ++){cout<<"i = "<<array1.Get_Data(i)<<endl;//列印數組的值}Destroy();//釋放記憶體return 0;}
array.cpp
#include "array.h"ARRAY::ARRAY(int length){if(length < 0){length = 0;}m_length = length;m_space = new int[m_length];}ARRAY::ARRAY(const ARRAY& obj){m_length = obj.m_length;m_space = new int[m_length];for(int i = 0;i < m_length;i ++){m_space[i] = obj.m_space[i];}}int ARRAY::Get_Data(int index){return m_space[index];}void ARRAY::Set_Data(int index,int value){m_space[index] = value;}int ARRAY::Length(){return m_length;}void ARRAY::Destroy(){m_length = -1;delete[] m_space;}
array.h
#ifndef __ARRAY_H_#define __ARRAY_H_class ARRAY{public:ARRAY(int length);ARRAY(const ARRAY& obj);int Get_Data(int index);void Set_Data(int index,int value);int Length();void Destroy();private:int m_length;int* m_space;};#endif