結構體及其成員 和 類及其物件 有什麼區別麼?

時間 2021-05-29 23:47:15

1樓:V4kst1z

寫了乙個 c語言版使用 struct 的小程式和 c++版使用class 的小程式。c 語言版的模擬了 c++ 的虛表和繼承,不大準確,直接除錯 dump 記憶體獲取內部結構來比較 struct 和 class 會更直觀。

c++// shape.h: 標準系統包含檔案的包含檔案

// 或專案特定的包含檔案。

#pragma once

#include

#include

// TODO: 在此處引用程式需要的其他標頭。

class

Shape

;class

Circle

:public

Shape

};// shape.cpp: 定義應用程式的入口點。

//#include "shape.h"

using namespace std;

Shape::Shape(int x, int y): m_x(x), m_y(y) {}

void Shape::MoveTo(int new_x, int new_y)

Circle::Circle(int x, int y, int r): Shape(x, y), m_radius(r) {}

int Circle::getDiameter() const

double Circle::calculateArea() const

void Circle::printCenter() const

int main()

class 繼承結構及虛表結構

0 | class Shape

0 | (Shape vftable pointer)

8 | int m_x

12 | int m_y

| [sizeof=16, align=8,

| nvsize=16, nvalign=8]

Vtable for Shape

Shape::_ZTV5Shape: 6 entries

0 (int0

8 (intamp; _ZTI5Shape)

16 (intShape::MoveTo

24 (intcxa_pure_virtual

32 0

40 0

0 | class Circle

0 | class Shape (primary base)

0 | (Shape vftable pointer)

8 | int m_x

12 | int m_y

16 | int m_radius

| [sizeof=24, align=8,

| nvsize=24, nvalign=8]

Vtable for Circle

Circle::_ZTV6Circle: 6 entries

0 (int0

8 (intamp; _ZTI6Circle)

16 (intShape::MoveTo

24 (intCircle::calculateArea

32 (intCircle::~Circle

40 (intCircle::~Circle

c 語言版本

#include

#include

#include

#include

typedef struct MemPrivate;

typedef struct ShapeTable;

typedef struct CircleTable;

typedef struct Shape;

typedef struct Circle;

void move_to(void* _ptr, int new_x, int new_y)

double calc_area(void* _ptr)

const static ShapeTable s_tablemove_toNULL

};const static CircleTable c_tablemove_tocalc_area

};Shape * create_shape(int x, int y)

void destory_shape(Shape* s)

double get_diameter(Circle* c)

void print_center(Circle* c)

Circle *create_circle(int x, int y, double r)

void destory_circle(Circle* c)

int main()

2樓:餘國良

從使用角度來講有兩個區別,第一struct的預設可訪問性和預設繼承形式是公有,class是私有,這還會影響到預設列表初始化函式

第二個就是struct被強制要求記憶體布局符合c語言形式,因為寫c語言的人喜歡直接根據首位址把整個結構體的記憶體資料傳送到別的執行緒程序乃至網路上,為了保證不出錯必須有這個規定,而class不要求記憶體布局形式(如果我沒記錯的話)

3樓:pulse

根據目前我淺薄的認知,我覺得兩者沒有啥本質區別。類就是結構體高階一點的名字,物件就是成員高階一點的名字。但struct會預設訪問許可權為public,在class中預設訪問許可權為private

4樓:秋褲傻

結構體和類是類似的東西。用結構體定義的變數和物件也是類似的東西。但結構體成員不知道你說的什麼東東。

物件導向的乙個思想是模組化和方法繫結。另乙個就是繼承和多型c的結構體缺少方法繫結,繼承和多型。

golang裡的結構體就加了方法繫結,但是沒有繼承,轉而選擇了mixin的方式。

5樓:rayhunter

在c++中其實沒有區別,為了相容c語言,struct預設是pulic,而class是private。但是。。。大部分程式有個預設的共識,就是POD資料型別一般用struct,可以直接memset,memcpy進行記憶體處理,而複雜的資料結構與建構函式,析構函式,虛函式,都不能直接memset,memcpy,一般用class。

機械製造及其自動化和自動化專業有什麼區別?

專業上的差異很多人回覆了。就業角度,同類學校背景 自動化的就業起點略高,而且後期上公升空間更大。機械方向基本就是搞機構,產品結構為主,起點即便在大型合資企業,也就那樣了。都是工業的基礎,都很重要,但是市場面前,就是有薪資差異。 samoc 以我校為例。機械工程及自動化是機械學院的,自動化是電控學院的...

本體和轉殖體有什麼區別呢?

淹死的一條魚 我個人認為是沒有區別的,人的性格或者是習慣等都是在成長過程中形成的。既然記憶完全一樣肉體也完全一樣。為什麼不能稱之為你呢? 塗山瓏瓏 假設兩者所有東西百分百都一樣的話,那麼唯一的區別就是思維。這是說的思維不是指思考方式,而是只個人的主觀意識,哪怕兩者完全沒有認知到另外乙個的存在,但是從...

建築類和建築學有什麼區別?

我是一條小青龍 建築學是乙個專業五年制從大一讀到大五都是建築學不會細分。建築類這名詞不是個專業。建築類專業有土木工程啊 建築學 五年 城規 五年 環藝啊啥的。 南蕭亭 同濟大學的情況 今年高考招生的大類全稱叫工科試驗班 城市建築景觀設計類 具體包括城市規劃 建築學 風景園林 歷史建築保護工程和工業設...