深刻講授C++中的結構函數。本站提示廣大學習愛好者:(深刻講授C++中的結構函數)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻講授C++中的結構函數正文
C++結構函數
當創立一個對象時,常常須要做一些初始化任務,例如對數據成員賦值等。為懂得決這個成績,C++供給了結構函數。
結構函數(Constructor)是一種特別的成員函數,它的名字和類名雷同,沒有前往值,不須要用戶挪用(用戶也不克不及挪用),而是在創立對象時主動履行。結構函數的感化是在創立對象時停止初始化任務,最多見的就是對成員變量賦值。
一個結構函數的例子:
#include <iostream> using namespace std; class Student{ private: char *name; int age; float score; public: //聲明結構函數 Student(char *, int, float); //聲明通俗成員函數 void say(); }; //界說結構函數 Student::Student(char *name1, int age1, float score1){ name = name1; age = age1; score = score1; } //界說通俗成員函數 void Student::say(){ cout<<name<<"的年紀是 "<<age<<",成就是 "<<score<<endl; } int main(){ //依據結構函數創立對象 Student stu("小明", 15, 90.5f); //傳參情勢相似於函數挪用 stu.say(); return 0; }
運轉成果:
小明的年紀是 15,成就是 90.5
在類中我們界說了一個結構函數 Student(),它的感化是給3個 private 屬性的成員變量賦值。在 main 函數中,我們依據結構函數創立了一個對象 stu;由於結構函數有參數,所以創立對象時要響應地傳入實參,情勢相似於函數挪用。
讀者要留意:一旦在類中界說了結構函數,那末創立對象時必定會被履行;假如結構函數有參數,創立對象時就要傳參。
別的,結構函數重要用來停止初始化,沒有前往值(有前往值沒有任何意義),這就意味著:
不論是聲明照樣界說,函數名後面都不克不及湧現前往值類型,即便是 void 也不許可;
函數體中不克不及有 return 語句。
默許結構函數
假如用戶本身沒有界說結構函數,那末編譯器會主動生成一個默許的結構函數,只是這個結構函數的函數體是空的,也沒有參數,不履行任何操作。好比下面的 Student 類,默許生成的結構函數以下:
Student(){}
一個類,必需有結構函數,要末用戶本身界說,要末編譯器主動生成。一旦用戶本身界說了結構函數,不論它是 public 屬性的,照樣 private、protected 屬性的,編譯器都不再主動生成。下面的 Student 類,只要一個結構函數,就是我們本身界說的。
現實上,編譯器只要在需要的時刻才會生成默許結構函數,並且它的函數體普通不為空。默許結構函數的目標是贊助編譯器做初始化任務,而不是贊助法式員。這是C++的外部完成機制,這裡不再深究,初學者可以依照下面說的“必定有一個空函數體的默許結構函數”來懂得。
結構函數的重載
和通俗成員函數一樣,結構函數是許可重載的。一個類可以供給多個結構函數,讓用戶在創立對象時停止選擇,編譯器會依據創立對象時傳遞的參數來肯定挪用哪個結構函數。也就是說:
只要一個結構函數會被履行;
創立對象時供給的參數必需和個中的一個結構函數婚配,不然編譯毛病。
一個結構函數重載的例子:
#include <iostream> using namespace std; class Student{ private: char *name; int age; float score; public: //聲明結構函數 Student(); Student(char *, int, float); //聲明通俗成員函數 void setname(char *); void setage(int); void setscore(float); void say(); }; //界說結構函數 Student::Student(){} Student::Student(char *name1, int age1, float score1){ name = name1; age = age1; score = score1; } //界說通俗成員函數 void Student::setname(char *name1){ name = name1; } void Student::setage(int age1){ age = age1; } void Student::setscore(float score1){ score = score1; } void Student::say(){ cout<<name<<"的年紀是 "<<age<<",成就是 "<<score<<endl; } int main(){ //創立對象時初始化成員變量 Student stu1("小明", 15, 90.5f); stu1.say(); //挪用成員函數來初始化成員變量的值 Student stu2; stu2.setname("李磊"); stu2.setage(16); stu2.setscore(95); stu2.say(); return 0; }
運轉成果:
小明的年紀是 15,成就是 90.5 李磊的年紀是 16,成就是 95
類中界說了兩個結構函數,一個帶參數一個不帶參數,它們是重載關系。當依據不帶參數的結構函數創立對象時,不須要傳參,成員變量不會被初始化,所以要挪用成員函數來設置它們的值。
C++帶參數的結構函數
不帶參數的結構函數使該類的每個對象都獲得雷同的初始值。
假如願望對分歧的對象付與分歧的初始值,則須要應用帶參數的結構函數,在挪用分歧對象的結構函數時,將分歧的數據傳給結構函數,以完成分歧的初始化。
結構函數首部的普通格局為:
結構函數名(類型1 形參1, 類型2 形參2, …)
因為用戶是不克不及挪用結構函數的,是以沒法采取慣例的挪用函數的辦法給出實參。實參是在創立對象時給出的。創立對象的普通格局為:
類名 對象名(實參1, 實參2, …);
【例】有兩個長方柱,其長、寬、高分離為12, 20, 25和10, 14, 20,求它們的體積。編寫一個基於對象的法式,在類頂用帶參數的結構函數。
#include <iostream> using namespace std; class Box { public : Box(int,int,int); int volume( ); private : int height; int width; int length; }; //聲明帶參數的結構函數//聲明盤算體積的函數 Box::Box(int h,int w,int len) //在類外界說帶參數的結構函數 { height=h; width=w; length=len; } int Box::volume( ) //界說盤算體積的函數 { return (height*width*length); } int main( ) { Box box1(12,25,30); //樹立對象box1,並指定box1長、寬、高的值 cout<<"The volume of box1 is "<<box1.volume( )<<endl; Box box2(15,30,21); //樹立對象box2,並指定box2長、寬、高的值 cout<<"The volume of box2 is "<<box2.volume( )<<endl; return 0; }
法式運轉成果以下:
The volume of box1 is 9000 The volume of box2 is 9450
可以曉得:
帶參數的結構函數中的形參,其對應的實參在界說對象時給定。
用這類辦法可以便利地完成對分歧的對象停止分歧的初始化。
用參數初始化表對數據成員初始化
下面引見的是在結構函數的函數體內經由過程賦值語句對數據成員完成初始化。C++還供給另外一種初始化數據成員的辦法——參數初始化表來完成對數據成員的初始化。這類辦法不在函數體內對數據成員初始化,而是在函數首部完成。
例中界說結構函數可以改用以下情勢:
Box::Box(int h,int w,int len):height(h),width(w), length(len){ }
這類寫法便利、簡潔,特別當須要初始化的數據成員較多時更顯其優勝性。乃至可以直接在類體中(而不是在類外)界說結構函數。