C++中,系統不只會爲你提供默認構造函數同時也會爲你提供默認拷貝構造函數。那麼拷貝構造函數是怎麼一回事呢?有這麼一段代碼:
ide
People person ( "chentong", 20, "student" ); People per(person);
假設咱們已經有了一個People的類,因而咱們申請了一個類變量person。而且,咱們對這個類變量進行了初始化。因而,咱們申請了第二個類變量per,經過這種寫法,咱們就至關於把person中的值所有寫到了per中去了。由於,默認拷貝構造函數使得兩個類變量指向了同一塊內存空間。默認拷貝構造函數使得per中的值指向了person中值的地址,換言之,兩個類變量指向的是同一塊內從空間,當釋放內存空間時,可能就會對同一塊內存空間進行重複釋放,這樣就會帶來內存泄露的危害。(二次釋放,有可能會把有用的值給釋放掉,因此,這樣作確定是有危害的)函數
爲了解決二次釋放帶來的危害,C++容許咱們本身寫拷貝構造函數。通常狀況下,系統會爲你提供默認構造函數,可是,若是你本身寫構造函數,而且是帶參數的構造函數,那麼,你必須得提供一個不帶參數的構造函數。由於,當你本身寫了帶參數的構造函數,那麼系統將不會爲你提供默認構造函數。不然,使用將會出錯。this
這一次,咱們定義兩個類,一個People類,一個Student類。
內存
class People { private: char* name; int age; public: People() { } People(char* name, int age) { this->name = name; this->age = age; cout << "name = " << this->name << endl; cout << "age = " << this->age << endl; } //拷貝構造函數 People(People& per) { this->name = per.name; this->age = per.age; } void SetName(char* name) { this->name = name; } void SetAge(int age) { this->age = age; } };
class Student { private: People father;//調用無參構造函數 People mother;//調用有參構造函數 int student_id; public: Student() { } Student(int student_id, char* father, char* mother, int father_age = 42, int mother_age = 41){ this->student_id = student_id; } void PrintInfo() { }
如今我想要使用這些參數來構造個人類變量father和類變量mother。我該怎麼作呢?很明顯我所構造的類變量father和mother調用的都是無參構造函數,可是,我想要調用有參構造函數,我該怎麼作呢?我只要,
it
Student(int student_id, char* father, char* mother, int father_age = 42, int mother_age = 41 ) : father ( father, father_age ), mother ( mother, mother_age )
在構造函數參數列表的外面,加上一個冒號,而後,把相應類變量的參數傳進去。那麼假如我先對類變量mother進行初始化,再對類變量father進行初始化,這樣會有影響嗎?固然不會,初始化的先後順序並不會影響初始化的結果。由於,咱們在建立類變量時,先建立的是類變量father,而後是mother,因此,無論你先對哪一個類變量進行初始化,系統都是先對father進行初始化。
class