類是一種資料型別,與普通的資料型別不同的是類不僅包含資料,還包含對資料的操作,類把資料和資料操作方法封裝在一起,作為乙個整體參與程式的執行。類具有可繼承性,建立乙個新的類的時候,可以在乙個基類中新增成員派生出新類。類的變數和類的例項是不同的,類的例項是動態分配的記憶體區域,通常稱類的例項維「物件」,同乙個類可以有不同的例項存在,他們個子有自己的資料,但是資料操作方法是相同的。類的變數可以看作是乙個指標,指向類的例項。
在matlab中,為了更好地進行資料的封裝,更加抽象地描述物件,也定義了類。
通常乙個類應該包含四個基本的成員函式:
建構函式 ―― 與類名相同,可以在其中完成成員初始化的工作;
顯示函式 ―― 名為display,用於顯示成員的資料;
賦值函式 ―― 名為set,用於設定類成員的數值;
取值函式 ―― 名為get,用於讀取類成員的函式。
與c++的類不同的是,matlab的類不需要特別的析構函式。如果類用到了一些特殊的內容需要釋放的話,可以編寫乙個成員函式,比如classclear,用包來釋放所占用的資源。
下面用乙個簡單的例子類介紹一些類如何使用。
先看乙個matlab中的類**:
1classdef tensiledata
2properties
3 material = 'carbon steel';
4 samplenumber = 0;
5stress
6strain
7end
8properties (dependent)
9modulus
10end
1112
methods
13function td =tensiledata(material,samplenum,stress,strain)
14if nargin > 0
15 td.material =material;
16 td.samplenumber =samplenum;
17 td.stress =stress;
18 td.strain =strain;
19end
20 end %tensiledata
21end
2223
methods
24function obj =set.material(obj,material)
25if ~(strcmpi(material,'aluminum') ||...
26 strcmpi(material,'stainless steel') ||...
27 strcmpi(material,'carbon steel'))
28 error('material must be aluminum, stainless steel, or carbon steel')
29end
30 obj.material =material;
31 end % material set function
3233
function modulus =get.modulus(obj)
34 ind = find(obj.strain > 0); %find nonzero strain
35 modulus = mean(obj.stress(ind)./obj.strain(ind));
36 end % modulus get function
3738
function obj = set.modulus(obj,~)
39 fprintf('%s%d\n','modulus is: ',obj.modulus)
40 error('you cannot set modulus explicitly');
41end
4243
function
disp(td)
44 fprintf(1,'material: %s\nsample number: %g\nmodulus: %1.5g\n',...
45td.material,td.samplenumber,td.modulus);
46 end %disp
4748
function
plot(td,varargin)
49plot(td.strain,td.stress,varargin)
50 title(['stress/strain plot for sample ',num2str(td.samplenumber)])
51 xlabel('strain %')
52 ylabel('stress (psi)')
53 end %plot
54end
5556 methods (access = 'private') %access by class members only
57function m =calcmodulus(td)
58 % over-simplified calculation of elastic modulus
59 ind = find(td.strain > 0); %find nonzero strain
60 m = mean(td.stress(ind)./td.strain(ind));
61 end %calcmodulus
62end
63 end % classdef
在上述**中,
1classdef tensiledata
2...
3 end
是定義乙個tensiledata類。**:
1properties
2 material = 'carbon steel';
3 samplenumber = 0;
4stress
5strain
6 end
是定義這個類的屬性,也就是c++中類的成員變數。但是和c++不同的是,matlab中的類定義還有乙個比較特別的地方的,就是定義依賴屬性,如下述**:
1properties (dependent)
2modulus
3 end
這表示modulus這個屬性是個依賴屬性,它的值是通過其他屬性計算得到的,其中dependent的預設屬性值為true。
它的值是通過下面函式實現的:
1 % modulus get function2function modulus =get.modulus(obj)
3 ind = find(obj.strain > 0); %find nonzero strain
4 modulus = mean(obj.stress(ind)./obj.strain(ind));
5 end
類的方法(函式)的定義是以methods ... end的的形式出現的。如下面的類方法的定義:
1methods
2function td =tensiledata(material,samplenum,stress,strain)
3if nargin > 0
4 td.material =material;
5 td.samplenumber =samplenum;
6 td.stress =stress;
7 td.strain =strain;
8end
9end
10 end
該函式塊定義了tensiledata建構函式方法。上述**中的最後乙個方法 methods (access = 'private')
中的access = 'private'表示該方法僅能被類本身訪問和修改,是個私有成員方法。其中屬性access又可分為
setaccess和getaccess,屬性值和access相同。
1function
disp(td)
2 fprintf(1,'material: %s\nsample number: %g\nmodulus: %1.5g\n',...
3td.material,td.samplenumber,td.modulus);
4 end
就表示第二行和第三行是連在一起的。
**:
如何寫乙個Stack?
1.棧是陣列 2.先進後出 3.出棧 4.入棧 手寫乙個雙向鍊錶 棧 public class stackpopandpush public stackpopandpush int lens 返回元素個數 public intsize 返回陣列長度,容量,棧資料長 private intcapaci...
譯 不用 Class,如何寫乙個類
譯文出自 掘金翻譯計畫 譯者 emilyqirabbit 校對者 allenlongbaobao,sunhaokk python 的物件模型令人難以置信的強大 實際上,你可以重寫所有 物件 或者向任何人分發奇怪的物件,並讓他們像對待正常的物件的那樣接受它。python 的物件導向是 smalltal...
如何寫乙個鍊錶
有的時候,處於記憶體中的資料並不是連續的。那麼這時候,我們就需要在 資料結構中新增乙個屬性,這個屬性會記錄下面乙個資料的位址。有了這個位址之後,所有的資料就像一條鍊子一樣串起來了,那麼這個位址屬性就起到了穿線鏈結的作用。相比較普通的線性結構,鍊錶結構的優勢是什麼呢?我們可以總結一下 1 單個節點建立...