如何編寫代碼++的C?
概述
本文僅供參考。
如果您正在編輯代碼,那么編寫有章法的代碼是很有意義的。
您的書寫風(fēng)格是需要與現(xiàn)有代碼保持一致的。
更簡單的理解代碼(更方便)需要代碼具有統(tǒng)一性。而且,統(tǒng)一的代碼使搜索更加容易。
本文之中諸多規(guī)則非也合理,往往是依例而為。
格式化
您寫的代碼將被自動執(zhí)行clang-format。
縮進(jìn) - 4個空格。配置開發(fā)環(huán)境,以便該選項卡添加四個空格。
新的一行上書寫大括號。(括號結(jié)尾亦如此)
inline void readBoolText (bool &x ,ReadBuffer &buf ){?
????char tmp = '0' ;
? ? readChar (tmp ,buf );?
????x = tmp != '0' ;?
}
但是,如果函數(shù)的全部足夠短(一個語句) - 如果需要,它可以完全放在一行上。在這種情況下,在花括號的周圍放置空白(除了行尾的空格)。
inline size_t mask ()? ? ? ? ? ? ? ? ? ? ? ? ? ? const {? ?return buf_size ()- 1 ; }?
inline size_t place (HashValue x )? ? ? ?const {? ? return x &mask ();? ?}
對于功能來說,圓括號不會有空格。
void reinsert (const Value &x )
memcpy (&buf [ place_value ],&x ,sizeof (x ));
當(dāng)使用if,for,while,...(而不是函數(shù)調(diào)用)時,在左括號之前放置一個空格。
for (為size_t 我= 0 ; 我< 行; 我+ = 存儲。index_granularity )
圍繞二元運(yùn)算符(+, - ,*,/,%,...)以及三元運(yùn)算符?:空間被放置。
UINT16 年= (小號[ 0 ] - '0' )* 1000 + (小號[ 1 ] - '0' )* 100 + (小號[ 2 ] - '0' )* 10 + (小號[ 3 ] - “0 ' ); UInt8 月= (s [ 5 ] - '0' )* 10 + (s [ 6 ] - '0' ); UInt8 day = (s [ 8 ] - '0' )* 10 + (s [ 9 ] - '0' );
如果您張貼一行,則該語句將寫入一個新行,并且縮進(jìn)之前遞增。
中頻(elapsed_ns )消息<< “(” << rows_read_on_server * 10億/ elapsed_ns << “行/秒,?!?<< bytes_read_on_server * 1000.0 / elapsed_ns << “MB立即下載/秒)?!?;
在行內(nèi),如果需要,可以用空格對齊。
dst 。ClickLogID = 點擊。LogID ; dst 。ClickEventID = 點擊。EventID ; dst 。ClickGoodEvent = 點擊。GoodEvent ;
在Carrier周圍? .,->沒有空格。
如有必要,可以將Carrier轉(zhuǎn)移到新行。在這種情況下,空格在它之前增加。
一元運(yùn)算符(,...)不能與空間分隔。--,?++,?*,?&
在逗號之后放置一個空格,之前 - 不存在。for語句中的分號類似。
操作員[]不能被空格分開。
在該表達(dá)式中,間,和前面有一個空格;?之后和之前-未分配。template?<...>template<<>
template < typename TKey ,typename TValue > struct AggregatedStatElement {}
在類和結(jié)構(gòu)中,公共的,私有的,被保護(hù)的被寫在與類/結(jié)構(gòu)相同的層次上,而其他所有的內(nèi)部都是更深的。
template < typename T > class MultiVersion {?
public :///使用對象的版本。
????shared_ptr 管理版本的生命周期。
????using Version = std :: shared_ptr < const T > ;
?????...?
}
如果整個文件上有一個命名空間,除此之外沒有任何必要,那么名稱空間內(nèi)的縮進(jìn)就不需要了。
如果表達(dá)式if,for,while ...的塊由一個語句組成,則花括號不需要寫入。相反,把語句放在一個單獨的行上。這個語句也可以嵌套,如果for,while ...但是如果inner語句包含大括號或者其他的,那么外部的塊應(yīng)該被寫在大括號中。
///完成寫入。for (auto &stream :streams )流。第二個- > finalize ();
行尾應(yīng)該沒有空格。
以UTF-8編碼的源代碼。
在字符串文字中,您可以使用非ASCII。
<< “” << (計時器。消逝()/ chunks_stats 。點擊數(shù))<< “微秒/命中”。;
不要在一行中寫入多個表達(dá)式。
在函數(shù)內(nèi)部,對代碼段進(jìn)行分組,使用不超過一個空行分隔它們。
功能,類別等至少由一個,至多兩個空行相互隔開。
const(引用該值)被寫入類型名稱。
// 正確的const char * pos const std :: string &s // 不正確的char const * pos
當(dāng)你聲明一個指針或引用時,*和&字符被兩邊的空格分開。
// 正確的const char * pos // 不正確的const char * pos const char * pos
當(dāng)使用模板類型時,寫using(除了最簡單的情況)。
也就是說,模板參數(shù)僅在using代碼中指定,然后在代碼中不重復(fù)。
using?可以在本地聲明,例如在一個函數(shù)內(nèi)。
// 正確使用FileStreams = std :: map < std :: string ,std :: shared_ptr < Stream >> ; FileStreams 流; // 不正確的std :: map < std :: string ,std :: shared_ptr < Stream > 流;
你不能在同一個聲明中聲明多個不同類型的變量。
// true int x ,* y ;
C風(fēng)格演員沒有使用。
//不正確的std :: cerr << (int )c << ; std :: endl ; //正確的std :: cerr << static_cast < int > (c )<< std :: endl ;
在課程和結(jié)構(gòu)中,分別在每個范圍內(nèi)分別分組和分組。
對于不是很大的類/結(jié)構(gòu),您不能將方法聲明與實現(xiàn)分開。
類似于任何類/結(jié)構(gòu)中的小方法。
對于模板類/結(jié)構(gòu),最好不要將方法聲明與實現(xiàn)分開(否則它們必須在同一個翻譯單元中定義)。
代碼寬度不能超過80個字符。有可能在140。
如果不需要postfix,請始終使用前綴遞增/遞減。
對于(姓名:: 為const_iterator IT = COLUMN_NAMES 。在開始(); IT != COLUMN_NAMES 。結(jié)束(); ++ IT )
評論(注釋)
有必要在所有需要解釋的地方寫評論。
這非常重要。我們不應(yīng)當(dāng)為他人創(chuàng)造閱讀代碼的多余工作,而應(yīng)當(dāng)簡便的介紹代碼的內(nèi)容。
/ **一部分內(nèi)存,可以使用。? * 例如,如果internal_buffer為1MB ,并且有唯一的圖10中,加載到緩沖“從文件中的字節(jié)進(jìn)行讀取,? *當(dāng)時working_buffer將具有僅為10字節(jié)大小床? *(working_buffer.end()點位置將可用的那些10個字節(jié)之后的閱讀)。? * /
注釋可以盡可能詳細(xì)。
注釋被寫入適當(dāng)?shù)拇a。在極少數(shù)情況下 - 可以放置于同一行之后。
/** Parses and executes the query.*/
void executeQuery( ReadBuffer & istr,? /// Where to read the query from (and data for INSERT, if? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?applicable)WriteBuffer & ostr,/// Where to write the result
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Context? & context,/// DB, tables, data types, engines, functions, aggregate? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? functions...BlockInputStreamPtr & query_plan,///executedQueryProcessingStage::Enum
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?stage=QueryProcessingStage::Complete/// Up to which stage process the SELECT query)
注釋只能用英文書寫。
編寫一個庫時,請在最重要的頭文件中發(fā)布一個關(guān)于它是什么的詳細(xì)注釋。
你不能寫評論,不提供額外的信息。特別是,你不能寫這樣的空的評論:
/ * *過程如何名稱:*原程序名稱:*作者:*創(chuàng)造條件的日期:*修改的日期:*修改作者:*原始文件名:*用途:*的意圖:*的名稱:*在類中使用:*常量:*局部變量:*參數(shù):*創(chuàng)建日期:*目的:* /
(實施例從資源采取http://home.tamk.fi/~jaalto/course/coding-style/doc/unmaintainable-code/
您不能在每個文件的開頭寫入垃圾評論(作者,創(chuàng)建日期...)。
單行注釋以三個斜杠開始:///多行與/**。這樣的評論被認(rèn)為是“記錄”。
注意:這些注釋可用于使用Doxygen生成文檔。但是,實際上,Doxygen并沒有被使用,因為使用IDE功能導(dǎo)航代碼要方便得多。
在多行注釋的開始和結(jié)尾,不應(yīng)該有空行(除了多行注釋關(guān)閉的行外)。
對于注釋的代碼塊,通常不使用“記錄”注釋。
在提交之前刪除注釋的代碼塊。
不要在評論或代碼中寫粗話。
不要用大寫字母寫。不要使用不必要的標(biāo)點符號。
///WHAT A FALIURE
不要在評論中撰寫分隔線。
/// *********************************************** *******
在評注中寫下對話是沒有必要的(最好口頭說)。
///你為什么要做這個東西?
不要在塊的末尾寫下關(guān)于這個塊的評論。
/// for
名稱
變量和類成員的名稱是帶有下劃線的小寫字母。
size_t max_block_size ;
函數(shù)(方法)的名字是用小寫字母camelCase。
std :: string getName ()const override { return “Memory” ; }
類(結(jié)構(gòu))的名稱是大寫字母的CamelCase。不使用接口以外的前綴。
類StorageMemory :公共IStorage
使用的名稱以及類,或者您可以在最后添加_t。
類型名稱 - 模板參數(shù):在簡單情況下 - T;?T,U;?T1,T2。
在更復(fù)雜的情況下 - 無論是類名,還是可以將字母T添加到開頭。
template < typename TKey ,typename TValue > struct AggregatedStatElement
常量的名稱 - 模板的參數(shù):或者變量的名稱,或者簡單情況下的N。
template < bool without_www > struct ExtractDomain
對于抽象類(接口),可以將字母I添加到名稱的開頭。
類IBlockInputStream
如果變量在本地使用,那么可以使用簡稱。
在其他情況下 - 使用描述含義的相當(dāng)詳細(xì)的名稱。
bool info_successfully_loaded = false ;
定義-s - 帶下劃線的ALL_CAPS。全局常量 - 也是。
#define MAX_SRC_TABLE_NAMES_TO_STORE 1000
具有代碼的文件的名稱根據(jù)其中的內(nèi)容根據(jù)樣式命名。
如果在文件中有一個類 - 在CamelCase中將該文件命名為一個類。
如果文件中有一個函數(shù) - 將該文件命名為函數(shù) - 在camelCase中。
如果名稱包含縮寫,則:
對于變量名,所有的縮寫都是用小寫字母mysql_connection(不mySQL_connection)。
對于類和函數(shù)的名字,大的字母保留在縮寫MySQLConnection(not?MySqlConnection)中。
應(yīng)立即使用用于初始化類的相應(yīng)成員的構(gòu)造函數(shù)的參數(shù)以及類的成員,并在末尾添加下劃線。
FileQueueProcessor (const的在std :: :字符串和path_ ,常量在std :: :字符串和prefix_ ,在std :: shared_ptr的< 文件處理器> handler_ ):路徑(path_ ),前綴(prefix_ ),處理器(handler_ ),日志(&記錄器:: 的get (“FileQueueProcessor” )){ }
您也可以像構(gòu)造函數(shù)的成員一樣調(diào)用構(gòu)造函數(shù)的參數(shù)(不要添加下劃線),但只有在構(gòu)造函數(shù)的主體中不使用此參數(shù)時才可以。
命名局部變量和類成員沒有區(qū)別(不需要前綴)。
定時器(不是m_timer )
enum-e中的常量 - 使用大寫字母的CamelCase。ALL_CAPS也是可以接受的。如果枚舉不在本地,則使用枚舉類。
枚舉類CompressionMethod { QuickLZ = 0 ,LZ4 = 1 ,};
所有的名字都是英文的。俄語字符、漢語字符、日語字符等不得使用。
不要使用Stroka?
名稱中的縮寫(來自不同單詞的幾個字母)只有在被普遍接受的情況下才可以使用(如果縮短可以在英文維基百科中進(jìn)行解碼或進(jìn)行搜索查詢): AST,SQL。
No NVDH
只有在廣泛使用這種縮減的情況下,才能使用縮略語的縮略語。
但是,如果縮寫的代碼全稱就在注釋附近出現(xiàn)過,也可以使用縮寫。
C ++源文件名只能有.cpp擴(kuò)展名。頭文件 - 只有.h。
如何編寫代碼
內(nèi)存管理。
手動刪除內(nèi)存(刪除)只能在庫代碼中使用。
而在庫代碼中,刪除操作符只能在析構(gòu)函數(shù)中使用。
在應(yīng)用程序代碼中,應(yīng)該完成內(nèi)存被擁有它的某個對象釋放。
例子:
將對象放在堆棧上,或者使其成為另一個類的成員是最簡單的。
對于大量的小物件,使用容器。
要自動釋放堆中分配的少量對象,請使用shared_ptr / unique_ptr。
資源管理。
使用RAII并參見上面的段落。
錯誤處理。
使用例外。在大多數(shù)情況下,您只需要拋出異常,而不需要捕捉(因為RAII)。
在離線數(shù)據(jù)處理程序中,通常你不能捕捉異常。
在處理自定義請求的服務(wù)器中,通常在連接處理程序的頂部捕獲異常就足夠了。
在線程函數(shù)中,你應(yīng)該捕獲并記住所有異常,在加入之后將它們拋入主線程中。
///如果還沒有計算,如果(!Started ){ calculate (); 開始= 真; } else ///如果計算已經(jīng)在運(yùn)行,請等待池的結(jié)果。wait (); 如果(例外)異常- > rethrow ();
不要“不分青紅皂白地”吞食“例外。在任何情況下,都不要將所有例外不加區(qū)分地轉(zhuǎn)換成日志中的消息。
不要。catch?(...)?{}
如果您需要忽略一些例外情況,那么只需要忽略特定的例外情況,其余部分則會退回。
捕捉(const的DB :: 異常&? ){ 如果(? 。代碼()== ErrorCode的:: UNKNOWN_AGGREGATE_FUNCTION )返回nullptr ; 否則扔; }
當(dāng)使用使用返回碼或errno的函數(shù)時,檢查結(jié)果并拋出異常。
if (0 != close (fd ))throwFromErrno (“Can not close file” + file_name ,ErrorCodes :: CANNOT_CLOSE_FILE );
斷言不被使用。
異常類型。
在應(yīng)用程序代碼中,您不需要使用復(fù)雜的異常層次結(jié)構(gòu)。希望系統(tǒng)管理員能夠理解例外文本。
從析構(gòu)函數(shù)中出現(xiàn)的異常。不建議使用,但可以接受。
使用以下選項:
做一個函數(shù)(done()或finalize()),它可以讓你事先執(zhí)行所有的工作,在這個過程中可能會發(fā)生異常。如果這個函數(shù)被調(diào)用,那么在析構(gòu)函數(shù)中不應(yīng)該有任何異常。
過于復(fù)雜的工作(例如通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù))在析構(gòu)函數(shù)中根本無法完成,期望用戶提前調(diào)用該方法來完成工作。
如果在析構(gòu)函數(shù)中發(fā)生異常,建議不要“吞食”它,而是將信息輸出到日志(如果在此處有日志記錄器)。
在簡單的程序,如果相關(guān)的異常沒有被捕獲,并導(dǎo)致與在日志中記錄信息的工作完成后,你可以不用擔(dān)心從析構(gòu)函數(shù)發(fā)出的異常,因為調(diào)用的std ::終止(在默認(rèn)noexcept在C ++ 11的情況下)是處理異常的可接受的方式。
獨立的代碼塊。
在一個函數(shù)內(nèi)部,可以創(chuàng)建一個單獨的代碼塊,以便在其中創(chuàng)建一些局部變量,并在退出塊時調(diào)用相應(yīng)的析構(gòu)函數(shù)。
塊塊= 數(shù)據(jù)。in - > read (); { std :: lock_guard < std :: mutex > lock (mutex ); 數(shù)據(jù)。ready = true ; 數(shù)據(jù)。block = block ; } Ready_any 。set ();
多線程。
在離線數(shù)據(jù)處理程序中:
首先,在單個處理器內(nèi)核上實現(xiàn)或多或少的最大性能,然后您可以并行化代碼,但只在必要的時候使用。
在服務(wù)器程序中:
使用線程池來處理請求。目前,我們沒有任何需要使用用戶空間上下文切換的任務(wù)。
叉不用于并行化。
流的同步。
通常,你可以單獨的流數(shù)據(jù)寫入到不同的存儲位置(更好 - 在不同的緩存行),并且不使用流同步(除joinAll)。
如果需要同步,在大多數(shù)情況下,使用lock_guard下的互斥鎖就足夠了。
在其他情況下,使用系統(tǒng)同步原語。不要用忙等待。
原子操作只能用于最簡單的情況。
除非你是專家,否則你不需要自己寫一個無鎖的數(shù)據(jù)結(jié)構(gòu)。
參考和指標(biāo)。
在大多數(shù)情況下,更喜歡鏈接。
常量。
可以使用常量引用,常量指針,const_iterator,常量方法。
考慮到const是“缺省”寫入的變體,只有必要時才需要const的缺失。
對于通過值傳遞的變量,const通常是沒有意義的。
無符號。
如果需要,使用無符號。
數(shù)字類型。
使用類型UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64以及size_t,ssize_t,ptrdiff_t。
不要使用signed / unsigned long,long long,short;?signed char,unsigned char和char。
傳遞參數(shù)。
復(fù)合值是通過引用傳遞的(包括std :: string)。
如果該函數(shù)捕獲在堆上創(chuàng)建的對象的所有權(quán),則使參數(shù)類型為shared_ptr或unique_ptr。
返回值。
在大多數(shù)情況下,只需返回值。不要寫[return std :: move(res)] {。Strike}。
如果在函數(shù)內(nèi)部在堆上創(chuàng)建一個對象并發(fā)出,則返回shared_ptr或unique_ptr。
在少數(shù)情況下,可能需要通過函數(shù)參數(shù)返回一個值。在這種情況下,參數(shù)是一個鏈接。
使用AggregateFunctionPtr = std :: shared_ptr < IAggregateFunction > ; / **允許您通過名稱創(chuàng)建一個聚合函數(shù)。? * / class AggregateFunctionFactory { public :AggregateFunctionFactory (); AggregateFunctionPtr get (const String &name ,const DataTypes &argument_types )const ;
命名空間。
對于應(yīng)用程序代碼,您不需要使用單獨的名稱空間。
對于小型圖書館 - 不需要。
對于不是很小的圖書館 - 把所有的東西放在名字空間里
在.h文件庫中,可以使用名稱空間詳細(xì)信息來獲取應(yīng)用程序代碼不需要的實現(xiàn)細(xì)節(jié)。
在.cpp文件中,可以使用靜態(tài)或匿名命名空間來隱藏字符。
此外,命名空間可以用于枚舉,以便相應(yīng)的名稱不會進(jìn)入外部名稱空間(但最好使用枚舉類)。
延遲初始化。
通常,如果您需要參數(shù)來初始化,請不要為了邏輯而編寫構(gòu)造函數(shù)。
如果那么你需要延遲初始化,那么你可以添加一個默認(rèn)的構(gòu)造函數(shù)(這將創(chuàng)建一個不正確的狀態(tài)的對象)?;蛘?,對于少數(shù)對象,可以使用shared_ptr / unique_ptr。
Loader (DB :: Connection * connection_ ,const std :: string &query ,size_t max_block_size_ ); ///用于延遲初始化Loader (){}
虛擬功能。
如果這個類不是為多態(tài)使用而設(shè)計的,那么你就不需要使這個函數(shù)虛擬化。這也適用于析構(gòu)函數(shù)。
編碼。
UTF-8被廣泛使用。使用std::string,。未使用,。char?*std::wstringwchar_t
日志記錄。
查看代碼中的所有示例。
在提交之前,刪除所有無意義和調(diào)試日志,以及其他類型的調(diào)試輸出。
內(nèi)部循環(huán)的每個迭代都不應(yīng)該有日志記錄,即使是跟蹤級別也是如此。
在任何級別的日志記錄中,日志都應(yīng)該可以讀取。
日志記錄應(yīng)該主要用在應(yīng)用程序代碼中。
日志中的信息應(yīng)該用英文書寫。
系統(tǒng)管理員可以理解日志。
不需要在日志中寫下臟話。
日志使用UTF-8編碼。偶爾,日志中可以使用非ASCII字符。
I / O.
在內(nèi)部循環(huán)(在程序的關(guān)鍵部分),你不能使用iostreams(包括,絕不使用stringstream)。
而是使用DB / IO庫。
日期和時間。
查看DateLUT庫。
Include
頭文件僅用于,包括guard-s不需要寫。#pragma?once
Using
不使用名稱空間。
使用一些具體的東西 - 這是可能的。在本地更好 - 在課堂上或功能上。
如果沒有必要,則不需要使用函數(shù)的尾隨返回類型。
[auto f() ->? void;] {.strike}
你不需要像這樣聲明和初始化變量:
auto s = std :: string { “Hello” };
這是必要的:
std :: string s = “Hello” ; std :: string s { “Hello” };
對于虛擬函數(shù),在基類中寫入虛擬,在繼承類中寫入覆蓋,不寫虛擬。
未使用的語言特性++的C?
虛擬繼承不使用。
不使用C ++ 03的異常限定符。
函數(shù)try塊不被使用,除了測試中的主函數(shù)。
平臺
我們編寫一個非跨平臺的代碼(針對特定的平臺)。
盡管其他條件相同,但是更多或更少的跨平臺或便攜代碼是優(yōu)選的。
語言 - C ++ 17。
編譯器是gcc。目前(2017年12月),代碼將版本7.2。(也可以用clang 5編譯代碼)
使用標(biāo)準(zhǔn)庫(實現(xiàn)libstdc ++或libc ++)。
操作系統(tǒng) - Linux Ubuntu,不比Precise大。
該代碼是為體系結(jié)構(gòu)x86_64的處理器編寫的。
一套指令是我們的服務(wù)器支持的最低要求?,F(xiàn)在是SSE4.2。
編譯標(biāo)志被使用。-Wall?-Wextra?-Werror
使用帶有除了那些困難的所有庫靜態(tài)鏈接到靜態(tài)連接(見。結(jié)論LDD命令)。
代碼是用程序集的發(fā)布參數(shù)開發(fā)和調(diào)試的。
工具
KDevelop是一個很好的開發(fā)環(huán)境。
對于調(diào)試,使用gdb,valgrind(memcheck),strace,-fsanitize = ...,tcmalloc_minimal_debug。
性能分析使用Linux Perf,valgrind(callgrind),strace -cf。
來源于Git。
用CMake構(gòu)建。
程序使用deb包進(jìn)行布局。
Master承諾不應(yīng)該破壞項目的組裝。
所收集的程序的工作能力僅保證個人審計。
盡可能經(jīng)常提交,包括非工作代碼。
要做到這一點,使用 branch。
如果您的主代碼還沒有準(zhǔn)備好,那么在推送它之前 - 從程序集中排除它,您將不得不修改它或在幾天內(nèi)刪除它。
對于不重要的更改,使用branch。應(yīng)該將分支上傳到服務(wù)器。
不必要的代碼從source中刪除。
庫
使用標(biāo)準(zhǔn)的C ++庫14(允許使用 Experimental 擴(kuò)展)以及 Poco 框架。
如有必要,您可以使用軟件包中操作系統(tǒng)中可用的任何已知庫。
如果有一個好的現(xiàn)成的解決方案,那就使用它,即使你需要為此安裝一個庫。
(但要做好準(zhǔn)備,因為有時候你必須從代碼中剔除不好的庫。)
如果軟件包中沒有庫,或者版本足夠舊,或者沒有以正確的方式編譯,則可以使用未從軟件包安裝的庫。
如果庫足夠小,并且沒有自己的構(gòu)建系統(tǒng),則應(yīng)將其文件包含在項目的contrib目錄中。
總是優(yōu)先考慮已經(jīng)在使用的library庫。
一般
寫盡可能少的代碼。
嘗試最簡單的解決方案。
如果您不知道程序?qū)?zhí)行什么操作,以及內(nèi)部循環(huán)如何工作,則無需編寫代碼。
在最簡單的情況下,使用 using 而不是class/struct。
如果可能的話,不要寫復(fù)制構(gòu)造函數(shù),賦值運(yùn)算符,析構(gòu)函數(shù)(除非虛擬類至少包含一個虛函數(shù)),移動構(gòu)造函數(shù)和移動賦值。也就是說,編譯器生成的相應(yīng)函數(shù)正常工作。你可以使用默認(rèn)。
簡化和減少代碼量是值得歡迎的。
此外
顯式的std ::用于stddef.h中的類型。
建議不要指定。也就是說,建議編寫size_t而不是std :: size_t - 因為它更加精簡。
但是,如果你想,你仍然可以分配std :: - 這個選項也是可以接受的。
基本的std ::用于標(biāo)準(zhǔn)C庫中的函數(shù)。
不推薦。也就是說,寫入memcpy而不是std :: memcpy。
原因 - 有類似的非標(biāo)準(zhǔn)功能,例如memmem。我們可以使用和偶爾使用這些功能。這些函數(shù)在命名空間std中找不到。
如果你在任何地方都寫std :: memcpy而不是memcpy,那么在不用std ::的情況下查看memmem將會很不方便。
但是,指定std ::也是可以接受的,如果這更像。
如果標(biāo)準(zhǔn)C ++庫中有類似物,則使用C中的函數(shù)。
如果這種使用更有效,這是允許的。
例如,要復(fù)制長塊的內(nèi)存,請使用memcpy而不是std :: copy。
傳遞長函數(shù)參數(shù)。
可以使用任何傳輸方式,類似于下面列出的傳輸方式:
功能(T1 x1 ,T2 x2 )
函數(shù)(size_t left ,size_t right ,const &RangesInDataParts 范圍,size_t 限制)
函數(shù)(size_t left ,size_t right ,const &RangesInDataParts 范圍,size_t 限制)
函數(shù)(size_t left ,size_t right ,const &RangesInDataParts 范圍,size_t 限制)
函數(shù)(size_t left ,size_t right ,const &RangesInDataParts 范圍,size_t 限制)