在類中的定義的和類名相同,并且沒有任何返回類型的Student()就是構造函數,這是一個無參數的構造函數,他在對象創建的時候自動調用,如果去掉Student()函數體內的代碼那么它和c++的默認提供的構造函數等價的。
構造函數可以帶任意多個的形式參數,這一點和普通函數的特性是一樣的!
下面我們來看一個帶參數的構造函數是如何進行對象的始化操作的。
代碼如下:
//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者
#include <iostream>
using namespace std;
class Teacher
{
public:
Teacher(char *input_name)//有參數的構造函數
{
name=new char[10];
//name=input_name;//這樣賦值是錯誤的
strcpy(name,input_name);
}
void show();
protected:
char *name;
};
void Teacher::show()
{
cout<<name<<endl;
}
void main()
{
//Teacher a;//這里是錯誤的,因為沒有無參數的構造函數
Teacher a("test");
a.show();
cin.get();
}
我們創建了一個帶有字符指針的帶有形參的Teacher(char *input_name)的構造函數,調用它創建對象的使用類名加對象名稱加擴號和擴號內參數的方式調用,這和調用函數有點類似,但意義也有所不同,因為構造函數是為創建對象而設立的,這里的意義不單純是調用函數,而是創建一個類對象。
一旦類中有了一個帶參數的構造函數而又沒無參數構造函數的時候系統將無法創建不帶參數的對象,所以上面的代碼
Teacher a;
就是錯誤的?。?!
這里還有一處也要注意:
//name=input_name;//這樣賦值是錯誤的
因為name指是指向內存堆區的,如果使用name=input_name;會造成指針指向改變不是指向堆區而是指向棧區,導致在后面調用析構函數delete釋放堆空間出錯!(析構函數的內容我們后面將要介紹)
如果需要調用能夠執行就需要再添加一個沒有參數的構造函數
對上面的代碼改造如下:
//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者
#include <iostream>
using namespace std;
class Teacher
{
public:
Teacher(char *input_name)
{
name=new char[10];
//name=input_name;//這樣賦值是錯誤的
strcpy(name,input_name);
}
Teacher()//無參數構造函數,進行函數重載
{
}
void show();
protected:
char *name;
};
void Teacher::show()
{
cout<<name<<endl;
}
void main()
{
Teacher test;
Teacher a("test");
a.show();
cin.get();
}
創建一個無闡述的同名的Teacher()無參數函數,一重載方式區分調用,由于構造函數和普通函數一樣具有重載特性所以編寫程序的人可以給一個類添加任意多個構造函數,來使用不同的參數來進行初始話對象!
本新聞共4頁,當前在第1頁 1 2 3 4