您好,登錄后才能下訂單哦!
這篇“C++面向對象中構造函數如何使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C++面向對象中構造函數如何使用”文章吧。
構造函數可以在創建對象的時候初始化成員數據,或者利用現有對象修改現有對象數據(賦值拷貝構造函數)。
自動調用,在創建對象的時候編譯器自動調用 - 構造函數名和類名相同 - 構造函數沒有返回值 - 可以有多個構造函數(類似函數重載)
默認構造函數
自定義構造函數
拷貝構造函數
賦值構造函數
沒有手動創建默認構造函數的時候,編譯器會去自動合成構造函數
合成默認構造函數使用類內初始化數據去初始化數據
如果沒有類內初始化數據,那么合成構造函數內就是空的什么都不做
默認構造函數
程序:
Student.h
#pragma once #include<iostream> #include<string> using namespace std; class Student { public: void describion(); private: // 類內初始化 // 創建對象的時候如果沒有構造函數那邊編譯器會自己合成默認構造函數并且用這些數據來初始化對象 // 編譯器和合成的默認構造函數和手動定義的默認構造函數區別是: // 編譯器合成的只會拿這些類內初始化數據去初始化對象 // 手動定義的默認構造函數如果有初始化數據的時候也可以用其他數據去覆蓋初始化數據,也就是說數據初始化的值以構造函數內為準 int age = 12; char name[20] = "bian"; string sex = "男"; };
Student.cpp
#include "Student.h" void Student::describion() { cout << this->name << " " << this->sex << " " << this->age << endl; }
main.cpp
#include "Student.h" using namespace std; int main() { Student s1; // 創建對象調用默認構造函數 s1.describion(); system("pause"); return 0; }
結果:
bian 男 12
請按任意鍵繼續. . .
手動定義的默認構造函數特點:Student::Student()
手動定義的默認構造函數和編譯器和成的默認構造函數沒太大區別。
唯一的區別:手動默認構造函數可以使用類內初始化的值,也可以不使用類內初始化的值。
程序:
Student.h
#pragma once #include<iostream> #include<string> using namespace std; class Student { public: Student(); void describion(); private: // 類內初始化 int age = 12; char name[20] = "bian"; string sex = "男"; };
Student.cpp
#include "Student.h" // 自定義默認構造函數 Student::Student() { // 使用類內初始化數據來初始化 // 其實這種就是編譯器合成默認構造函數 this->age = age; strcpy_s(this->name, 20, "bian"); this->sex = sex; /* // 使用其他數據來初始化對象,此做法會覆蓋類內初始化的設置值 this->age = 14; strcpy_s(this->name, 20, "wang"); this->sex = "女"; */ } void Student::describion() { cout << this->name << " " << this->sex << " " << this->age << endl; }
main.cpp
#include "Student.h" using namespace std; int main() { Student s1; // 創建對象調用默認構造函數 s1.describion(); system("pause"); return 0; }
結果:
bian 男 12
請按任意鍵繼續. . .
自定義帶參數的構造函數特點:Student::Student(int age, const char name)*
帶參數,可以重載。
代碼:
Student.h
#pragma once #include<iostream> #include<string> using namespace std; class Student { public: Student(); // 默認構造函數 Student(int age, const char* name); // 自定義帶參構造函數 Student(int age, const char* name, string sex); // 自定義帶參構造重載函數 void describion(); private: // 類內初始化 int age = 12; char name[20] = "bian"; string sex = "男"; };
Student.cpp
#include "Student.h" // 自定義默認構造函數 Student::Student() { // 使用類內初始化數據來初始化 // 其實這種就是編譯器合成默認構造函數 cout << __FUNCTION__ << endl; cout << "自定義默認構造函數" << endl; this->age = age; strcpy_s(this->name, 20, "bian"); this->sex = "未知"; } // 自定義帶參構造函數 Student::Student(int age, const char* name) { cout << __FUNCTION__ << endl; cout << "自定義帶參構造函數" << endl; this->age = age; strcpy_s(this->name, 20, name); } // 自定義帶參構造重載函數 Student::Student(int age, const char* name, string sex) { cout << __FUNCTION__ << endl; cout << "自定義帶參構造重載函數" << endl; this->age = age; strcpy_s(this->name, 20, name); this->sex = sex; } void Student::describion() { cout << this->name << " " << this->sex << " " << this->age << endl; cout << endl; }
main.cpp
#include "Student.h" using namespace std; int main() { Student s1; // 調用自定義默認構造函數 s1.describion(); Student s2(13, "wang"); // 調用自定義帶參構造函數 s2.describion(); Student s3(14, "gao", "女"); // 調用自定義帶參構造函數(重載) s3.describion(); system("pause"); return 0; }
結果:
Student::Student
自定義默認構造函數
bian 未知 12Student::Student
自定義帶參構造函數
wang 男 13Student::Student
自定義帶參構造重載函數
gao 女 14請按任意鍵繼續. . .
為什么會出現 wang 男 13,可以思考下這個男。答案在標題下方。
拷貝構造函數特點:Student::Student(const Student& other)
深淺拷貝是針對在堆區開辟內存的數據,深拷貝重新開辟內存存數據,淺拷貝直接把原來的堆區拿過來用
合成拷貝構造函數是編譯器自動合成的屬于淺拷貝
自定義拷貝構造函數可以實現深拷貝
Student.h
#pragma once #include<iostream> #include<string> using namespace std; class Student { public: Student(); // 默認構造函數 Student(int age, const char* name); // 自定義帶參構造函數 Student(int age, const char* name, string sex); // 自定義帶參構造重載函數 Student(const Student& other); // 拷貝構造函數 void describion(); private: // 類內初始化 int age = 12; char* name; string sex = "男"; };
Student.cpp
#include "Student.h" // 自定義默認構造函數 Student::Student() { // 使用類內初始化數據來初始化 // 其實這種就是編譯器合成默認構造函數 cout << __FUNCTION__ << endl; cout << "自定義默認構造函數" << endl; this->age = age; this->name = new char[20]; strcpy_s(this->name, 20, "bian"); this->sex = "未知"; } // 自定義帶參構造函數 Student::Student(int age, const char* name) { cout << __FUNCTION__ << endl; cout << "自定義帶參構造函數" << endl; this->age = age; this->name = new char[20]; strcpy_s(this->name, 20, name); } // 自定義帶參構造重載函數 Student::Student(int age, const char* name, string sex) { cout << __FUNCTION__ << endl; cout << "自定義帶參構造重載函數" << endl; this->age = age; this->name = new char[20]; strcpy_s(this->name, 20, name); this->sex = sex; } // 拷貝構造函數 Student::Student(const Student& other) { cout << __FUNCTION__ << endl; cout << "拷貝構造函數" << endl; // 淺拷貝,堆區地址還是以前的,其實編譯器合成的拷貝構造函數就是這個 this->age = other.age; this->name = other.name; this->sex = other.sex; // 深拷貝部分主要是堆區空間重新開辟 this->age = other.age; // 重新開辟堆區 this->name = new char[20]; strcpy_s(this->name, 20, other.name); this->sex = other.sex; } void Student::describion() { cout << this->name << " " << this->sex << " " << this->age << endl; cout << endl; }
main.cpp
#include "Student.h" using namespace std; // 拷貝構造函數調用第二種時機函數形參是值傳遞而不是引用 void test1(Student other) { cout << __FUNCTION__ << endl; cout << endl; } // 拷貝構造函數調用第三種時機返回值是值傳遞 Student test2(const Student& other) { cout << __FUNCTION__ << endl; cout << endl; return other; } int main() { Student s1; // 調用自定義默認構造函數 s1.describion(); Student s2(13, "wang"); // 調用自定義帶參構造函數 s2.describion(); Student s3(14, "gao", "女"); // 調用自定義帶參構造函數(重載) s3.describion(); // 拷貝構造函數:調用時機1、利用已有對象創建新對象 Student s4 = s2; s4.describion(); Student s5(s3); s5.describion(); // 拷貝構造函數:調用時機2、函數參數的值傳遞 test1(s5); // 拷貝構造函數:調用時機3、函數返回值的值傳遞 test2(s5); cout << endl; // 拷貝構造函數:代用時機4、數組值時對象 Student s6[2] = { s1, s2 }; system("pause"); return 0; }
結果:
Student::Student
自定義默認構造函數
bian 未知 12Student::Student
自定義帶參構造函數
wang 男 13Student::Student
自定義帶參構造重載函數
gao 女 14Student::Student
拷貝構造函數
wang 男 13Student::Student
拷貝構造函數
gao 女 14Student::Student
拷貝構造函數
test1test2
Student::Student
拷貝構造函數Student::Student
拷貝構造函數
Student::Student
拷貝構造函數
請按任意鍵繼續. . .
結果解析:
程序演示已經在自定義拷貝構造函數中寫了。
使用已有對象創建新對象
函數參數是對象值傳遞
函數返回值是對象值傳遞
數組成員是對象
賦值構造函數特點:Student& operator=(const Student& other)
利用已有對象修改已有對象(f2 = f1;)
重載=運算符
程序:
Student.h
#pragma once #include<iostream> #include<string> using namespace std; class Student { public: Student(); // 默認構造函數 Student(int age, const char* name); // 自定義帶參構造函數 Student(int age, const char* name, string sex); // 自定義帶參構造重載函數 Student(const Student& other); // 拷貝構造函數 Student& operator=(const Student& other); // 賦值拷貝構造函數 void describion(); private: // 類內初始化 int age = 12; char* name; string sex = "男"; };
Student.cpp
#include "Student.h" // 自定義默認構造函數 Student::Student() { // 使用類內初始化數據來初始化 // 其實這種就是編譯器合成默認構造函數 cout << __FUNCTION__ << endl; cout << "自定義默認構造函數" << endl; this->age = age; this->name = new char[20]; strcpy_s(this->name, 20, "bian"); this->sex = "未知"; } // 自定義帶參構造函數 Student::Student(int age, const char* name) { cout << __FUNCTION__ << endl; cout << "自定義帶參構造函數" << endl; this->age = age; this->name = new char[20]; strcpy_s(this->name, 20, name); } // 自定義帶參構造重載函數 Student::Student(int age, const char* name, string sex) { cout << __FUNCTION__ << endl; cout << "自定義帶參構造重載函數" << endl; this->age = age; this->name = new char[20]; strcpy_s(this->name, 20, name); this->sex = sex; } // 拷貝構造函數 Student::Student(const Student& other) { cout << __FUNCTION__ << endl; cout << "拷貝構造函數" << endl; // 淺拷貝,堆區地址還是以前的 //this->age = other.age; //this->name = other.name; //this->sex = other.sex; // 深拷貝部分主要是堆區空間重新開辟 this->age = other.age; // 重新開辟堆區 this->name = new char[20]; strcpy_s(this->name, 20, other.name); this->sex = other.sex; } // 賦值拷貝構造函數 Student& Student::operator=(const Student& other) { cout << __FUNCTION__ << endl; cout << "賦值拷貝構造函數" << endl; if (this == &other) { return *this; // 防止出現f1=f1 } // 淺拷貝,堆區地址還是以前的 //this->age = other.age; //this->name = other.name; //this->sex = other.sex; // 深拷貝部分主要是堆區空間重新開辟 this->age = other.age; // 重新開辟堆區 this->name = new char[20]; strcpy_s(this->name, 20, other.name); this->sex = other.sex; return *this; } void Student::describion() { cout << this->name << " " << this->sex << " " << this->age << endl; cout << endl; }
main.cpp
#include "Student.h" using namespace std; int main() { Student s1(14, "gao", "女"); // 調用自定義帶參構造函數(重載) s1.describion(); // 調用賦值拷貝構造函數 Student s2; s2.describion(); s2 = s1; s2.describion(); system("pause"); return 0; }
結果:
Student::Student
自定義帶參構造重載函數
gao 女 14Student::Student
自定義默認構造函數
bian 未知 12Student::operator =
賦值拷貝構造函數
gao 女 14請按任意鍵繼續. . .
1、當存在類內初始值的時候,除了賦值拷貝構造函數外,其他的構造函數(默認構造函數、自定義參數構造函數、拷貝構造函數)在執行構造函數前都會先執行下數據初始值。
2、初始化列表只存在構造函數中(成員數據、父類對象可以使用初始化列表初始化)。
以上就是關于“C++面向對象中構造函數如何使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。