C++中結構體與類的區別
阿新 • • 發佈:2018-12-26
學習了C++的面向物件,最常見的和寫的就是類結構體,下面主要介紹一下結構體和類的區別。
首先類是C++中面向物件獨有的,但是C和C++中都有結構體,下面我們來看一下C和C++中結構體的區別。這裡主要從封裝、多型、繼承、封裝和訪問許可權幾個方面來說。
1、C和C++中結構體的區別
(1)多型:C的結構體內不允許有函式存在,但是有預設的建構函式,就是把所有的成員屬性設定為0,不能自定義。但是C的結構體是沒有建構函式、解構函式、和this指標的,所以沒有多型而言;C++允許有內部成員函式,且允許該函式是虛擬函式可以多型。
(2)繼承:C語言的結構體是不可以繼承的,C++的結構體是可以從其他的結構體或者類繼承過來的,和類一樣,實現了程式碼的複用。
(3)封裝:C的結構體只是把資料變數給包裹起來了,並不涉及演算法,是一種“複合型別”,其功能基本與int ,double的用法相同,它主要解決多型別問題。而C++中是把資料變數及對這些資料變數的相關演算法給封裝起來,並且給對這些資料和類不同的訪問許可權。
(4)訪問許可權: C的結構體對內部成員變數的訪問許可權只能是public,而C++允許public,protected,private三種。
以上三點都是表面的區別,實際區別就是面向過程和麵向物件程式設計思路的區別。
2.C++的結構體和C++類的區別
主要是訪問許可權的區別:
(1)C++結構體內部成員變數及成員函式預設的訪問級別是public,而c++類的內部成員變數及成員函式的預設訪問級別是private。
首先類是C++中面向物件獨有的,但是C和C++中都有結構體,下面我們來看一下C和C++中結構體的區別。這裡主要從封裝、多型、繼承、封裝和訪問許可權幾個方面來說。
1、C和C++中結構體的區別
(1)多型:C的結構體內不允許有函式存在,但是有預設的建構函式,就是把所有的成員屬性設定為0,不能自定義。但是C的結構體是沒有建構函式、解構函式、和this指標的,所以沒有多型而言;C++允許有內部成員函式,且允許該函式是虛擬函式可以多型。
(2)繼承:C語言的結構體是不可以繼承的,C++的結構體是可以從其他的結構體或者類繼承過來的,和類一樣,實現了程式碼的複用。
(3)封裝:C的結構體只是把資料變數給包裹起來了,並不涉及演算法,是一種“複合型別”,其功能基本與int ,double的用法相同,它主要解決多型別問題。而C++中是把資料變數及對這些資料變數的相關演算法給封裝起來,並且給對這些資料和類不同的訪問許可權。
(4)訪問許可權:
以上三點都是表面的區別,實際區別就是面向過程和麵向物件程式設計思路的區別。
2.C++的結構體和C++類的區別
主要是訪問許可權的區別:
(1)C++結構體內部成員變數及成員函式預設的訪問級別是public,而c++類的內部成員變數及成員函式的預設訪問級別是private。
(2) C++結構體的繼承預設是public,而c++類的繼承預設是private。
例項程式碼:
執行結果:#include <iostream> #include <string.h> using namespace std; struct student{ public: int ID; void function() { cout<<"The function is in struct! C++"<<endl; } virtual void show() { cout<<"virtual show student"<<endl; } int get_score() { return score; } student() { ID=10; age=20; score=88; cout<<"Construct student"<<endl; } protected: int age; private: int score; }; struct student1:public student { public: char *name; student1() { name=new char[3]; strcpy(name,"ky"); cout<<"Construct student1 :"<<name<<endl; } void show() { cout<<"virtual in student1"<<endl; } ~student1() { delete name; name=NULL; cout<<"~student1"<<endl; } }; int main() { student1 s1; //先執行父結構體的建構函式,在執行自己的; student s; //沒有繼承就直接執行自己的; s.show(); s1.show(); s.function(); cout<<"ID:"<<s.ID<<" NAME: "<<s1.name<<endl; cout<<"score: "<<s1.get_score()<<endl; s1.~student1(); system("pause"); return 0; }