【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )
文章目錄
- 類的定義 ( 頭文件引用次數(shù)控制 )
- 類的實現(xiàn) ( 構(gòu)造函數(shù) | 析構(gòu)函數(shù) )
- CMake 編譯配置
- 類測試 ( 構(gòu)造析構(gòu)調(diào)用測試 )
類的定義 ( 頭文件引用次數(shù)控制 )
類定義 , 類一般定義在一個單獨的文件中 , C++ 的文件名不像 Java 一樣必須與類名相同 , C++ 中的文件名可以與類名不相等 , 一般情況下盡量讓類名與文件名一致 ;
創(chuàng)建頭文件 , 右鍵點擊源碼路徑 , 選擇 “添加” -> “添加新項” , 彈出新建文件對話框 ;
選擇創(chuàng)建文件類型 , 選擇左側(cè) “Visual C++” 下的 “頭文件(.h)” 選項 , 然后點擊打開 , 在右側(cè)的解決方案資源管理器中修改頭文件名稱為 “Student.h” ;
頭文件引用次數(shù)控制 : Student.h 頭文件中 , 會自動生成一行代碼 #pragma once , 這是為了防止重復的引用頭文件 , 這是使用預處理方式保證這個頭文件只會被引用一次 , 這種方式很多編譯器不支持 , 常用的訪問重復引用頭文件的方法是使用宏定義 ;
//C/C++ 預處理指令, 保證頭文件只被編譯一次 #pragma once//使用宏定義的方式保證頭文件只被編譯一次 #ifndef STUDENT_H #define STUDENT_H#endif // !STUDENT_H類的定義 : 在 Student.h 中聲明該類 ; 使用 class 關鍵字聲明類 , 在其中可以定義屬性和方法 ; C++ 類中屬性和方法有三種作用域 , 分別是 private , protected, public , 如果沒有聲明作用域 , 其作用域默認是 private ; 聲明類時 , 可以聲明構(gòu)造函數(shù)和析構(gòu)函數(shù) , 這里注意 , 析構(gòu)方法名稱與構(gòu)造方法的名稱必須是一樣的 ; 具體請看如下代碼示例 ;
Student.h
//C/C++ 預處理指令, 保證頭文件只被編譯一次 #pragma once//使用宏定義的方式保證頭文件只被編譯一次 #ifndef STUDENT_H #define STUDENT_H//使用 class 關鍵字 聲明類 class Student {//默認作用域 : 如果沒有指定作用域, 其作用域默認是 private 私有的//類中的屬性定義 int age;//指定作用域 , 共有的 public ://定義構(gòu)造方法Student(int age, int id);//定義析構(gòu)函數(shù)~Student();//指定私有作用域 private:int id;//受保護的作用域 protected:int number;};#endif // !STUDENT_H類的實現(xiàn) ( 構(gòu)造函數(shù) | 析構(gòu)函數(shù) )
創(chuàng)建 Student.h 對應的 Student.cpp 文件 , 右鍵點擊源碼路徑 , 選擇 “添加” -> “添加新項” , 彈出新建文件對話框 ;
選擇創(chuàng)建文件類型 , 選擇左側(cè) “Visual C++” 下的 “C++ 文件(.cpp)” 選項 , 然后點擊打開 , 在右側(cè)的解決方案資源管理器中修改頭文件名稱為 “Student.cpp” ;
類的實現(xiàn) , 在 Student.h 頭文件中定義類之后 , 可以在 Student.cpp 中實現(xiàn)聲明的類 ; 上面已經(jīng)創(chuàng)建好了 Student.cpp 類 , 在類中先包含 Student.h 頭文件 , 然后實現(xiàn)類中聲明的構(gòu)造函數(shù)與析構(gòu)函數(shù) , 該類就可以使用了 ; 如果沒有實現(xiàn)其構(gòu)造函數(shù)與析構(gòu)函數(shù) , 直接使用該類會報錯 ;
實現(xiàn)構(gòu)造函數(shù)與析構(gòu)函數(shù) , 需要用到域作用符 , 使用 Student::Student(){...} 實現(xiàn)構(gòu)造函數(shù) , 使用 Student::~Student(){...} 實現(xiàn)析構(gòu)函數(shù) ; 此處包含 iostream 頭文件 , 和 使用 std 命名空間是為了使用 cout<<...<<endl 標準輸出流進行控制臺輸出 ;
構(gòu)造方法 , 構(gòu)造方法傳入?yún)?shù) , 構(gòu)造方法可以傳入?yún)?shù) , 其實現(xiàn)中的參數(shù)必須相同 , 調(diào)用時也必須傳入?yún)?shù)才可以 ; 在構(gòu)造方法中給成員變量賦值 , 可以使用 this->成員變量名稱 來訪問類中聲明的成員變量 ; 還有一種更簡潔的方法是在構(gòu)造方法參數(shù)后面添加 :類成員變量名 ( 參數(shù)名稱 ) , 如 Student::Student(int age, int id) 構(gòu)造方法中 , 要給 age 成員變量賦值 , 可以使用 this->age = age , 也可以使用 Student::Student(int age, int id):age(age) 方式進行賦值 , :age(age) 表示使用 age 參數(shù)給成員變量 age 賦值 , 前面括號外的 age 表示成員變量 , 后面括號中的 age 表示參數(shù) ;
析構(gòu)方法 , 析構(gòu)方法與構(gòu)造方法是成對使用的 , 在構(gòu)造方法中可能會申請內(nèi)存 ( malloc ) , 如果不釋放這塊內(nèi)存 , 就會造成內(nèi)存泄漏 , 這樣就需要在析構(gòu)方法中將構(gòu)造方法中對應的內(nèi)存釋放掉 ( free ) ; 析構(gòu)方法不要手動調(diào)用 , 其會在對象內(nèi)存釋放的時候自動調(diào)用 ;
Student.cpp
#include "Student.h" #include <iostream>using namespace std;//使用域作用符實現(xiàn)構(gòu)造方法 //方法參數(shù)后面的 :age(age) 表示使用 age 參數(shù)給成員變量 age 賦值 //前面括號外的 age 表示成員變量 , 后面括號中的 age 表示參數(shù) Student::Student(int age, int id):age(age) {//使用 this 關鍵字可以訪問類中的成員變量this->id = id;cout<< "Student() 構(gòu)造方法" <<endl; }//使用域作用符實現(xiàn)析構(gòu)方法 Student::~Student() {cout << "~Student() 析構(gòu)方法" << endl; }//只有實現(xiàn)了構(gòu)造方法和析構(gòu)方法之后 , //Student 這個類才可以拿出去使用CMake 編譯配置
CMake 編譯配置 , 上面定義了 Student.h 和 Student.cpp 兩個文件 , 需要加入到項目中并編譯 , 需要在 CMakeLists.txt 文件中進行配置 , 在 add_executable 配置項中將上面定義的兩個文件配置到其中 ;
# CMakeList.txt: 003_Object_Oriented 的 CMake 項目,在此處包括源代碼并定義 # 項目特定的邏輯。 # cmake_minimum_required (VERSION 3.8)# 將源代碼添加到此項目的可執(zhí)行文件。 add_executable (003_Object_Oriented "003_Object_Oriented.cpp" "003_Object_Oriented.h" "Student.cpp" "Student.h")# TODO: 如有需要,請?zhí)砑訙y試并安裝目標。類測試 ( 構(gòu)造析構(gòu)調(diào)用測試 )
棧內(nèi)存中 Student 類測試 , 首先包含 Student.h 頭文件 , 聲明一個 OOTest() 方法 , 在方法中直接聲明 Student 對象, student 對象處于棧內(nèi)存中 , 其作用域僅限于 OOTest 函數(shù) , OOTest 方法執(zhí)行完就會清理掉其棧內(nèi)存 ; 系統(tǒng)會自動調(diào)用 Student 類的析構(gòu)函數(shù) ;
代碼示例 :
003_Object_Oriented.cpp
執(zhí)行結(jié)果 :
Hello Student Student() 構(gòu)造方法 ~Student() 析構(gòu)方法總結(jié)
以上是生活随笔為你收集整理的【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++ 语言】Visual Studi
- 下一篇: 【C++ 语言】面向对象 ( 成员函数