点滴记录。
//事務(wù)處理不管如何,必定要獲得事務(wù)是否正確的標(biāo)志,還要根據(jù)標(biāo)志執(zhí)行或回滾。
// 1.如sqllite這里到最后設(shè)置成功標(biāo)志,并且無論如何會(huì)執(zhí)行db.endTransaction();來進(jìn)行判斷,執(zhí)行還是回滾。
//2.還有mysql ,最后幾條語句直接根據(jù)系統(tǒng)的錯(cuò)誤標(biāo)志來進(jìn)行判斷執(zhí)行還是回滾。
進(jìn)程和線程
所有的一切的根源是cpu太快。其他慢資源,如顯卡,聲卡等,更別說人類的操作,顯得是蝸牛的速度, 所以讓人類同時(shí)發(fā)出命令。 如阻塞了聲卡,那么讓不需要聲卡的進(jìn)程用下cpu跑下。
所以劃分內(nèi)存,劃分現(xiàn)場(chǎng)。來執(zhí)行不同的程序。讓人看起來是同時(shí)執(zhí)行。這就是進(jìn)程。分配了內(nèi)存和cpu,這就是所謂進(jìn)程是資源分配的最小單位
而cpu還是太快,進(jìn)程有時(shí)候會(huì)阻塞(等待網(wǎng)絡(luò)或其他資源),就算有多個(gè),但是cpu實(shí)在太快。很多進(jìn)程同時(shí)執(zhí)行,在cpu看來,還有很多時(shí)間是在空轉(zhuǎn)。
而可以配合cpu把資源利用起來的有一個(gè)是內(nèi)存。 內(nèi)存一般不會(huì)用滿。所以cpu+內(nèi)存。這個(gè)組合可以把cpu有效的利用起來,
所以進(jìn)程可以開多個(gè)線程,尤其是單核時(shí)代,在等 IO 的時(shí)候,一般會(huì)手動(dòng)開一個(gè)線程。利用cpu和內(nèi)存來計(jì)算。
而到了多核時(shí)代,開線程就非常必要了。從硬件上面cpu直接開掛了。同時(shí)運(yùn)行。
所以線程是CPU調(diào)度的最小單位,在進(jìn)程中隨便開幾個(gè)線程是沒有問題的。
開線程后你把程序還理解為在一個(gè)線程在運(yùn)行也是可以的。只要注意把內(nèi)存保護(hù)好就可以。線程間沒有任何內(nèi)存隔離保護(hù)的。
所以如果要安全的話:
共享數(shù)據(jù)建議必須都用類封裝。提供方法。可以清晰在多線程環(huán)境下進(jìn)行。可以考慮定義一個(gè)接口類,所有進(jìn)程的參數(shù)必須實(shí)現(xiàn)這個(gè)接口。就可以了。哈哈。而且進(jìn)一步定義一個(gè)線程的接口類ithread。規(guī)定參數(shù)。
程序中必須使用 實(shí)現(xiàn)了ithread的線程。
可以隱喻為一個(gè)厲害的導(dǎo)演同時(shí)導(dǎo)演幾部不同風(fēng)格的電影。而且導(dǎo)演在拍一個(gè)電影的同時(shí),變拍戲邊炒菜。邊說這個(gè)演員往里走走,邊給爐子加火。 只要注意炒菜別用到劇組資源,否則加個(gè)鎖,讓劇組和導(dǎo)演線性使用爐子。
不同風(fēng)格的電影就是不同的進(jìn)程,吵菜等就是線程,炒菜不利用劇組緊張資源。
for 用于循環(huán)次數(shù)不變,而且最好從0開始,任何時(shí)候都表示次數(shù),和邏輯不掛鉤。需要反序的話,自己用大數(shù)減i,
次數(shù)變化的用while處理。邏輯更簡(jiǎn)潔。i就表示具體的業(yè)務(wù)數(shù)值了。
//recursion 和 循環(huán)的區(qū)別,除了性能和簡(jiǎn)潔之外。
//recursion 還可以有一個(gè)回退上層的動(dòng)作。如果需要回退上層再做一點(diǎn)事情,特別是必須從底往上的工作。那么recursion是非常合適的。聯(lián)想到平衡樹的插入之后檢查平衡的操作。
//如果不需要回退做任何工作。也就是尾遞歸。那么就用循環(huán)。
關(guān)于尾遞歸的詳細(xì)介紹:
https://baike.sogou.com/v162175.htm?fromTitle=%E5%B0%BE%E9%80%92%E5%BD%92
要滿足
1.遞歸在最后的語句,并且無任何動(dòng)作。
2.即回歸無動(dòng)作,因?yàn)檠h(huán)是前進(jìn)的,無法回撤到中途某現(xiàn)場(chǎng)。
具體可以看鏈接的例子。來思考1*2*3*4*5 的一般遞歸寫法和尾遞歸寫法。一般寫法是到最后一層才開始計(jì)算。而尾遞歸是中途就開始計(jì)算。到最后一層計(jì)算完畢。直接返回,重點(diǎn),直接返回最終結(jié)果了。
return MyArrayList.this.theData[Index++];
是一個(gè)很好的后++的例子。next 需要返回某個(gè)item后,自動(dòng)移動(dòng)當(dāng)前索引哨兵。 也說明了沒有太多東西是必要的。但是掌握后,可以簡(jiǎn)潔有效。
//基于棧的特點(diǎn)和堆的特點(diǎn),決定了,在函數(shù)內(nèi)部是否需要new.
//清棧是函數(shù)離開自動(dòng)清,所以盡量用棧.但是共享數(shù)據(jù)必須new,如給多個(gè)類使用(一般共享指針).
//棧大小默認(rèn)都不大.小于1m.因此,大數(shù)據(jù),如稍大的數(shù)組,必須new(一般共享指針).
//編譯器要求入棧必須確定棧的大小.可變的數(shù)組也必須new(一般用vector,數(shù)據(jù)是堆中的)
//由以上幾點(diǎn),可推導(dǎo)出特殊需求,如共享一個(gè)可變數(shù)據(jù).那么就是vector的共享指針.
//同理在類內(nèi)部,由于不能確定類對(duì)象是否會(huì)被new,還是在棧中.也要避免棧的缺點(diǎn).
//共享數(shù)據(jù)必須在外部new,類只需要包含指針。
//稍大的數(shù)組,必須new,析構(gòu)函數(shù)delete
//可變的數(shù)組也必須new(一般用vector,數(shù)據(jù)是堆中的)
//如果是類內(nèi)部new,那么必須析構(gòu)delete
//一些外部api,一般需要的是指針,是堆指針還是棧指針,還是依據(jù)上面原則。
//有一些特殊,如這個(gè)api,是一個(gè)異步的處理。異步的回調(diào),又傳出了這個(gè)指針,那么必須是new,要是堆中的。
1,windows下 ,c++ ,
,其實(shí)還是會(huì)插入
2.
因?yàn)橄到y(tǒng)提供的默認(rèn)拷貝構(gòu)造函數(shù)工作方式是內(nèi)存拷貝,也就是淺拷貝。如果對(duì)象中用到了需要手動(dòng)釋放的對(duì)象,則會(huì)出現(xiàn)問題,這時(shí)就要手動(dòng)重載拷貝構(gòu)造函數(shù),實(shí)現(xiàn)深拷貝。
下面說說深拷貝與淺拷貝:
淺拷貝:如果復(fù)制的對(duì)象中引用了一個(gè)外部內(nèi)容(例如分配在堆上的數(shù)據(jù)),那么在復(fù)制這個(gè)對(duì)象的時(shí)候,讓新舊兩個(gè)對(duì)象指向同一個(gè)外部內(nèi)容,就是淺拷貝。(指針雖然復(fù)制了,但所指向的空間內(nèi)容并沒有復(fù)制,而是由兩個(gè)對(duì)象共用).
2.int out 的參照物的內(nèi)存。所以out 是從內(nèi)存寫入到輸出設(shè)備。 in是從外部讀入到內(nèi)存。
int main()
{
sales lulu=sales();
sales fun();// 從語法上看是定義了一個(gè)名為fun,返回值為sales的無參數(shù)函數(shù)。
sales lulu2=fun();
sales lulu3;
cout<<lulu.GetSalary()<<endl;
cout<<lulu2.GetSalary()<<endl;
cout<<lulu3.GetSalary()<<endl;
//lulu.Getjob(1000,3000);
return 0;
}
sales fun()
{
sales a;
return a;
}
聲明為explicit的構(gòu)造函數(shù)不能在隱式轉(zhuǎn)換中使用
對(duì)比一下blockcode 和手工編譯的命名就可以知道以后怎么處理了。
構(gòu)造函數(shù)的,初始化的參數(shù)是輸入構(gòu)造參數(shù)的,不是說里面生成一個(gè)對(duì)象,在復(fù)制過去。
//多線程。
1)共享數(shù)據(jù)建議必須都用類封裝。提供方法。可以清晰在多線程環(huán)境下進(jìn)行。
3)
socket 是雙向通訊
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <string.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main()
{
int status;
int socketNo[2];
status=socketpair(AF_LOCAL,SOCK_STREAM,0,socketNo);
if(status==-1)
{
//printf("error:%s",strerror(errno));
printf("hihi");
}
else
{
cout<<socketNo[0]<<socketNo[1]<<endl;
}
status=write(socketNo[1],"hi",2);
if(status==0)
{
cout<<"error wirte"<<endl;
}
else
{
cout<<status<<endl;
}
char readStr[10];
status= read(socketNo[0],readStr,10);
if(status==0)
{
cout<<"error wirte"<<endl;
}
else
{
readStr[9]=0x0;
cout<<readStr<<endl;
}
status=write(socketNo[0],"hi, tow",10);
if(status==0)
{
cout<<"error wirte"<<endl;
}
else
{
cout<<status<<endl;
}
status= read(socketNo[1],readStr,10);
if(status==0)
{
cout<<"error wirte"<<endl;
}
else
{
readStr[9]=0x0;
cout<<readStr<<endl;
}
status= read(socketNo[1],readStr,10);
if(status==0)
{
cout<<"error wirte"<<endl;
}
else
{
readStr[9]=0x0;
cout<<readStr<<endl;
}
close(socketNo[0]);
close(socketNo[1]);
}
利用socket編程。如果使用tcp/ip協(xié)議棧,不需要考慮數(shù)據(jù)丟失,重復(fù),順序,和溢出。onreceive 原則上是接受完了一個(gè)發(fā)送,才會(huì)給系統(tǒng)的。所以丟包不是上層程序會(huì)接觸到的。
幾本好書, 匯編原理, unix網(wǎng)絡(luò)編程.effect c++.簡(jiǎn)明,詳細(xì)又深入.
1)socket下(短連接)一般編寫思路順序。
1.對(duì)象成員數(shù)據(jù)和方法。 涉及的收發(fā)消息格式。send并shutdown.
2.后臺(tái)線程的方法,涉及的收發(fā)消息格式。send并shutdown.
3.非阻塞下io的接收,涉及的收消息格式。receive 并function .
2)socket 下排錯(cuò)。
1.先檢查客戶和服務(wù)端的內(nèi)存數(shù)據(jù)。
2)再查看socket的收發(fā)狀態(tài)。
要這樣
vector<Book> mybooks=bookManager.GetmyBooks();
vector<Book>::iterator ret= MyFind(mybooks.begin(),mybooks.end());
千萬不能.
vector<Book>::iterator ret= MyFind(bookManager.GetmyBooks().begin(),bookManager.GetmyBooks().end());
mysql
PK:primary key 主鍵
NN:not null 非空
UQ:unique 唯一索引
BIN:binary 二進(jìn)制數(shù)據(jù)(比text更大)
UN:unsigned 無符號(hào)(非負(fù)數(shù))
ZF:zero fill 填充0 例如字段內(nèi)容是1 int(4), 則內(nèi)容顯示為0001
AI:auto increment 自增
g:所謂Cenerated Column,就是數(shù)據(jù)庫中這一列由其他列計(jì)算而得
MySQL 數(shù)據(jù)類型中的 integer types 有點(diǎn)奇怪。你可能會(huì)見到諸如:int(3)、int(4)、int(8) 之類的 int 數(shù)據(jù)類型。剛接觸 MySQL 的時(shí)候,我還以為 int(3) 占用的存儲(chǔ)空間比 int(4) 要小, int(4) 占用的存儲(chǔ)空間比 int(8) 小。
后來,參看 MySQL 手冊(cè),發(fā)現(xiàn)自己理解錯(cuò)了。
| 代碼如下 | 復(fù)制代碼 |
|
int(M): M indicates the maximum display width for integer types. |
|
在 integer 數(shù)據(jù)類型中,M 表示最大顯示寬度。
原來,在 int(M) 中,M 的值跟 int(M) 所占多少存儲(chǔ)空間并無任何關(guān)系。 int(3)、int(4)、int(8) 在磁盤上都是占用
4 btyes 的存儲(chǔ)空間。說白了,除了顯示給用戶的方式有點(diǎn)不同外,int(M) 跟 int 數(shù)據(jù)類型是相同的。
另外,int(M) 只有跟 zerofill 結(jié)合起來,才能使我們清楚的看到不同之處。
| 代碼如下 | 復(fù)制代碼 |
|
mysql> drop table if exists t; mysql> select * from t; mysql> alter table t change column id id int(3) zerofill; mysql> select * from t; mysql> mysql> select * from t; mysql> mysql> select * from t; |
|
從上面的測(cè)試可以看出,“(M)”指定了 int 型數(shù)值顯示的寬度,如果字段數(shù)據(jù)類型是 int(4),則:當(dāng)顯示數(shù)值 10 時(shí),在左邊要補(bǔ)上
“00”;當(dāng)顯示數(shù)值 100 是,在左邊要補(bǔ)上“0”;當(dāng)顯示數(shù)值 1000000 時(shí),已經(jīng)超過了指定寬度“(4)”,因此按原樣輸出。
在使用 MySQL 數(shù)據(jù)類型中的整數(shù)類型(tinyint、smallint、 mediumint、 int/integer、bigint)時(shí),非特殊需求下,在數(shù)據(jù)類型后加個(gè)“(M)”,我想不出有何意義。
下面補(bǔ)充一下數(shù)據(jù)類型
1、整型
| MySQL數(shù)據(jù)類型 | 含義(有符號(hào)) |
| tinyint(m) | 1個(gè)字節(jié) 范圍(-128~127) |
| smallint(m) | 2個(gè)字節(jié) 范圍(-32768~32767) |
| mediumint(m) | 3個(gè)字節(jié) 范圍(-8388608~8388607) |
| int(m) | 4個(gè)字節(jié) 范圍(-2147483648~2147483647) |
| bigint(m) | 8個(gè)字節(jié) 范圍(+-9.22*10的18次方) |
取值范圍如果加了unsigned,則最大值翻倍,如tinyint unsigned的取值范圍為(0~256)。
int(m)里的m是表示SELECT查詢結(jié)果集中的顯示寬度,并不影響實(shí)際的取值范圍,沒有影響到顯示的寬度,不知道這個(gè)m有什么用。
2、浮點(diǎn)型(float和double)
| MySQL數(shù)據(jù)類型 | 含義 |
| float(m,d) | 單精度浮點(diǎn)型 8位精度(4字節(jié)) m總個(gè)數(shù),d小數(shù)位 |
| double(m,d) | 雙精度浮點(diǎn)型 16位精度(8字節(jié)) m總個(gè)數(shù),d小數(shù)位 |
設(shè)一個(gè)字段定義為float(5,3),如果插入一個(gè)數(shù)123.45678,實(shí)際數(shù)據(jù)庫里存的是123.457,但總個(gè)數(shù)還以實(shí)際為準(zhǔn),即6位。
3、定點(diǎn)數(shù)
浮點(diǎn)型在數(shù)據(jù)庫中存放的是近似值,而定點(diǎn)類型在數(shù)據(jù)庫中存放的是精確值。
decimal(m,d) 參數(shù)m<65 是總個(gè)數(shù),d<30且 d<m 是小數(shù)位。
4、字符串(char,varchar,_text)
| MySQL數(shù)據(jù)類型 | 含義 |
| char(n) | 固定長度,最多255個(gè)字符 |
| varchar(n) | 固定長度,最多65535個(gè)字符 |
| tinytext | 可變長度,最多255個(gè)字符 |
| text | 可變長度,最多65535個(gè)字符 |
| mediumtext | 可變長度,最多2的24次方-1個(gè)字符 |
| longtext | 可變長度,最多2的32次方-1個(gè)字符 |
5.一個(gè)大坑。
使用類庫,類庫盡量不要存在靜態(tài)變量。非要使用,靜態(tài)變量的定義在類庫項(xiàng)目中。
盡量在大思路,大框架基本無盲點(diǎn)后開始項(xiàng)目開發(fā)。
選擇方案時(shí),盡量模擬2個(gè)方法的得失,最關(guān)鍵是必須驗(yàn)證可行。有時(shí)候冗余的方案,對(duì)于邏輯上反而更簡(jiǎn)潔。
如果時(shí)間緊迫,也必須在開發(fā)模塊時(shí),
1)把模塊的輸入,輸出壓縮到最小,
2)復(fù)雜的需求,分開做出幾個(gè)模塊,不要做大而全的模塊。特別是在需求會(huì)變或全新的項(xiàng)目下。
保證項(xiàng)目過程中的思路,框架的變更后,原有模塊可以完美適用。
不然,修改模塊是一個(gè)很耗費(fèi)時(shí)間和測(cè)試的工作。切記!!!!!!!!!!!!!!!!!!!!!!!!!!!
寫模塊時(shí),先從主輸入輸出模塊寫起。回調(diào)或委托先寫好,這樣,功能鋪開時(shí),才好處理。各功能間的接口,參數(shù)就好確定。
目的:有時(shí)候有些情況比較復(fù)雜,寫完了代碼。也沒法確定是否完全正確。畫圖感覺比較復(fù)雜,只能靠測(cè)試。這個(gè)時(shí)候使用狀態(tài)機(jī)分析法。就能比較好。
所以最佳實(shí)踐:對(duì)象的創(chuàng)建,必須明確,僅僅是局部使用,還是會(huì)傳出去,局部使用,就可以直接在棧中,如果會(huì)傳出去(或返回,或包含在返回對(duì)象中),必須傳遞對(duì)象,或者堆中的地址(智能指針)
修改一些bug,或添加新功能時(shí)候,非常有必要一個(gè)一個(gè)來完整的修改測(cè)試。不然,一遍一遍的檢查是否完成, 修改完一個(gè)更新一個(gè)。難得可以先跳過。但不要做到一半!!!!!!!!!,切記。
不管是模塊設(shè)計(jì),還是類規(guī)劃,還是小功能策劃,必須畫圖。就算是幾個(gè)方法的結(jié)合也必須畫圖。畫圖可以讓思路請(qǐng)i下。切記。queryreport的教訓(xùn)。
按常理,一般半個(gè)工作日 可以整理 2天左右的代碼,大概10個(gè)左右方法。所以20!30個(gè)方法間的代碼,需要3天左右。別太盲目在緊急時(shí)重夠代碼。又是血的教育。一定要做好單元測(cè)試。這樣才是bug的保障。
內(nèi)存對(duì)齊:
3規(guī)則
:第一個(gè)從0開始。
二:每個(gè)從自身的整數(shù)倍開始。
三,最后收尾按最大的類型的整數(shù)倍。
所以感覺隨意一點(diǎn)就只要先寫最小的。大的放最后,非要完全節(jié)省,就要細(xì)細(xì)擺了。感覺這個(gè)是編譯器的事情。不用太關(guān)注。
classS
{
inti;//0.3 第一規(guī)則
shorts[5];//4.13
charc;//14 補(bǔ) 到4的倍數(shù), 14-15第三規(guī)則
};
classD
{
charc0;//0-0
doubled[3];//8-31第二規(guī)則
charc;//32 補(bǔ) 到8的倍數(shù), 32-39第三規(guī)則
};
文件的操作。
常用就3種模式
附加:fstream fs(filepath.c_str(),ios_base::app|ios_base::out);
覆蓋:fstream fs(filepath.c_str(),ios_base::out);
讀起: ifstream fin;fin.open(filepath.c_str(),ios::in);
二維數(shù)組
int rows=5;
int column=6;
int **array3=new int*[rows];
for(int i=0;i<rows;++i)
{
array3[i]=new int[column];
}
array3[2][3]=5;
for(int i=0;i<rows;++i)
{
delete[] array3[i];
}
delete[] array3;
int* array2=new int[rows*column];
array2[0]=1;
array2[0+1]=2;
array2[1+0]=2;
for(int i=0;i<rows;++i)
{
for(int j=0;j<column;++j)
{
cout<<i*column+j;
array2[i*column+j]=i*10+j;
}
cout<<endl;
}
for(int i=0;i<30;++i)
{
cout<<array2[i]<<endl;
}
delete[] array2;
位運(yùn)算符作用于位,并逐位執(zhí)行操作。&、 | 和 ^
& 同時(shí)為真
| 有一個(gè)為真 : 更改某位值為1
2個(gè)不同且有一個(gè)為真。 :更改某位值為0
注意到一個(gè)使用指針的指針的場(chǎng)景。
系統(tǒng)或基礎(chǔ)類會(huì)生成一個(gè)指針,并且自己要使用到它。而使用者需要這個(gè)指針,那么可以設(shè)置一個(gè)出參,為指針的指針,來獲取。這樣就比較安全,簡(jiǎn)便。
1。千萬不要返回局部對(duì)象的引用
2.在類的成員函數(shù)中,賦值可以返回*this.因?yàn)橘x值是a=b。a是左值,是一定存在且this是隱指針參。
3.如ostream& operator<<(ostream& os,const compleNumber& complexNumb), 可以返回 os。
因?yàn)?cout<<b. cout是操作符左值,是一定存在的 且os是引用參數(shù)。
4。char& Mystring::operator[](unsigned int index)
這里也是一樣。this是隱指針參。
綜合所述,返回引用,一般是返回一個(gè) 引用參數(shù),或指針參數(shù) 的全部或部分,或者局部靜態(tài)變量。
本質(zhì)就是要求返回的對(duì)象,離開函數(shù)后是否還存在。存在才可以用引用。
1.
依賴倒置的理解:
按照直覺,是先寫個(gè)具體方法,再在上層調(diào)用這個(gè)方法。
而依賴倒置就是先寫上層方法。而具體方法可以先不寫,直接先用個(gè)抽象代替。
這個(gè)和事件驅(qū)動(dòng)編程,就是一樣思維啊。
大部分的模式都是用了抽象的思想。抽象才是根本。
2.winform 第一個(gè)類不是頁面類,會(huì)打不開設(shè)計(jì)器。
移動(dòng)第一個(gè) 非頁面類到后面。 是否ok了。否則 把輸入的下拉。從編譯改外無,再改為編譯,看看是否會(huì)重新加載設(shè)計(jì)器。
public FPSProcess()
{
preTime = System.DateTime.Now;
}
public DateTime preTime = System.DateTime.Parse("1982-01-02");
可以發(fā)現(xiàn)c#中,定義式居然比構(gòu)造函數(shù)還早執(zhí)行。這個(gè)。。。。
可以理解為c# ,一旦確定某個(gè)內(nèi)存是什么數(shù)據(jù),之后馬上在內(nèi)存中放置默認(rèn)值, 之后再執(zhí)行 定義式和 構(gòu)造函數(shù)。
所以會(huì)浪費(fèi)幾條指令,但是保證了數(shù)據(jù)的類型正確。
所以最ok的做法還是任何類都定義默認(rèn)的構(gòu)造函數(shù)。而不放在定義式中。
后面發(fā)現(xiàn)和java是一樣的。構(gòu)造函數(shù)會(huì)覆蓋定義。
4)第四個(gè)是模板,初寫模板,以為只是一套代碼的抽象。非常粗淺的看了c++的iterotarstl代碼,自己感覺原來模板才是真正的面向?qū)ο缶幊獭V罢娴闹皇敲嫦蝾惥幊潭选@^續(xù)看下去。看下模板元編程會(huì)不會(huì)也有思維重大改變。
目前只有一個(gè)認(rèn)識(shí):無需繼承也可實(shí)現(xiàn)多態(tài)。模板是要錢出錢,要力出力,一聲令下,提前準(zhǔn)備。所以模板會(huì)導(dǎo)致代碼膨脹。
新的認(rèn)識(shí):又一次被模板所驚嘆,既然是代碼生成器,那么對(duì)于可調(diào)用類型。如方法,防函數(shù)等 T(a),模板是不在乎T的類型的,所以一個(gè)模板類,可以同時(shí)接受函數(shù)對(duì)象和函數(shù)或函數(shù)指針。來完成一些可擴(kuò)展的功能。如泛型算法,就可以接受任何可調(diào)用類型。
5)第五個(gè)是學(xué)習(xí)了c++后,再次復(fù)習(xí)c#,和java后的理解。更工業(yè)化的語言類的對(duì)象,都已經(jīng)固定放在 heap中,讓人省去實(shí)例化后到底放哪里的考慮,一個(gè)簡(jiǎn)單的強(qiáng)制設(shè)定,省去了無數(shù)的麻煩,自己學(xué)c++時(shí),也曾打算這樣,和個(gè)人想法不謀而合,
完全可以避免棧滿的情況,看到類中的非基本數(shù)據(jù)成員,就知道是指針。而非基本數(shù)據(jù)成員,它其中的任何非基本數(shù)據(jù)成員,又一定是指針,非常清晰明白。感覺c#應(yīng)該也是這樣設(shè)定的。所有對(duì)象都是new出來到堆中。
如果c++自由真的是完美的話,為什么所有公司都要裁剪呢?自由和強(qiáng)制都要把握度。
總結(jié)
- 上一篇: 使用openssl生成双向加密证书(转)
- 下一篇: 如何判别是光猫问题还是路由器的问题如何判