91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++面向對象中構造函數如何使用

發布時間:2022-10-27 16:32:00 來源:億速云 閱讀:156 作者:iii 欄目:開發技術

這篇“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 未知 12

    Student::Student
    自定義帶參構造函數
    wang 男 13

    Student::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 未知 12

    Student::Student
    自定義帶參構造函數
    wang 男 13

    Student::Student
    自定義帶參構造重載函數
    gao 女 14

    Student::Student
    拷貝構造函數
    wang 男 13

    Student::Student
    拷貝構造函數
    gao 女 14

    Student::Student
    拷貝構造函數
    test1

    test2

    Student::Student
    拷貝構造函數

    Student::Student
    拷貝構造函數
    Student::Student
    拷貝構造函數
    請按任意鍵繼續. . .

    結果解析:

    C++面向對象中構造函數如何使用

    拷貝構造函數的調用時間

    程序演示已經在自定義拷貝構造函數中寫了。

    • 使用已有對象創建新對象

    • 函數參數是對象值傳遞

    • 函數返回值是對象值傳遞

    • 數組成員是對象

    賦值構造函數(operator=)

    賦值構造函數特點: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 女 14

    Student::Student
    自定義默認構造函數
    bian 未知 12

    Student::operator =
    賦值拷貝構造函數
    gao 女 14

    請按任意鍵繼續. . .

    特別注意

    1、當存在類內初始值的時候,除了賦值拷貝構造函數外,其他的構造函數(默認構造函數、自定義參數構造函數、拷貝構造函數)在執行構造函數前都會先執行下數據初始值。

    C++面向對象中構造函數如何使用

    2、初始化列表只存在構造函數中(成員數據、父類對象可以使用初始化列表初始化)。

    以上就是關于“C++面向對象中構造函數如何使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    c++
    AI

    万载县| 定结县| 宁都县| 黔西县| 谢通门县| 阿巴嘎旗| 边坝县| 广元市| 班戈县| 东港市| 漾濞| 古蔺县| 灯塔市| 孟津县| 巴马| 巢湖市| 绥宁县| 乌鲁木齐县| 长治市| 横峰县| 黄梅县| 理塘县| 连城县| 济南市| 兖州市| 衡山县| 神农架林区| 那坡县| 宜章县| 龙游县| 长宁区| 灌阳县| 灵宝市| 长乐市| 正定县| 年辖:市辖区| 湛江市| 平顺县| 广宁县| 刚察县| 嘉禾县|