您好,登錄后才能下訂單哦!
C++中,系統不僅會為你提供默認構造函數同時也會為你提供默認拷貝構造函數。那么拷貝構造函數是怎么一回事呢?有這么一段代碼:
People person ( "chentong", 20, "student" ); People per(person);
假設我們已經有了一個People的類,于是我們申請了一個類變量person。并且,我們對這個類變量進行了初始化。于是,我們申請了第二個類變量per,通過這種寫法,我們就相當于把person中的值全部寫到了per中去了。因為,默認拷貝構造函數使得兩個類變量指向了同一塊內存空間。默認拷貝構造函數使得per中的值指向了person中值的地址,換言之,兩個類變量指向的是同一塊內從空間,當釋放內存空間時,可能就會對同一塊內存空間進行重復釋放,這樣就會帶來內存泄露的危害。(二次釋放,有可能會把有用的值給釋放掉,所以,這樣做肯定是有危害的)
為了解決二次釋放帶來的危害,C++允許我們自己寫拷貝構造函數。一般情況下,系統會為你提供默認構造函數,但是,如果你自己寫構造函數,并且是帶參數的構造函數,那么,你必須得提供一個不帶參數的構造函數。因為,當你自己寫了帶參數的構造函數,那么系統將不會為你提供默認構造函數。否則,使用將會出錯。
這一次,我們定義兩個類,一個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調用的都是無參構造函數,但是,我想要調用有參構造函數,我該怎么做呢?我只要,
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進行初始化。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。