锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍦ㄦ柊棰佸竷鐨凜++鏂版爣鍑咰++11涓紝鏈浠や漢嬋鍔ㄤ漢蹇冪殑錛屾垜鎯充笉鏄痑uto鍏抽敭瀛楋紝涔熶笉鏄疞ambda琛ㄨ揪寮忥紝鑰屾槸鍏朵腑鐨勫騫惰璁$畻鐨勬敮鎸佲斺旀柊鐨勭嚎紼嬪簱(thread)鐨勫姞鍏ャ?/p> 澶氭牳蹇僀PU鐨勬櫘鍙婂簲鐢紝C++鐨勪富瑕佸簲鐢ㄩ鍩燂紝鏈嶅姟鍣ㄧ▼搴忥紝楂樻ц兘璁$畻絳夌瓑錛岄兘瀵瑰茍琛岃綆楁彁鍑轟簡鏂扮殑瑕佹眰錛岃岃繖嬈++涓叏鏂版坊鍔犵殑綰跨▼搴擄紝灝辨槸
瀵硅繖涓瓚嬪娍鐨勫簲瀵廣傜幇鍦紝C++紼嬪簭鍛樺彲浠ヨ交鏉懼湴緙栧啓澶氱嚎紼嬬殑紼嬪簭錛岃屾棤闇鍊熷姪緋葷粺API鎴栬呮槸絎笁鏂圭▼搴忓簱鐨勬敮鎸併傜嚎紼嬪簱鐨勫姞鍏ョ粰C++甯︽潵鐨勫彉鍖栵紝鏃?
寮備簬 194錛岀炕韜殑紼嬪簭鍛樹滑鎶婃瓕鍞便?/p> C++11涓殑綰跨▼搴擄紝寰堝ぇ紼嬪害涓婄洿鎺ユ潵鑷猙oost榪欏潡C++鐨勮瘯楠岀敯錛屽叾鍩烘湰鏋舵瀯鍜岀粍浠墮兘瀹屽叏鐩稿悓錛屽鏋滀綘鏄竴涓猙oost綰跨▼搴撶殑浣跨敤鑰咃紝閭?
涔堝湪C++11涓紝浣犱細鎰熻鍒版槸鍥炲埌浜嗚佸涓鏍鳳紝鍒板閮芥槸鐔熶漢銆傝屽鏋滀綘鏄竴涓畬鍏ㄧ殑鏂版墜錛屼篃涓嶈绱э紝C++11涓殑綰跨▼搴撻潪甯哥畝鍗曪紝浠諱綍浜洪兘鍙互杞繪澗涓?
鎵嬶紝鎴戝氨鏄繖鏍鳳紝浣嗘槸瑕佹繁絀訛紝榪樺緱濂藉ソ瀛︿範銆?/p> 涓嬮潰鏄竴涓畝鍗曠殑渚嬪瓙錛岀敤鍒頒簡綰跨▼搴撲腑鐨勭嚎紼嬶紙thread錛?浜掓枼錛坢utex錛?鏉′歡鍙橀噺錛坈ondition錛夛紝鏉ユā鎷熶竴涓紨鍞變細鐨勫叆鍦烘紲ㄧ殑鍦烘櫙錛屽彟澶栵紝涓轟簡妯℃嫙瑙備紬錛岀敤鍒頒簡C++11涓殑鏂扮殑闅忔満鏁扮殑浜х敓錛屾ā鎷熶竴涓鎬佸垎甯冪殑璁垮浜虹兢銆備笉璇翠簡錛岃繕鏄湅浠g爜錛?/p> #include <iostream> // 鍏變韓璧勬簮鍜屼簰鏂ュ璞?br />mutex mtx; 聽聽聽 聽聽聽 // 鍚屾牱榪愮敤鏉′歡鍙橀噺錛屽垽鏂槦鍒楁槸鍚﹀凡緇忔弧浜?br />聽聽聽聽聽聽聽 // 鍙湁鍦ㄩ槦鍒楀皻鏈弧鐨勬儏鍐典笅鎵嶅悜涓嬬戶緇?br />聽聽聽聽聽聽聽 scoped_lock lock(m); 鍦–++11涓紝鎴戜滑鍙互浣跨敤shared_ptr綆$悊鏌愪釜瀵硅薄鐨勬墍鏈夋潈錛岃礋璐e璞$殑鏋愭瀯銆傜劧鑰屽湪鏌愪簺鎯呭喌涓嬶紝鎴戜滑鍙槸甯屾湜瀹夊叏鐨勮闂煇涓璞★紝鑰屼笉鎯蟲嫢鏈夎繖涓璞$殑鎵鏈夋潈錛屽榪欎釜鐨勬瀽鏋勮礋璐o紙鏈夌偣鍍忕數瑙嗗墽涓殑閭d簺涓嶈礋璐d換鐨勭敺浜哄摝錛屽彧鏄帺鐜╄屽凡錛屼笉浼氳礋璐o級銆傚湪榪欑鎯呭喌涓嬶紝鎴戜滑鍙互浣跨敤琛ㄧず寮卞紩鐢ㄧ殑weak_ptr銆?/p>
weak_ptr鍙互鐢變竴涓猻hared_ptr鏋勫緩錛岃〃紺鴻繖涓獁eak_ptr鎷ユ湁榪欎釜shared_ptr鎵鎸囧悜鐨勫璞$殑璁塊棶鏉冿紝娉ㄦ剰錛岃繖閲屼粎浠呮槸璁塊棶鏉冿紝瀹冧笉浼氭敼鍙樻櫤鑳芥寚閽堢殑寮曠敤璁℃暟錛岃嚜鐒朵篃灝變笉浼氬幓鏋愭瀯榪欎釜瀵硅薄銆傚埄鐢╳eak_ptr錛屾垜浠氨鍙互瀹夊叏鍦拌闂偅浜涗笉鍏峰鎵鏈夋潈鐨勫璞°?/p>
涓涓幇瀹炰腑鐨勪緥瀛愬氨鏄鏍$殑浼犺揪瀹わ紝浼犺揪瀹ゆ嫢鏈変竴鏈鐢熺殑鍚嶅崟錛屽鏋滄煇涓數璇濇潵浜嗘壘鏌愪釜瀛︾敓錛屼紶杈懼浼氭牴鎹姳鍚嶅唽鍘誨皾璇曡闂繖涓鐢燂紝濡傛灉榪欎釜瀛︾敓榪樺湪瀛︽牎錛屽氨鐩存帴鍛煎彨榪欎釜瀛︾敓錛屽鏋滃凡緇忕寮浜嗭紝榪欑粰榪欎釜瀛︾敓鐣欎竴涓秷鎭傚湪榪欓噷錛岃姳鍚嶅唽涓婄殑瀛︾敓鍙兘榪樺湪瀛︽牎錛堝璞¤繕瀛樺湪錛夛紝涔熷彲鑳藉凡緇忕寮瀛︽牎錛堝璞″凡緇忔瀽鏋勶級錛屾垜浠兘闇瑕佸鍏惰繘琛岃闂紝鑰寃eak_ptr灝辨槸鐢ㄦ潵璁塊棶榪欑涓嶇‘瀹氭槸鍚﹀瓨鍦ㄧ殑瀵硅薄鐨勩?/p>
]]>
]]>
聽
#include <queue>
#include <vector>
// 闅忔満鏁?br />#include <random>
// 榪欓噷錛屾垜浣跨敤浜哹oost瀹炵幇鐨勭嚎紼嬪簱錛屽鏋滀綘鐨勭紪璇戝櫒宸茬粡鏀寔C++11錛屽垯浣跨敤<thread>鏄竴鏍風殑
#include <boost\thread.hpp>
#include <boost\thread\locks.hpp>
#include <boost\thread\condition.hpp>
using namespace std;
using namespace boost;
bool finish = false;聽 // 琛ㄧず瑙備紬鍒版潵鏄惁緇撴潫
// 瑙備紬錛屼富瑕佹槸涓轟簡琛ㄧず媯紲ㄨ繃紼嬩腑鐨勬紲ㄨ楄垂鏃墮棿
class viewer
{
public:
聽聽聽 void check()
聽聽聽 {
聽聽聽 聽聽聽 // 綰跨▼絳夊緟
聽聽聽聽聽聽聽 posix_time::milliseconds worktime(400);聽
聽聽聽 聽聽聽 this_thread::sleep(worktime);聽聽聽
聽聽聽 }
聽聽聽 void arrival(int t)
聽聽聽 {
聽聽聽 聽聽聽 posix_time::seconds arrtime(t);聽
聽聽聽 聽聽聽 this_thread::sleep(arrtime);聽聽聽
聽聽聽 }
};
// 媯紲ㄥ彛
// 瀹冩湁涓涓槦鍒楋紝鐢ㄤ簬淇濆瓨鍒版潵鐨勮浼楋紝騫朵笖鐢ㄤ竴涓嚎紼嬫潵澶勭悊闃熷垪涓殑瑙備紬
class gate
{
聽聽聽 typedef boost::mutex::scoped_lock scoped_lock;
public:
聽聽聽 gate():count(0),no(0){};
聽聽聽 // 鍚姩綰跨▼
聽聽聽 void start(int n)
聽聽聽 {
聽聽聽 聽聽聽 no = n;
聽聽聽 聽聽聽 t = thread(&gate::check,this);
聽聽聽 }
聽聽聽 // 媯紲?br />聽聽聽 void check()
聽聽聽 {
聽聽聽 聽聽聽 // 鏃犻檺寰幆錛岀煡閬撹浼楁暟涓?涓斾笉浼氭湁鏂扮殑瑙備紬鍒版潵
聽聽聽 聽聽聽 while(true)
聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 viewer v;
聽聽聽 聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 聽聽聽 // 閿佸畾浜掓枼瀵硅薄錛屽紑濮嬭闂鍒?br />聽聽聽 聽聽聽 聽聽聽 聽聽聽 scoped_lock lock(m);
聽聽聽 聽聽聽 聽聽聽 聽聽聽 if(0==vque.size())聽 // 濡傛灉闃熷垪涓虹┖
聽聽聽 聽聽聽 聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 // 鍒ゆ柇鏄惁榪樹細鏈夋柊鐨勮浼楀埌鏉ワ紝涔熷嵆鏄〃紺哄埌杈劇殑綰跨▼鏄惁緇撴潫
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 scoped_lock finlk(mtx);
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 if(finish)
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 return; // 濡傛灉宸茬粡緇撴潫錛屾紲ㄤ篃鍚屾牱緇撴潫
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 // 濡傛灉瑙備紬鏁頒負0錛屽垯絳夊緟鏂扮殑瑙備紬鐨勫埌鏉?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 while(0 == vque.size())
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 {聽聽聽
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽聽聽 // 榪欓噷鐨剋ait()鏄潯浠跺彉閲忕殑鍏抽敭錛屽畠浼氬厛鏄惁lock鎵閿佸畾鐨勪簰鏂ュ璞涓瀹氭椂闂達紝
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 鐒跺悗鍐嶆閿佸畾錛屾帴鐫榪涜錛?==vque.size()錛夌殑鍒ゆ柇銆傚姝ゅ線澶嶏紝鐭ラ亾size涓嶇瓑浜?錛?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 寰幆鏉′歡鏃犳硶婊¤凍鑰岀粨鏉熷驚鐜紝榪欓噷琛ㄨ揪鐨勬潯浠跺氨鏄紝鍙湁size!=0錛屼篃灝辨槸闃熷垪涓湁
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 瑙備紬鎵嶇戶緇悜涓嬨?
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 cond.wait(lock);
聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 聽聽聽 // 浠庡鍒椾腑鑾峰緱瑙備紬錛屽鍏惰繘琛屾紲?
聽聽聽 聽聽聽 聽聽聽 聽聽聽 v = vque.front();
聽聽聽 聽聽聽 聽聽聽 聽聽聽 vque.pop();
聽聽聽 聽聽聽 聽聽聽 聽聽聽 cond.notify_one(); // 榪欓噷鏄氱煡娣誨姞瑙備紬鐨勮繘紼嬶紝琛ㄧず闃熷垪宸茬粡鏈夌┖浣嶇疆浜嗭紝鍙互娣誨姞鏂扮殑瑙備紬
聽聽聽 聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 聽聽聽 v.check();
聽聽聽 聽聽聽 聽聽聽 ++count;
聽聽聽 聽聽聽 }
聽聽聽 }
聽聽聽 // 灝嗚浼楁坊鍔犲埌闃熷垪
聽聽聽 void add(viewer v)
聽聽聽 {
聽聽聽 聽聽聽 while(vque.size() >= 15 )
聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 cond.wait(lock);
聽聽聽 聽聽聽 }
聽聽聽 聽聽聽 vque.push(v); // 灝嗚浼楁坊鍔犲埌闃熷垪
聽聽聽 聽聽聽 cond.notify_one();聽 // 閫氱煡媯紲ㄨ繘紼嬶紝鏂扮殑瑙備紬榪涘叆闃熷垪錛岃繖鏍峰湪size=0鏃剁瓑寰呯殑鏉′歡鍙互鏇存柊
聽聽聽 }
聽聽聽 int getcount()
聽聽聽 {
聽聽聽 聽聽聽 return count;
聽聽聽 }
聽聽聽 int getno()
聽聽聽 {
聽聽聽 聽聽聽 return no;
聽聽聽 }
聽聽聽 // 絳夊緟綰跨▼鎵ц瀹屾瘯榪斿洖
聽聽聽 void join()
聽聽聽 {
聽聽聽 聽聽聽 t.join();
聽聽聽 }
private:
聽聽聽 thread t;
聽聽聽 mutex m;
聽聽聽 condition cond;
聽聽聽 queue<viewer> vque;
聽聽聽 int count;
聽聽聽 int no;
};
// 涓鍏辨湁10涓紲ㄥ彛
vector<gate> vgates(10);
// 鐢ㄩ殢鏈烘暟妯℃嫙瑙備紬鍒拌揪
void arrival()
{聽聽聽
聽聽聽 default_random_engine re{}; // 浜х敓涓涓潎鍊間負31鐨勬鎬佸垎甯冪殑闅忔満鏁?br />聽聽聽 normal_distribution<double> nd(31,8);
聽聽聽 // 灝嗛殢鏈烘暟寮曟搸鍜屽垎甯冪粦瀹氫竴涓嚱鏁板璞?br />聽聽聽 auto norm = std::bind(nd, re);
聽聽聽 // 淇濆瓨闅忔満鏁扮殑瀹瑰櫒
聽聽聽 vector<int> mn(64);
聽聽聽
聽聽聽 // 浜х敓闅忔満鏁?br />聽聽聽 for(int i = 0;i<700;++i)
聽聽聽 聽聽聽 ++mn[round(norm())];
聽聽聽
聽聽聽 int secs = 100;
聽聽聽 // 浜х敓0鍒?鐨勯殢鏈烘暟錛岃〃紺鴻浼楅殢鏈哄湴鍒拌揪鏌愪竴涓紲ㄥ彛
聽聽聽 uniform_int_distribution<int>聽 index{0,9};
聽聽聽 聽
聽聽聽 // 榪涘叆媯紲ㄥ彛闃熷垪
聽聽聽 for(auto i:mn)
聽聽聽 {
聽聽聽 聽聽聽 cout<<i<<endl;
聽聽聽 聽聽聽 for(auto vi = 1; vi <= i; ++vi)
聽聽聽 聽聽聽 {
聽聽聽 聽聽聽 聽聽聽 // 灝嗚浼楁坊鍔犲埌鏌愪釜gate鐨勯槦鍒椾腑
聽聽聽聽聽聽聽聽聽聽聽聽 (vgates[index(re)]).add(viewer());
聽聽聽 聽聽聽 聽聽聽 // 絳夊緟涓孌墊椂闂?br />聽聽聽 聽聽聽 聽聽聽 int t = round(secs/(float)(i+1));
聽聽聽 聽聽聽 聽聽聽 this_thread::sleep(
聽聽聽 聽聽聽 聽聽聽 posix_time::milliseconds(t));
聽聽聽 聽聽聽 }
聽聽聽 }
聽聽聽 // 瑙備紬宸茬粡鍏ㄩ儴鍒拌揪錛岃繘鍏ラ槦鍒?br />聽聽聽聽 cout<<"finish"<<endl;
聽聽聽 mtx.lock();
聽聽聽 finish = true;
聽聽聽 mtx.unlock();
聽聽聽 //cout<<"unlock"<<endl;
}
int main()
{
聽聽聽 int i = 1;
聽聽聽 // 鍚姩媯紲ㄧ嚎紼?br />聽聽聽 for(gate& g:vgates)
聽聽聽 {
聽聽聽 聽聽聽 g.start(i);
聽聽聽 聽聽聽 ++i;
聽聽聽 }
聽聽聽 // 鍚姩鍒拌揪綰跨▼錛岀湅鐪嬶紝鍦–++11涓柊綰跨▼鐨勫垱寤哄氨榪欎箞綆鍗?br />聽聽聽 thread arr = thread(arrival);
聽聽聽 // 絳夊緟綰跨▼緇撴潫
聽聽聽 arr.join();
聽聽聽 int total = 0;
聽聽聽 // 絳夊緟媯紲ㄧ嚎紼嬬粨鏉燂紝騫惰緭鍑哄鐞嗙殑浜烘暟
聽聽聽 for(gate& g:vgates)
聽聽聽 {
聽聽聽 聽聽聽 g.join();
聽聽聽 聽聽聽 total += g.getcount();
聽聽聽 聽聽聽 cout<<"gate "<<g.getno()
聽聽聽 聽聽聽 聽聽聽 <<" processed "<<g.getcount()<<" viewers."<<endl;
聽聽聽 }
聽聽聽 cout<<"there are "<<total<<"viewers in total."<<endl;
聽聽聽 return 0;
}
榪欏氨鏄竴涓嚎紼嬪簱鐨勭畝鍗曞簲鐢紝妯℃嫙浜嗛潪甯稿鏉傜殑鍦烘櫙銆?/p>
鍥犱負鑷繁瀵瑰綰跨▼寮鍙戣繕涓嶅お鐔熸倝錛岃繖涓▼搴忓湪鏌愪簺鐗瑰畾鏉′歡涓嬩細浜х敓浜嗘閿侊紝榪樻湁寰呰繘涓姝ュ畬鍠?iostream>
]]>
http://imcc.blogbus.com/
C++灝忓搧錛氬悆鐏攨涓巗hared_ptr錛屾寚閽堬紝鎷瘋礉鏋勯犲嚱鏁板拰delete璇昏匱erry闂埌涓涓叧浜庢嫹璐濇瀯閫犲嚱鏁扮殑闂錛屽ぇ瀹跺彲浠ュ弬鑰?a >絳擳erry錛氭嫹璐濇瀯閫犲嚱鏁?/a>錛屽叾涓榪頒簡鎷瘋礉鏋勯犲嚱鏁扮殑蹇呰鎬э紝鐒惰岋紝浠諱綍浜嬬墿閮芥槸鍏鋒湁涓ら潰鎬х殑錛屾湁鏃跺欐垜浠渶瑕佽嚜宸卞畾涔夌被鐨勬嫹璐濇瀯閫犲嚱鏁版潵瀹屾垚綾葷殑鎷瘋礉錛岀劧鍚庯紝鏈夌殑鏃跺欙紝榪欑浠ユ嫹璐濅竴涓璞℃潵瀹屾垚鍙﹀涓涓璞$殑鍒涘緩鏄笉鍚堢悊鐨勶紙涔熷氨鏄湪鐜板疄涓栫晫涓紝榪欑瀵硅薄娌℃湁鍙鍒舵э紝渚嬪錛屼漢姘戝竵錛夛紝鏄簲璇ヨ紱佹鐨勩傛垜浠潵涓句竴涓悆鐏攨鐨勪緥瀛愶細
// 鐏攨錛屽彲浠ヤ粠涓彇鍑哄叾涓儷鐨勪笢瑗?
class hotpot
{
public:
hotpot(string f) :
food(f)
{
}
string fetch()
{
return
food;
}
private:
string food;
};
// 鍚冪伀閿呯敤鐨勭錛屽綋鐒舵槸姣忎釜浜轟笓鐢ㄧ殑
class bowl
{
public:
bowl(string o) :
owner(o)
{
}
void put(string food)
{
cout<<"put
"< }
private:
string owner;
};
// 鍚冪伀閿呯殑浜?br />class
human
{
public:
// 鍚嶅瓙鍜屽悆鐨勭伀閿?
human(string n,shared_ptr ppot) :
name(n),pot(ppot)
{
pbowl = new bowl(name);
};
//
OK浜嗭紝浠庣伀閿呬腑鍙栧嚭鏉ユ斁鍒拌嚜宸辯殑紕楅噷
void fetch()
{
string food =
pot->fetch();
// 鏀懼埌鑷繁鐨勭閲?
coutput(food);
}
private:
string name;
shared_ptr pot;
bowl* pbowl;
};
int
main()
{
// 鏈嶅姟鍛樼涓婃潵鐗涜倝鐏攨
shared_ptr fpot(new hotpot("beaf"));
//
terry鍏ュ腑
human terry("terry",fpot);
//
鍙堟潵浜嗕竴涓闄堢殑錛岃繖閲岀敤鐨勬槸榛樿鐨勬嫹璐濇瀯閫犲嚱鏁版潵鍒涘緩terry鐨勫壇鏈?br />human chen = terry;
//
terry澶逛簡涓鍧楄倝
terry.fetch();
// 闄堝厛鐢熶篃澶逛簡涓鍧楄倝
chen.fetch();
return 0;
}
鍒拌繖閲岋紝浼間箮鐪嬭搗鏉ヤ竴鍒嘜K錛岀劧鑰屼粠紼嬪簭杈撳嚭涓垜浠嵈鍙戠幇浜嗛棶棰橈細
terry put beaf into terry's bowl.
terry put beaf into terry's bowl.
O my god錛佹槑鏄庢槸涓や釜浜猴紙terry鍜宑hen錛夛紝浣嗘槸濂藉儚鍗村彧鏈変竴涓漢鍋氫簡涓ゆ錛岄檲鍏堢敓涔熸妸鑲夊姞鍒頒簡terry鐨勭閲屻?/p>
榪欏氨鏄綋綾諱腑鏈夋寚閽堢被鍨嬬殑鏁版嵁鎴愬憳鏃訛紝浣跨敤榛樿鐨勬嫹璐濇瀯閫犲嚱鏁版墍甯︽潵鐨勯棶棰橈紝瀵艱嚧鍏朵腑鐨勬煇浜涙寚閽堟垚鍛樻病鏈夎鍚堢悊鍦板垵濮嬪寲錛岃繖鍒槸褰撹繖浜涙寚閽堟寚鍚戠殑鏄笌榪欎釜瀵硅薄錛坔uman錛夋湁鎵灞炲叧緋葷殑璧勬簮錛坆owl錛夛紝鍦ㄨ繖縐嶆椂鍊欙紝鎴戜滑蹇呴』鑷繁瀹氫箟綾葷殑鎷瘋礉鏋勯犲嚱鏁幫紝瀹屾垚鎸囬拡鎴愬憳鐨勫悎鐞嗗垵濮嬪寲銆傚湪human涓坊鍔犱竴涓嫹璐濇瀯閫犲嚱鏁?/p>
human(const human& h)
{
// 涓や釜浜烘樉鐒朵笉鑳藉悓鍚嶏紝鎵浠ュ彧濂界粰涓棤鍚嶆皬浜?
name =
"unknown";
// 浣跨敤涓嶅悓鐨勭
// bowl鍜宧uman鏈夋墍灞炲叧緋伙紝鎵浠ヨ繖閲屽繀欏誨垱寤烘柊鐨勫璞?
pbowl = new
bowl(name);
// 涓嶈繃鍙互鍚冨悓涓涓伀閿?
// pot鍜宧uman騫舵病鏈夋墍灞炲叧緋伙紝鎵浠ュ彲浠ュ叡浜竴涓璞?br />pot =
h.pot;
};
娣誨姞鎷瘋礉鏋勯犳瀯閫犲嚱鏁頒箣鍚庯紝涓や釜浜轟笉浼氬皢涓滆タ鏀懼埌鍚屼竴涓涓簡錛岃嚜宸卞彇寰椾笢瑗夸笉浼氭斁鍒板埆浜虹殑紕楅噷錛?/p>
terry put beaf into terry's bowl.
unknown put beaf into unknown's
bowl.
榪欐牱淇敼濂藉浜嗭紝鑷沖皯涓や釜浜轟笉浼氱敤鍚屼竴涓浜嗐傜劧鑰岋紝榪欐牱榪樻槸鏈夐棶棰橈紝鎴戜滑鏃犳硶緇欑浜屼釜浜哄懡鍚嶏紝浠栨垚浜嗘棤鍚嶆皬浜嗭紝榪欏氨鏄被褰撲腑鐨勯偅浜涙病鏈夊彲澶嶅埗鎬х殑鏁版嵁鎴愬憳錛堜竴涓漢鐨勫悕瀛楄嚜鐒朵笉鍙互澶嶅埗緇欏彟澶栦竴涓漢錛屽鏋渉uman涓湁涓獁ife錛岄偅鑲畾瑕佷笂婕斾笘鐣屽ぇ鎴樹簡錛夛紝鎷瘋礉鏋勯犲嚱鏁板氨浼氫駭鐢熻繖鏍風殑闂銆?/p>
瀹為檯涓婏紝瀵逛簬榪欑被涓嶅叿澶囧彲澶嶅埗鎬х殑瀵硅薄錛屼負浜嗕笉寮曡搗娣蜂貢錛屽叾鎷瘋礉鏋勯犳搷浣滄槸搴斿綋琚姝㈢殑錛屾柊鏍囧噯C++11灝辨敞鎰忓埌浜嗚繖涓棶棰橈紝鎻愪緵浜嗕竴涓猟elete鍏抽敭瀛楁潵紱佺敤鏌愪簺鍙兘瀛樺湪鐨勶紙鍗充嬌浣犺瀹歨uman涓嶅彲澶嶅埗錛屼篃鏃犳硶闃繪紼嬪簭鍛樺湪浣跨敤human鏃跺啓鍑篽uman chen = terry榪欐牱鐨勪笉鍚堢悊鐨勪唬鐮侊級榛樿鐨勶紙綾葷殑鎷瘋礉鏋勯犲嚱鏁版槸榛樿鎻愪緵鐨勶紝瀵逛簬閭d簺涓嶅叿澶囧彲澶嶅埗鎬х殑綾繪潵璇達紝榪欑畝鐩存槸鐢昏泧娣昏凍錛屽ソ蹇冨姙浜嗗潖浜嬫儏錛変笉鍚堢悊鐨勬搷浣滐紝榪欐牱錛屾垜浠氨涓嶈兘浣跨敤鎷瘋礉 鏋勯犲嚱鏁頒簡錛?/p>
// 紱佺敤human鐨勬嫹璐濇瀯閫犲嚱鏁?br />human(const human& h) = delete;
緇忚繃榪欐牱鐨勫畾涔夛紝褰撴垜浠湪浠g爜涓皾璇曞皢涓涓璞″鍒剁粰鍙﹀涓涓璞★紙浼氳皟鐢ㄦ嫹璐濇瀯閫犲嚱鏁幫級鏃訛紝緙栬瘧鍣ㄥ氨浼氬嚭閿欒鎻愮ず錛屾彁閱掔▼搴忓憳錛歨i錛岃繖鏍峰彲涓嶈錛屾垜鏄嫭涓鏃犱簩鐨勶紝涓嶈兘澶熻澶嶅埗
human chen = terry;
緙栬瘧鍣ㄧ粰榪欐牱鐨勬彁紺猴細
Noname1.cpp:41:2: error: deleted function 'human::human(const
human&)'
Noname1.cpp:59:15: error: used here
鎵浠ワ紝鎬葷粨璧鋒潵錛屽湪浣跨敤鎷瘋礉鏋勯犲嚱鏁版椂錛屾湁涓や釜闇瑕佹敞鎰忕殑鍦版柟錛?/p>
5.1.2 鍑芥暟璋冪敤鏈哄埗
鍦ㄥ涔犵紪鍐欏嚱鏁頒箣鍓嶏紝鎴戜滑棣栧厛瑕佷簡瑙e嚱鏁扮殑璋冪敤鏈哄埗錛屽浼氬浣曡皟鐢ㄤ竴涓凡緇忓瓨鍦ㄧ殑鍑芥暟銆備笘鐣屼笂宸茬粡鏈夊緢澶氬嚱鏁幫紝鎴戜滑鍙互鐩存帴璋冪敤榪欎簺鍑芥暟鏉ュ畬鎴愭棩甯鎬換鍔°備笘鐣屼笂宸茬粡鏈夊緢澶氳疆瀛愶紝鎴戜滑娌℃湁蹇呰鍐嶅幓鍙戞槑鏇村鍚屾牱鐨勮疆瀛愶紝鍙渶瑕佺敤濂藉畠浠氨鍙互浜嗐傚湪瀹為檯鐨勫紑鍙戜腑錛屽彲渚涜皟鐢ㄧ殑鐜版湁鍑芥暟涓昏鏈夌紪璇戝櫒鎻愪緵鐨勫簱鍑芥暟銆乄indows API鍙婄涓夋柟鎻愪緵鐨勫嚱鏁板簱絳夈傞氳繃璋冪敤浠栦漢鐨勫嚱鏁幫紝鍙互澶嶇敤浠栦漢鐨勫紑鍙戞垚鏋滐紝鍦ㄥ叾寮鍙戞垚鏋滅殑鍩虹涓婏紝瀹炵幇蹇熷紑鍙戯紝濡傚浘5-3鎵紺恒?/p>
鏈変簡鍒漢鎻愪緵鐨勫嚱鏁幫紝灝卞彲浠ヨ皟鐢ㄨ繖浜涘嚱鏁版潵瀹屾垚鑷繁鐨勫姛鑳姐備袱涓嚱鏁頒箣闂寸殑鍏崇郴鏄皟鐢ㄤ笌琚皟鐢ㄧ殑鍏崇郴錛屾垜浠妸璋冪敤鍏朵粬鍑芥暟鐨勫嚱鏁扮О涓轟富璋冨嚱鏁幫紝琚叾浠栧嚱鏁拌皟鐢ㄧ殑鍑芥暟縐頒負琚皟鍑芥暟銆備竴涓嚱鏁版槸涓昏皟鍑芥暟榪樻槸琚皟鍑芥暟騫朵笉鏄粷瀵圭殑錛岃鏍規嵁鍏舵墍澶勭殑鐩稿浣嶇疆鑰屽畾錛氬鏋滀竴涓嚱鏁板唴閮ㄦ湁鍑芥暟錛屽垯鐩稿鍏跺唴閮ㄧ殑鍑芥暟瀹冨氨鏄富璋冨嚱鏁幫紱濡傛灉瀹冪殑澶栭儴鏈夊嚱鏁幫紝鍒欑浉瀵瑰叾澶栭儴鍑芥暟瀹冨氨鏄璋冨嚱鏁般?/p>
鍥?-3 澶╀笂鎺変笅涓嚱鏁板簱
5.1.1 灝嗙▼搴忚鍒扮瀛愪腑錛氬嚱鏁扮殑澹版槑鍜屽畾涔?/p>
鎻愰棶錛氭妸澶ц薄瑁呭埌鍐扮涓渶瑕佸嚑姝ワ紵
鍥炵瓟錛氶渶瑕佷笁姝ャ傜涓錛屾墦寮鍐扮錛涚浜岋紝鎶婂ぇ璞℃斁榪涘啺綆憋紱絎笁錛屽叧涓婂啺綆便?/p>
鎻愰棶錛氶偅涔堬紝鎶婁竴涓▼搴忔斁榪涚瀛愰渶瑕佸嚑姝ワ紵
鍥炵瓟錛氶渶瑕佷袱姝ャ傜涓錛屽0鏄庝竴涓嚱鏁幫紱絎簩錛屽畾涔夎繖涓嚱鏁般?/p>
娌¢敊錛屾妸涓涓嚱鏁版斁榪涚瀛愭瘮鎶婂ぇ璞℃斁榪涘啺綆辮繕瑕佺畝鍗曘傚綋鍒嗘瀽涓孌甸暱鐨勭▼搴忎唬鐮佹椂錛屽線寰浼氬彂鐜頒竴浜涗唬鐮佹墍瀹炵幇鐨勫姛鑳界浉瀵規瘮杈冪嫭绔嬨傛垜浠皢紼嬪簭涓繖浜涚浉瀵規瘮杈冪嫭绔嬬殑鍔熻兘浠g爜緇勭粐鍒頒竴璧鳳紝鐢ㄥ嚱鏁板鍏惰繘琛屽皝瑁咃紝涔熷氨鏄皢涓涓緝闀跨殑紼嬪簭鍒嗘斁鍒板悇涓嚱鏁扮瀛愪腑銆?/p>
瑕佽涓滆タ錛屽厛寰楀噯澶囧ソ綆卞瓙銆備負浜嗘壘鍒板叿浣撳姛鑳藉疄鐜頒唬鐮佺殑綆卞瓙錛岄渶瑕佺粰綆卞瓙璐翠笂鏍囩錛岃繖涓爣絳懼氨鏄嚱鏁扮殑澹版槑錛屽鍥?-2鎵紺恒?/p>
鍥?-2 澹版槑涓涓嚱鏁幫紝涓虹瀛愯創涓?/p>
鷗 鎶婄▼搴忚榪涚瀛愶細鐢ㄥ嚱鏁板皝瑁呯▼搴忓姛鑳?a >
鍦ㄥ畬鎴愯豹鍗庣殑宸ヨ祫緇熻紼嬪簭涔嬪悗錛屾垜浠俊蹇冨嶅錛屽紑濮嬪悜C++涓栫晫鐨勬洿娣辮繙澶勬帰绱€?/p>
鐜板湪錛屽彲浠ヤ嬌鐢ㄥ悇縐嶆暟鎹被鍨嬪拰紼嬪簭嫻佺▼鎺у埗緇撴瀯鏉ョ紪鍐欏畬鏁寸殑紼嬪簭浜嗐備絾鏄紝闅忕潃瑕佸鐞嗙殑闂瓚婃潵瓚婂鏉傦紝紼嬪簭鐨勪唬鐮佷篃瓚婃潵瓚婂鏉傦紝涓誨嚱鏁頒篃瓚婃潵瓚婇暱浜嗐傝繖灝卞儚鎴戜滑灝嗘墍鏈変笢瑗塊兘鍫嗘斁鍒頒竴涓粨搴撲腑錛岄殢鐫涓滆タ瓚婃潵瓚婂錛屼粨搴撴參鎱㈠氨琚悇縐嶄笢瑗垮爢婊′簡錛屾樉寰楁潅涔辨棤绔狅紝綆$悊璧鋒潵闈炲父鍥伴毦銆傞潰瀵逛竴涓潅涔辨棤绔犵殑浠撳簱錛岃仾鏄庣殑浠撳簱綆$悊鍛樻彁渚涗簡涓涓緢濂界殑綆$悊鍔炴硶錛氬皢涓滆タ鍒嗛棬鍒被鍦拌榪涚瀛愶紝鐒跺悗鏈夊簭鍦板爢鏀懼悇涓瀛愩?/p>
榪欎釜濂芥柟娉曚篃鍙互鐢ㄥ埌紼嬪簭璁捐涓紝鎶婄▼搴忚榪涚瀛愶紝璁╂暣涓▼搴忕粨鏋勬竻鏅般?/p>
5.1 鍑芥暟灝辨槸涓涓ぇ綆卞瓙
褰撹澶勭悊鐨勯棶棰樿秺鏉ヨ秺澶嶆潅錛岀▼搴忚秺鏉ヨ秺搴炲ぇ鐨勬椂鍊欙紝濡傛灉鎶婅繖浜涚▼搴忎唬鐮侀兘鏀懼埌涓誨嚱鏁頒腑錛屽皢浣垮緱鏁翠釜涓誨嚱鏁板紓甯歌噧鑲匡紝榪欐牱浼氱粰紼嬪簭鐨勭淮鎶ゅ甫鏉ラ夯鐑︺傚悓鏃訛紝瑕佽涓涓富鍑芥暟鏉ュ畬鎴愭墍鏈夌殑浜嬫儏錛屽嚑涔庢槸涓涓笉鍙兘瀹屾垚鐨勪換鍔°傚湪榪欑鎯呭喌涓嬶紝鍙互鏍規嵁鈥滃垎鑰屾不涔嬧濈殑鍘熷垯錛屾寜鐓у姛鑳界殑涓嶅悓灝嗗ぇ鐨勭▼搴忚繘琛屾ā鍧楀垝鍒嗭紝鍏鋒湁鐩稿悓鍔熻兘鐨勫垝鍒嗗埌鍚屼竴涓ā鍧椾腑錛岀劧鍚庡垎鍒鐞嗗悇涓ā鍧椼傚嚱鏁幫紝鍒欐垚涓烘ā鍧楀垝鍒嗙殑鍩烘湰鍗曚綅錛屾槸瀵逛竴涓皬鍨嬮棶棰樺鐞嗚繃紼嬬殑涓縐嶆娊璞°傝繖灝卞儚綆$悊涓涓粨搴擄紝鎬繪槸灝嗗悓綾葷殑涓滆タ鏀懼埌鍚屼竴涓瀛愪腑錛岀劧鍚庨氳繃綆$悊榪欎簺綆卞瓙鏉ョ鐞嗘暣涓粨搴撱傚湪鍏蜂綋鐨勫紑鍙戝疄璺典腑錛屾垜浠厛灝嗙浉瀵圭嫭绔嬬殑銆佺粡甯鎬嬌鐢ㄧ殑鍔熻兘鎶借薄涓哄嚱鏁幫紝鐒跺悗閫氳繃榪欎簺鍑芥暟鐨勭粍鍚堟潵瀹屾垚涓涓瘮杈冨ぇ鐨勫姛鑳姐備婦涓涓畝鍗曠殑渚嬪瓙錛氱湅涔︾湅寰楄倸瀛愰タ浜嗭紝鎴戜滑瑕佹場鏂逛究闈㈠悆銆傝繖鍏跺疄鏄竴涓緢澶嶆潅鐨勮繃紼嬶紝鍥犱負榪欎竴榪囩▼涓垜浠厛瑕佹礂閿咃紝鐒跺悗鐑ф按錛屾按鐑у紑鍚庡啀娉¢潰錛屽悆瀹岄潰鍚庤繕瑕佹礂紕椼傚鏋滄妸鏁翠釜榪囩▼鎻忚堪鍦ㄤ富鍑芥暟涓紝閭d箞涓誨嚱鏁頒細闈炲父澶嶆潅錛岀粨鏋勬販涔便傝繖鏃跺氨鍙互浣跨敤鍑芥暟鏉ュ皝瑁呮暣涓繃紼嬩腑鐨勪竴浜涘皬姝ラ錛岃鏁翠釜涓誨嚱鏁扮畝鍖栦負瀵硅繖浜涘嚱鏁扮殑璋冪敤錛屽鍥?-1鎵紺恒?/p>
鍥?-1 灝嗙▼搴忓皝瑁呭埌綆卞瓙錛屽垎鑰屾不涔?/p>
4.3.4 瀵瑰驚鐜繘琛屾帶鍒訛細break涓巆ontinue
// 澶ф鐨勬敹鏀粺璁$▼搴?/p>
int nTotal = 0;
int nInput = 0;
do
{
cout<< "璇瘋緭鍏ヤ綘鐨勬敹鍏ユ垨鏀嚭錛?;
cin>>nInput;
if( 1000< nInput ) // 姣涙瘺闆ㄥ晩錛屽氨涓嶇敤緇熻浜?/p>
continue;
nTotal += nInput;
}while( 0 != nInput );
鍦ㄨ繖涓ぇ嬈劇殑鏀舵敮緇熻紼嬪簭涓紝nInput鎺ユ敹鐢ㄦ埛杈撳叆鍚庡垽鏂叾鍊兼槸鍚﹀皬浜? 000錛屽鏋滃皬浜? 000錛屽垯鎵цcontinue鍏抽敭瀛楋紝璺寵繃鍚庨潰鐨勫姞鍜岃鍙モ渘Total += nInput;鈥濓紝鑰岀洿鎺ヨ煩杞埌瀵規潯浠惰〃杈懼紡鈥? != nInput鈥濈殑璁$畻錛屽垽鏂槸鍚﹀彲浠ュ紑濮嬩笅涓嬈″驚鐜傚煎緱娉ㄦ剰鐨勬槸錛屽湪for寰幆涓紝鎵цcontinue鍚庯紝鎺у埗鏉′歡鍙樺寲鐨勬洿鏀硅鍙ュ茍娌℃湁琚煩榪囷紝浠嶇劧灝嗚鎵ц錛岀劧鍚庡啀璁$畻鏉′歡琛ㄨ揪寮忥紝灝濊瘯涓嬩竴嬈″驚鐜?/p>
铏界劧break鍜宑ontinue閮芥槸鍦ㄦ煇縐嶆潯浠朵笅璺沖嚭寰幆錛屼絾鏄袱鑰呮湁鏈川鐨勫樊鍒細break鏄煩鍑烘暣涓驚鐜紝绔嬪埢緇撴潫寰幆璇彞鐨勬墽琛岋紱鑰宑ontinue鍙煩鍑烘湰嬈″驚鐜紝緇х畫鎵ц涓嬩竴嬈″驚鐜傚浘4-6灞曠ず浜哹reak鍜宑ontinue涔嬮棿鐨勫尯鍒?/p>
鍥?-6 break鍜宑ontinue涔嬮棿鐨勫尯鍒?/p>
The world is built on C++.
鈥斺?/em> Herb Sutter
鐪嬪緱鏈夎叮銆佸寰楄交鏉?/p>
鐪嬪浘涔熻兘瀛++錛燂紒
娌¢敊錛岀湅鍥句篃鑳藉C++錛?/p>
榪欐湰榪蜂綘涔︽槸銆婃垜鐨勭涓鏈珻++涔︺嬬殑榪蜂綘鐗堬紝瀹冩娊鍙栦簡銆婃垜鐨勭涓鏈珻++涔︺嬩腑鐨勫叏閮ㄧ殑綺劇編鎻掑浘錛屽茍閰嶄笂鐩稿簲鐨勮В閲婅鏄庛傚畠浠ュ浘鏂囧茍鑼傜殑鐢熷姩褰㈠紡錛屽悜浣犺瑙i偅浜涙墍璋撶殑楂樻繁鐨凜++鐭ヨ瘑錛岃浣犲閭d簺鎶借薄鐨凜++鐭ヨ瘑鏈変竴涓洿鍔犲艦璞$殑鐞嗚В錛屽悜浣犲睍紺鴻繖涓編涓借岀縐樼殑C++涓栫晫錛岃浣犲湪鏈夎叮鐨勭湅鍥捐繃紼嬩腑錛岃交鏉懼湴瀛﹀埌浜咰++鐭ヨ瘑銆?/p>
鐪嬪緱鏈夎叮銆佸寰楄交鏉?