锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 1銆佷粈涔堟槸const? 2銆佷負浠涔堝紩鍏onst錛?br>銆 const 鎺ㄥ嚭鐨勫垵濮嬬洰鐨勶紝姝f槸涓轟簡鍙栦唬棰勭紪璇戞寚浠わ紝娑堥櫎瀹冪殑緙虹偣錛屽悓鏃剁戶鎵垮畠鐨勪紭鐐廣?/p>
3銆乧ons鏈変粈涔堜富瑕佺殑浣滅敤錛?br> 錛?錛夊彲浠ュ畾涔塩onst甯擱噺錛屽叿鏈変笉鍙彉鎬с?br> 渚嬪錛?br> const int Max=100; 3銆佸浣曚嬌鐢╟onst錛?br> 錛?錛変慨楗頒竴鑸父閲?br>銆銆 涓鑸父閲忔槸鎸囩畝鍗曠被鍨嬬殑甯擱噺銆傝繖縐嶅父閲忓湪瀹氫箟鏃訛紝淇グ絎onst鍙互鐢ㄥ湪綾誨瀷璇存槑絎﹀墠錛屼篃鍙互鐢ㄥ湪綾誨瀷璇存槑絎﹀悗銆?br> 渚嬪錛?nbsp; 4銆佸嚑鐐瑰煎緱璁ㄨ鐨勫湴鏂癸細
甯哥被鍨嬫槸鎸囦嬌鐢ㄧ被鍨嬩慨楗扮const璇存槑鐨勭被鍨嬶紝甯哥被鍨嬬殑鍙橀噺鎴栧璞$殑鍊兼槸涓嶈兘琚洿鏂扮殑銆傦紙褰撶劧錛屾垜浠彲浠ュ伔姊佹崲鏌辮繘琛屾洿鏂幫細錛?/p>
int Array[Max];
錛?錛変究浜庤繘琛岀被鍨嬫鏌ワ紝浣跨紪璇戝櫒瀵瑰鐞嗗唴瀹規湁鏇村浜嗚В錛屾秷闄や簡涓浜涢殣鎮c?br> 渚嬪錛?br> void f(const int i) { .........}
緙栬瘧鍣ㄥ氨浼氱煡閬搃鏄竴涓父閲忥紝涓嶅厑璁鎬慨鏀癸紱
錛?錛夊彲浠ラ伩鍏嶆剰涔夋ā緋婄殑鏁板瓧鍑虹幇錛屽悓鏍峰彲浠ュ緢鏂逛究鍦拌繘琛屽弬鏁扮殑璋冩暣鍜屼慨鏀廣?br> 鍚屽畯瀹氫箟涓鏍鳳紝鍙互鍋氬埌涓嶅彉鍒欏凡錛屼竴鍙橀兘鍙橈紒濡傦紙1錛変腑錛屽鏋滄兂淇敼Max鐨勫唴瀹癸紝鍙渶瑕侊細const int Max=you want;鍗沖彲錛?br> 錛?錛夊彲浠ヤ繚鎶よ淇グ鐨勪笢瑗匡紝闃叉鎰忓鐨勪慨鏀癸紝澧炲己紼嬪簭鐨勫仴澹с?br> 榪樻槸涓婇潰鐨勪緥瀛愶紝濡傛灉鍦ㄥ嚱鏁頒綋鍐呬慨鏀逛簡i錛岀紪璇戝櫒灝變細鎶ラ敊錛?br> 渚嬪錛?
void f(const int i) { i=10;//error! }
(5) 涓哄嚱鏁伴噸杞芥彁渚涗簡涓涓弬鑰冦?br> class A
{
......
void f(int i) {......} file://涓涓嚱鏁?br> void f(int i) const {......} file://涓?/font>涓涓嚱鏁扮殑閲嶈澆
......
};
(6) 鍙互鑺傜渷絀洪棿錛岄伩鍏嶄笉蹇呰鐨勫唴瀛樺垎閰嶃?br> 渚嬪錛?br> #define PI 3.14159 file://甯?/font>閲忓畯
const doulbe Pi=3.14159; file://姝?/font>鏃跺茍鏈皢Pi鏀懼叆ROM涓?br> ......
double i=Pi; file://姝?/font>鏃朵負Pi鍒嗛厤鍐呭瓨錛屼互鍚庝笉鍐嶅垎閰嶏紒
double I=PI; file://緙?/font>璇戞湡闂磋繘琛屽畯鏇挎崲錛屽垎閰嶅唴瀛?br> double j=Pi; file://娌?/font>鏈夊唴瀛樺垎閰?br> double J=PI; file://鍐?/font>榪涜瀹忔浛鎹紝鍙堜竴嬈″垎閰嶅唴瀛橈紒
const瀹氫箟甯擱噺浠庢眹緙栫殑瑙掑害鏉ョ湅錛屽彧鏄粰鍑轟簡瀵瑰簲鐨勫唴瀛樺湴鍧錛岃屼笉鏄薄#define涓鏍風粰鍑虹殑鏄珛鍗蟲暟錛屾墍浠ワ紝const瀹氫箟鐨勫父閲忓湪紼嬪簭榪愯榪囩▼涓彧鏈変竴浠芥嫹璐濓紝鑰?define瀹氫箟鐨勫父閲忓湪鍐呭瓨涓湁鑻ュ共涓嫹璐濄?br> 錛?錛?鎻愰珮浜嗘晥鐜囥?br> 緙栬瘧鍣ㄩ氬父涓嶄負鏅歝onst甯擱噺鍒嗛厤瀛樺偍絀洪棿錛岃屾槸灝嗗畠浠繚瀛樺湪絎﹀彿琛ㄤ腑錛岃繖浣垮緱瀹冩垚涓轟竴涓紪璇戞湡闂寸殑甯擱噺錛屾病鏈変簡瀛樺偍涓庤鍐呭瓨鐨勬搷浣滐紝浣垮緱瀹冪殑鏁堢巼涔熷緢楂樸?/p>
int const x=2;銆銆鎴栥銆const int x=2;
錛?錛変慨楗板父鏁扮粍
銆銆 瀹氫箟鎴栬鏄庝竴涓父鏁扮粍鍙噰鐢ㄥ涓嬫牸寮忥細
銆銆 int const a[5]={1, 2, 3, 4, 5};銆
const int a[5]={1, 2, 3, 4, 5};
錛?錛変慨楗板父瀵硅薄
銆甯稿璞℃槸鎸囧璞″父閲忥紝瀹氫箟鏍煎紡濡備笅錛?br> class A;
銆銆 const A a;
A const a;
銆銆 瀹氫箟甯稿璞℃椂錛屽悓鏍瘋榪涜鍒濆鍖栵紝騫朵笖璇ュ璞′笉鑳藉啀琚洿鏂幫紝淇グ絎onst鍙互鏀懼湪綾誨悕鍚庨潰錛屼篃鍙互鏀懼湪綾誨悕鍓嶉潰銆傘
錛?錛変慨楗板父鎸囬拡
const int *A; file://const淇グ鎸囧悜鐨勫璞★紝A鍙彉錛孉鎸囧悜鐨勫璞′笉鍙彉
int const *A; 銆 file://const淇グ鎸囧悜鐨勫璞★紝A鍙彉錛孉鎸囧悜鐨勫璞′笉鍙彉
int *const A; 銆 file://const淇グ鎸囬拡A錛?nbsp; A涓嶅彲鍙橈紝A鎸囧悜鐨勫璞″彲鍙?
const int *const A; file://鎸?/font>閽圓鍜孉鎸囧悜鐨勫璞¢兘涓嶅彲鍙?br> 錛?錛変慨楗板父寮曠敤
銆浣跨敤const淇グ絎︿篃鍙互璇存槑寮曠敤錛岃璇存槑鐨勫紩鐢ㄤ負甯稿紩鐢紝璇ュ紩鐢ㄦ墍寮曠敤鐨勫璞′笉鑳借鏇存柊銆傚叾瀹氫箟鏍煎紡濡備笅錛?br>銆銆 const double & v;
銆 錛?錛変慨楗板嚱鏁扮殑甯稿弬鏁?br> const淇グ絎︿篃鍙互淇グ鍑芥暟鐨勪紶閫掑弬鏁幫紝鏍煎紡濡備笅錛?br> void Fun(const int Var);
鍛婅瘔緙栬瘧鍣╒ar鍦ㄥ嚱鏁頒綋涓殑鏃犳硶鏀瑰彉錛屼粠鑰岄槻姝簡浣跨敤鑰呯殑涓浜涙棤鎰忕殑鎴栭敊璇殑淇敼銆?nbsp;
錛?錛変慨楗板嚱鏁扮殑榪斿洖鍊鹼細
const淇グ絎︿篃鍙互淇グ鍑芥暟鐨勮繑鍥炲鹼紝鏄繑鍥炲間笉鍙鏀瑰彉錛屾牸寮忓涓嬶細
const int Fun1();
const MyClass Fun2();
錛?錛変慨楗扮被鐨勬垚鍛樺嚱鏁幫細
const淇グ絎︿篃鍙互淇グ綾葷殑鎴愬憳鍑芥暟錛屾牸寮忓涓嬶細
class ClassName
{
public:
銆 銆int Fun() const;
銆 .....
}錛?br> 榪欐牱錛屽湪璋冪敤鍑芥暟Fun鏃跺氨涓嶈兘淇敼綾婚噷闈㈢殑鏁版嵁
錛?錛夊湪鍙︿竴榪炴帴鏂囦歡涓紩鐢╟onst甯擱噺
extern const int i; file://姝?/font>紜殑寮曠敤
extern const int j=10; file://閿?/font>璇紒甯擱噺涓嶅彲浠ヨ鍐嶆璧嬪?br> 鍙﹀錛岃繕瑕佹敞鎰忥紝甯擱噺蹇呴』鍒濆鍖栵紒
渚嬪錛?br> const int i=5;
錛?錛塩onst絀剁珶鎰忓懗鐫浠涔堬紵
璇翠簡榪欎箞澶氾紝浣犺涓篶onst鎰忓懗鐫浠涔堬紵涓縐嶄慨楗扮錛熸帴鍙f娊璞★紵涓縐嶆柊綾誨瀷錛?br> 涔熻閮芥槸錛屽湪Stroustup鏈鍒濆紩鍏ヨ繖涓叧閿瓧鏃訛紝鍙槸涓哄璞℃斁鍏OM鍋氬嚭浜嗕竴縐嶅彲鑳斤紝瀵逛簬const瀵硅薄錛孋++鏃㈠厑璁稿鍏惰繘琛岄潤鎬佸垵濮嬪寲錛屼篃鍏佽瀵逛粬榪涜鍔ㄦ佸垵濮嬪寲銆傜悊鎯崇殑const瀵硅薄搴旇鍦ㄥ叾鏋勯犲嚱鏁板畬鎴愪箣鍓嶉兘鏄彲鍐欑殑錛屽湪鏋愬鍑芥暟鎵ц寮濮嬪悗涔熼兘鏄彲鍐欑殑錛屾崲鍙ヨ瘽璇達紝const瀵硅薄鍏鋒湁浠庢瀯閫犲嚱鏁板畬鎴愬埌鏋愬鍑芥暟鎵ц涔嬪墠鐨勪笉鍙樻э紝濡傛灉榪濆弽浜嗚繖鏉¤鍒欙紝緇撴灉閮芥槸鏈畾涔夌殑錛佽櫧鐒舵垜浠妸const鏀懼叆ROM涓紝浣嗚繖騫朵笉鑳藉淇濊瘉const鐨勪換浣曞艦寮忕殑鍫曡惤錛屾垜浠悗闈細緇欏嚭鍏蜂綋鐨勫姙娉曘傛棤璁篶onst瀵硅薄琚斁鍏OM涓紝榪樻槸閫氳繃瀛樺偍淇濇姢鏈哄埗鍔犱互淇濇姢錛岄兘鍙兘淇濊瘉錛屽浜庣敤鎴瘋岃█榪欎釜瀵硅薄娌℃湁鏀瑰彉銆傛崲鍙ヨ瘽璇達紝搴熸枡鏀墮泦鍣紙鎴戜滑浠ュ悗浼氳緇嗚璁猴紝榪欏氨涓絎斿甫榪囷級鎴栨暟鎹簱緋葷粺瀵逛竴涓猚onst鐨勪慨鏀規庢病鏈変換浣曢棶棰樸?br> 錛?錛変綅鍏僣onst V.S. 鎶借薄const?
瀵逛簬鍏抽敭瀛梒onst鐨勮В閲婃湁濂藉嚑縐嶆柟寮忥紝鏈甯歌鐨勫氨鏄綅鍏僣onst 鍜?鎶借薄const銆備笅闈㈡垜浠湅涓涓緥瀛愶細
class A
{
public:
......
A f(const A& a);
......
};
濡傛灉閲囩敤鎶借薄const榪涜瑙i噴錛岄偅灝辨槸f鍑芥暟涓嶄細鍘繪敼鍙樻墍寮曠敤瀵硅薄鐨勬娊璞″鹼紝濡傛灉閲囩敤浣嶅厓const榪涜瑙i噴錛岄偅灝辨垚浜唂鍑芥暟涓嶄細鍘繪敼鍙樻墍寮曠敤瀵硅薄鐨勪換浣曚綅鍏冦?br> 鎴戜滑鍙互鐪嬪埌浣嶅厓瑙i噴姝f槸c++瀵筩onst闂鐨勫畾涔夛紝const鎴愬憳鍑芥暟涓嶈鍏佽淇敼瀹冩墍鍦ㄥ璞$殑浠諱綍涓涓暟鎹垚鍛樸?br> 涓轟粈涔堣繖鏍峰憿錛熷洜涓轟嬌鐢ㄤ綅鍏僣onst鏈?涓ソ澶勶細
鏈澶х殑濂藉鏄彲浠ュ緢瀹規槗鍦版嫻嬪埌榪濆弽浣嶅厓const瑙勫畾鐨勪簨浠訛細緙栬瘧鍣ㄥ彧鐢ㄥ幓瀵繪壘鏈夋病鏈夊鏁版嵁鎴愬憳鐨勮祴鍊煎氨鍙互浜嗐傚彟澶栵紝濡傛灉鎴戜滑閲囩敤浜嗕綅鍏僣onst錛岄偅涔堬紝瀵逛簬涓浜涙瘮杈冪畝鍗曠殑const瀵硅薄錛屾垜浠氨鍙互鎶婂畠瀹夊叏鐨勬斁鍏OM涓紝瀵逛簬涓浜涚▼搴忚岃█錛岃繖鏃犵枒鏄竴涓緢閲嶈鐨勪紭鍖栨柟寮忋傦紙鍏充簬浼樺寲澶勭悊錛屾垜浠埌鏃跺欎笓闂ㄨ繘琛岃璁猴級
褰撶劧錛屼綅鍏僣onst涔熸湁緙虹偣錛岃涓嶇劧錛屾娊璞onst涔熷氨娌℃湁浜х敓鐨勫繀瑕佷簡銆?br> 棣栧厛錛屼綅鍏僣onst鐨勬娊璞℃ф瘮鎶借薄const鐨勭駭鍒洿浣庯紒瀹為檯涓婏紝澶у閮界煡閬擄紝涓涓簱鎺ュ彛鐨勬娊璞℃х駭鍒秺浣庯紝浣跨敤榪欎釜搴撳氨瓚婂洶闅俱?br> 鍏舵錛屼嬌鐢ㄤ綅鍏僣onst鐨勫簱鎺ュ彛浼氭毚闇插簱鐨勪竴浜涘疄鐜扮粏鑺傦紝鑰岃繖寰寰浼氬甫鏉ヤ竴浜涜礋闈㈡晥搴斻傛墍浠ワ紝鍦ㄥ簱鎺ュ彛鍜岀▼搴忓疄鐜扮粏鑺備笂錛屾垜浠兘搴旇閲囩敤鎶借薄const銆?br> 鏈夋椂錛屾垜浠彲鑳藉笇鏈涘const鍋氬嚭涓浜涘叾瀹冪殑瑙i噴錛岄偅涔堬紝灝辮娉ㄦ剰浜嗭紝鐩墠錛屽ぇ澶氭暟瀵筩onst鐨勮В閲婇兘鏄被鍨嬩笉瀹夊叏鐨勶紝榪欓噷鎴戜滑灝變笉涓句緥瀛愪簡錛屼綘鍙互鑷繁鑰冭檻涓涓嬶紝鎬諱箣錛屾垜浠敖閲忛伩鍏嶅const鐨勯噸鏂拌В閲娿?br> 錛?錛夋斁鍦ㄧ被鍐呴儴鐨勫父閲忔湁浠涔堥檺鍒訛紵
鐪嬬湅涓嬮潰榪欎釜渚嬪瓙錛?br> class A
{
private:
const int c3 = 7; // ???
static int c4 = 7; // ???
static const float c5 = 7; // ???
......
};
浣犺涓轟笂闈㈢殑3鍙ュ鍚楋紵鍛靛懙錛岄兘涓嶅錛佷嬌鐢ㄨ繖縐嶇被鍐呴儴鐨勫垵濮嬪寲璇硶鐨勬椂鍊欙紝甯擱噺蹇呴』鏄涓涓父閲忚〃杈懼紡鍒濆鍖栫殑鏁村瀷鎴栨灇涓劇被鍨嬶紝鑰屼笖蹇呴』鏄痵tatic鍜宑onst褰㈠紡銆傝繖鏄劇劧鏄竴涓緢涓ラ噸鐨勯檺鍒訛紒
閭d箞錛屾垜浠殑鏍囧噯濮斿憳浼氫負浠涔堝仛榪欐牱鐨勮瀹氬憿錛熶竴鑸潵璇達紝綾誨湪涓涓ご鏂囦歡涓澹版槑錛岃屽ご鏂囦歡琚寘鍚埌璁稿浜掔浉璋冪敤鐨勫崟鍏冨幓銆備絾鏄紝涓轟簡閬垮厤澶嶆潅鐨勭紪璇戝櫒瑙勫垯錛孋++瑕佹眰姣忎竴涓璞″彧鏈変竴涓崟鐙殑瀹氫箟銆傚鏋淐++鍏佽鍦ㄧ被鍐呴儴瀹氫箟涓涓拰瀵硅薄涓鏍峰崰鎹唴瀛樼殑瀹炰綋鐨勮瘽錛岃繖縐嶈鍒欏氨琚牬鍧忎簡銆?br> 錛?錛夊浣曞垵濮嬪寲綾誨唴閮ㄧ殑甯擱噺錛?br> 涓縐嶆柟娉曞氨鏄痵tatic 鍜?const 騫剁敤錛屽湪鍐呴儴鍒濆鍖栵紝濡備笂闈㈢殑渚嬪瓙錛?br> 鍙︿竴涓緢甯歌鐨勬柟娉曞氨鏄垵濮嬪寲鍒楄〃錛?br> class A
{
public:
A(int i=0):test(i) {}
private:
const int i;
}錛?br> 榪樻湁涓縐嶆柟寮忓氨鏄湪澶栭儴鍒濆鍖栵紝渚嬪錛?br> class A
{
public:
A() {}
private:
static const int i; file://娉?/font>鎰忓繀欏繪槸闈欐佺殑錛?br> }錛?br> const int A::i=3;
錛?錛夊父閲忎笌鏁扮粍鐨勭粍鍚堟湁浠涔堢壒孌婂悧錛?br> 鎴戜滑緇欏嚭涓嬮潰鐨勪唬鐮侊細
const int size[3]={10,20,50};
int array[size[2]];
鏈変粈涔堥棶棰樺悧錛熷浜嗭紝緙栬瘧閫氫笉榪囷紒涓轟粈涔堝憿錛?br> const鍙互鐢ㄤ簬闆嗗悎錛屼絾緙栬瘧鍣ㄤ笉鑳芥妸涓涓泦鍚堝瓨鏀懼湪瀹冪殑絎﹀彿琛ㄩ噷錛屾墍浠ュ繀欏誨垎閰嶅唴瀛樸傚湪榪欑鎯呭喌涓嬶紝const鎰忓懗鐫“涓嶈兘鏀瑰彉鐨勪竴鍧楀瓨鍌?#8221;銆傜劧鑰岋紝鍏跺煎湪緙栬瘧鏃朵笉鑳借浣跨敤錛屽洜涓虹紪璇戝櫒鍦ㄧ紪璇戞椂涓嶉渶瑕佺煡閬撳瓨鍌ㄧ殑鍐呭銆傝嚜鐒訛紝浣滀負鏁扮粍鐨勫ぇ灝忓氨涓嶈浜嗭細錛?br> 浣犲啀鐪嬬湅涓嬮潰鐨勪緥瀛愶細
class A
{
public:
A(int i=0):test[2]({1,2}) {} file://浣?/font>璁や負琛屽悧錛?br> private:
const int test[2];
}錛?br> vc6涓嬬紪璇戦氫笉榪囷紝涓轟粈涔堝憿錛?br> 鍏充簬榪欎釜闂錛屽墠浜涙椂闂達紝njboy闂垜鏄庝箞鍥炰簨錛熸垜鍙嶉棶浠栵細“浣犺涓哄憿錛?#8221;浠栨兂浜嗘兂錛岀粰鍑轟簡涓涓嬭В閲婏紝澶у鍙互鐪嬬湅錛氭垜浠煡閬撶紪璇戝櫒鍫嗗垵濮嬪寲鍒楄〃鐨勬搷浣滄槸鍦ㄦ瀯閫犲嚱鏁頒箣鍐咃紝鏄懼紡璋冪敤鍙敤浠g爜涔嬪墠錛屽垵濮嬪寲鐨勬搴忎緷鎹暟鎹0鏄庣殑嬈″簭銆傚垵濮嬪寲鏃舵満搴旇娌℃湁浠涔堥棶棰橈紝閭d箞灝卞彧鏈夋槸緙栬瘧鍣ㄥ鏁扮粍鍋氫簡浠涔堟墜鑴氾紒鍏跺疄鍋氫粈涔堟墜鑴氾紝鎴戜篃涓嶇煡閬擄紝鎴戝彧濂藉浠栬繘琛岀寽嫻嬶細緙栬瘧鍣ㄦ悳绱㈠埌test鍙戠幇鏄竴涓潪闈欐佺殑鏁扮粍錛屼簬鏄紝涓轟粬鍒嗛厤鍐呭瓨絀洪棿錛岃繖閲岄渶瑕佹敞鎰忎簡錛屽畠搴旇鏄竴涓嬪垎閰嶅畬錛屽茍闈炲厛鍒嗛厤test[0],鐒跺悗鍒╃敤鍒濆鍖栧垪琛ㄥ垵濮嬪寲錛屽啀鍒嗛厤test[1],榪欏氨瀵艱嚧鏁扮粍鐨勫垵濮嬪寲瀹為檯涓婃槸璧嬪鹼紒鐒惰岋紝甯擱噺涓嶅厑璁歌祴鍊鹼紝鎵浠ユ棤娉曢氳繃銆?br> 鍛靛懙錛岀湅浜嗚繖涓孌靛啝鍐曞爞鐨囩殑璇濓紝鐪熻鎴戠瑧姝諱簡錛乶jboy鍒垜鎻綘鐭憖錛氾級鎴戝姝ょ殑瑙i噴鏄繖鏍風殑錛欳++鏍囧噯鏈変竴涓瀹氾紝涓嶅厑璁告棤搴忓璞″湪綾誨唴閮ㄥ垵濮嬪寲錛屾暟緇勬樉鐒舵槸涓涓棤搴忕殑錛屾墍浠ヨ繖鏍風殑鍒濆鍖栨槸閿欒鐨勶紒瀵逛簬浠栵紝鍙兘鍦ㄧ被鐨勫閮ㄨ繘琛屽垵濮嬪寲錛屽鏋滄兂璁╁畠閫氳繃錛屽彧闇瑕佸0鏄庝負闈欐佺殑錛岀劧鍚庡垵濮嬪寲銆?br> 榪欓噷鎴戜滑鐪嬪埌錛屽父閲忎笌鏁扮粍鐨勭粍鍚堟病鏈変粈涔堢壒孌婏紒涓鍒囬兘鏄暟緇勬児鐨勭ジ錛?br> 錛?錛塼his鎸囬拡鏄笉鏄痗onst綾誨瀷鐨勶紵
this鎸囬拡鏄竴涓緢閲嶈鐨勬蹇碉紝閭h濡備綍鐞嗚В濂瑰憿錛熶篃璁歌繖涓瘽棰樺お澶т簡錛岄偅鎴戜滑緙╁皬涓浜涳細this鎸囬拡鏄釜浠涔堢被鍨嬬殑錛熻繖瑕佺湅鍏蜂綋鎯呭喌錛氬鏋滃湪闈瀋onst鎴愬憳鍑芥暟涓紝this鎸囬拡鍙槸涓涓被綾誨瀷鐨勶紱濡傛灉鍦╟onst鎴愬憳鍑芥暟涓紝this鎸囬拡鏄竴涓猚onst綾葷被鍨嬬殑錛涘鏋滃湪volatile鎴愬憳鍑芥暟涓?this鎸囬拡灝辨槸涓涓獀olatile綾葷被鍨嬬殑銆?br> 錛?錛塩onst鍒板簳鏄笉鏄竴涓噸杞界殑鍙傝冨璞★紵
鍏堢湅涓涓嬩笅闈㈢殑渚嬪瓙錛?br> class A
{
......
void f(int i) {......} file://涓涓嚱鏁?br> void f(int i) const {......} file://涓?/font>涓涓嚱鏁扮殑閲嶈澆
......
};
涓婇潰鏄噸杞芥槸娌℃湁闂鐨勪簡錛岄偅涔堜笅闈㈢殑鍛紵
class A
{
......
void f(int i) {......} file://涓涓嚱鏁?br> void f(const int i) {......} file://錛燂紵錛燂紵錛?/font>
......
};
榪欎釜鏄敊璇殑錛岀紪璇戦氫笉榪囥傞偅涔堟槸涓嶆槸璇存槑鍐呴儴鍙傛暟鐨刢onst涓嶄簣閲嶈澆鍛紵鍐嶇湅涓嬮潰鐨勪緥瀛愶細
class A
{
......
void f(int& ) {......} file://涓涓嚱鏁?br> void f(const int& ) {......} file://錛燂紵錛燂紵錛?/font>
......
};
榪欎釜紼嬪簭鏄紜殑錛岀湅鏉ヤ笂闈㈢殑緇撹鏄敊璇殑銆備負浠涔堜細榪欐牱鍛紵榪欒娑夊強鍒版帴鍙g殑閫忔槑搴﹂棶棰樸傛寜鍊間紶閫掓椂錛屽鐢ㄦ埛鑰岃█錛岃繖鏄忔槑鐨勶紝鐢ㄦ埛涓嶇煡閬撳嚱鏁板褰㈠弬鍋氫簡浠涔堟墜鑴氾紝鍦ㄨ繖縐嶆儏鍐典笅榪涜閲嶈澆鏄病鏈夋剰涔夌殑錛屾墍浠ヨ瀹氫笉鑳介噸杞斤紒褰撴寚閽堟垨寮曠敤琚紩鍏ユ椂錛岀敤鎴峰氨浼氬鍑芥暟鐨勬搷浣滄湁浜嗕竴瀹氱殑浜嗚В錛屼笉鍐嶆槸閫忔槑鐨勪簡錛岃繖鏃墮噸杞芥槸鏈夋剰涔夌殑錛屾墍浠ヨ瀹氬彲浠ラ噸杞姐?br> 錛?錛変粈涔堟儏鍐典笅涓篶onst鍒嗛厤鍐呭瓨錛?br> 浠ヤ笅鏄垜鎯沖埌鐨勫彲鑳芥儏鍐碉紝褰撶劧錛屾湁鐨勭紪璇戝櫒榪涜浜嗕紭鍖栵紝鍙兘涓嶅垎閰嶅唴瀛樸?br> A銆佷綔涓洪潪闈欐佺殑綾繪垚鍛樻椂錛?br> B銆佺敤浜庨泦鍚堟椂錛?br> C銆佽鍙栧湴鍧鏃訛紱
D銆佸湪main鍑芥暟浣撳唴閮ㄩ氳繃鍑芥暟鏉ヨ幏寰楀兼椂錛?br> E銆乧onst鐨?class鎴杝truct鏈夌敤鎴峰畾涔夌殑鏋勯犲嚱鏁般佹瀽鏋勫嚱鏁版垨鍩虹被鏃訛紱銆?br> F銆佸綋const鐨勯暱搴︽瘮璁$畻鏈哄瓧闀胯繕闀挎椂錛?br> G銆佸弬鏁頒腑鐨刢onst錛?br> H銆佷嬌鐢ㄤ簡extern鏃躲?br> 涓嶇煡閬撹繕鏈夋病鏈夊叾浠栨儏鍐碉紝嬈㈣繋楂樻墜鎸囩偣錛氾級
錛?錛変復鏃跺彉閲忓埌搴曟槸涓嶆槸甯擱噺錛?br> 寰堝鎯呭喌涓嬶紝緙栬瘧鍣ㄥ繀欏誨緩绔嬩復鏃跺璞°傚儚鍏朵粬浠諱綍瀵硅薄涓鏍鳳紝瀹冧滑闇瑕佸瓨鍌ㄧ┖闂磋屼笖蹇呴』琚瀯閫犲拰鍒犻櫎銆傚尯鍒槸鎴戜滑浠庢潵鐪嬩笉鍒扮紪璇戝櫒璐熻矗鍐沖畾瀹冧滑鐨勫幓鐣欎互鍙婂畠浠瓨鍦ㄧ殑緇嗚妭銆傚浜嶤++鏍囧噯鑽夋鑰岃█錛氫復鏃跺璞¤嚜鍔ㄥ湴鎴愪負甯擱噺銆傚洜涓烘垜浠氬父鎺ヨЕ涓嶅埌涓存椂瀵硅薄錛屼笉鑳戒嬌鐢ㄤ笌涔嬬浉鍏崇殑淇℃伅錛屾墍浠ュ憡璇変復鏃跺璞″仛涓浜涙敼鍙樻湁鍙兘浼氬嚭閿欍傚綋鐒訛紝榪欎笌緙栬瘧鍣ㄦ湁鍏籌紝渚嬪錛歷c6銆乿c7閮藉姝や綔浜嗘墿灞曪紝鎵浠ワ紝鐢ㄤ復鏃跺璞″仛宸﹀鹼紝緙栬瘧鍣ㄥ茍娌℃湁鎶ラ敊銆?br> 錛?0錛変笌static鎼厤浼氫笉浼氭湁闂錛?br> 鍋囪鏈変竴涓被錛?br> class A
{
public:
......
static void f() const { ......}
......
};
鎴戜滑鍙戠幇緙栬瘧鍣ㄤ細鎶ラ敊錛屽洜涓哄湪榪欑鎯呭喌涓媠tatic涓嶈兘澶熶笌const鍏卞瓨錛?br> 涓轟粈涔堝憿錛熷洜涓簊tatic娌℃湁this鎸囬拡錛屼絾鏄痗onst淇グthis鎸囬拡錛屾墍浠?..
錛?1錛夊浣曚慨鏀瑰父閲忥紵
鏈夋椂鍊欐垜浠嵈涓嶅緱涓嶅綾誨唴鐨勬暟鎹繘琛屼慨鏀癸紝浣嗘槸鎴戜滑鐨勬帴鍙e嵈琚0鏄庝簡const錛岄偅璇ユ庝箞澶勭悊鍛紵鎴戝榪欎釜闂鐨勭湅娉曞涓嬶細
1錛夋爣鍑嗙敤娉曪細mutable
class A
{
public:
A(int i=0):test(i) { }
void SetValue(int i)const { test=i; }
private:
mutable int test; file://榪?/font>閲屽鐞嗭紒
}錛?br> 2錛夊己鍒惰漿鎹細const_cast
class A
{
public:
A(int i=0):test(i) { }
void SetValue(int i)const
{ const_cast <int>(test)=i; }//榪欓噷澶勭悊錛?br> private:
int test;
}錛?br> 3錛夌伒媧葷殑鎸囬拡錛歩nt*
class A
{
public:
A(int i=0):test(i) { }
void SetValue(int i)const
{ *test=i; }
private:
int* test; file://榪?/font>閲屽鐞嗭紒
}錛?br> 4錛夋湭瀹氫箟鐨勫鐞?br> class A
{
public:
A(int i=0):test(i) { }
void SetValue(int i)const
{ int *p=(int*)&test; *p=i; }//榪欓噷澶勭悊錛?br> private:
int test;
}錛?br> 娉ㄦ剰錛岃繖閲岃櫧鐒惰鍙互榪欐牱淇敼錛屼絾緇撴灉鏄湭瀹氫箟鐨勶紝閬垮厤浣跨敤錛?br> 5錛夊唴閮ㄥ鐞嗭細this鎸囬拡
class A
{
public:
A(int i=0):test(i) { }
void SetValue(int i)const
{ ((A*)this)->test=i; }//榪欓噷澶勭悊錛?br> private:
int test;
}錛?br> 6錛夋渶鍙︾被鐨勫鐞嗭細絀洪棿甯冨眬
class A
{
public:
A(int i=0):test(i),c('a') { }
private:
char c;
const int test;
};
int main()
{
A a(3);
A* pa=&a;
char* p=(char*)pa;
int* pi=(int*)(p+4錛夛紱//鍒╃敤杈圭紭璋冩暣
*pi=5; file://姝?/font>澶勬敼鍙樹簡test鐨勫鹼紒
return 0;
}
铏界劧鎴戠粰鍑轟簡6涓柟娉曪紝浣嗘槸鎴戝彧鏄兂璇存槑濡備綍鏇存敼錛屼絾鍑轟簡絎竴縐嶇敤娉曚箣澶栵紝鍙﹀5縐嶇敤娉曪紝鎴戜滑騫朵笉鎻愬★紝涓嶈鍥犱負鎴戣繖涔堝啓浜嗭紝浣犲氨榪欎箞鐢紝鍚﹀垯錛屾垜鐪熸槸瑕佽浜哄瓙寮熶簡錛氾級
錛?2錛夋渶鍚庢垜浠潵璁ㄨ涓涓嬪父閲忓璞$殑鍔ㄦ佸垱寤恒?br> 鏃㈢劧緙栬瘧鍣ㄥ彲浠ュ姩鎬佸垵濮嬪寲甯擱噺錛屽氨鑷劧鍙互鍔ㄦ佸垱寤猴紝渚嬪錛?br> const int* pi=new const int(10);
榪欓噷瑕佹敞鎰?鐐癸細
1錛塩onst瀵硅薄蹇呴』琚垵濮嬪寲錛佹墍浠?10)鏄笉鑳藉灝戠殑銆?br> 2錛塶ew榪斿洖鐨勬寚閽堝繀欏繪槸const綾誨瀷鐨勩?br> 閭d箞鎴戜滑鍙笉鍙互鍔ㄦ佸垱寤轟竴涓暟緇勫憿錛?br> 絳旀鏄惁瀹氱殑錛屽洜涓簄ew鍐呯疆綾誨瀷鐨勬暟緇勶紝涓嶈兘琚垵濮嬪寲銆?br> 榪欓噷鎴戜滑蹇借浜嗘暟緇勬槸綾葷被鍨嬬殑錛屽悓鏍峰浜庣被鍐呴儴鏁扮粍鍒濆鍖栨垜浠篃鍋氬嚭浜嗚繖鏍風殑蹇借錛屽洜涓鴻繖娑夊強鍒版暟緇勭殑闂錛屾垜浠互鍚庡啀璁ㄨ銆?br>
]]>
]]>
F錛氬畯瀹氫箟涔熷彲浠ュ疄鐜伴噸鐢紝涓轟粈涔堜笉浣跨敤瀹忥紵
Q錛氬畯閬垮紑C++綾誨瀷媯鏌ユ満鍒訛紝涓や釜涓嶅悓綾誨瀷鍙傛暟涔嬮棿鐨勬瘮杈冨皢浼氬鑷撮敊璇?/span>
妯℃澘錛屾ā鏉垮嚱鏁幫紝妯℃澘綾誨拰瀵硅薄涔嬮棿鐨勫叧緋匯?/span>
妯℃澘 錛堝嚱鏁版ā鏉垮拰綾繪ā鏉匡級 妯℃澘鍑芥暟 妯℃澘綾?/span> 瀵硅薄
妯℃澘 錛堝嚱鏁版ā鏉垮拰綾繪ā鏉匡級 妯℃澘鍑芥暟 妯℃澘綾?/span> 瀵硅薄
渚嬪錛?/span>
妯℃澘褰㈠弬灝?/span>T瀹炰緥鍖栫殑鍙傛暟銆?/span>
鍑芥暟妯℃澘鏄竴涓笉瀹屽叏鐨勫嚱鏁幫紝棣栧厛闇瑕佸皢妯℃澘褰㈠弬T瀹炰緥鍖栦負紜畾鐨勭被鍨嬨傝繖涓被鍨嬪彲浠ユ槸棰勫畾涔夌殑錛屼篃鍙互鏄敤鎴瘋嚜瀹氫箟銆?/span>
妯℃澘鍑芥暟鐨勫紓甯?/span>
1 鍏堣皟鐢ㄩ『搴忛伒寰粈涔堢害瀹氾紵
錛?/span>1錛夊鎵劇被鍨嬪畬鍏ㄥ尮閰嶇殑鍑芥暟銆?/span>
錛?/span>2錛夊鎵懼嚱鏁版ā鏉匡紝瀹炰緥鍖栧悗錛屼駭鐢熷尮閰嶇殑妯℃澘鍑芥暟銆?/span>
錛?/span>3錛夎嫢錛?/span>1錛夛紙2錛夊け璐ワ紝灝濊瘯浣庝竴綰х殑瀵瑰嚱鏁伴噸杞界殑鏂規硶銆備緥濡傦紝閫氳繃綾誨瀷杞崲銆?/span>
錛?/span>4錛夛紙1錛夛紙2錛夛紙3錛夐兘涓哄尮閰嶏紝鍒欐槸涓涓敊璇?/span>
2 鍏堜簡瑙d簡榪欐牱鐨勭害瀹氾紝灝卞緢瀹規槗鐞嗚В浠ヤ笅錛?/span>
鐢ㄩ潪妯℃澘鍑芥暟閲嶈澆鍑芥暟妯℃澘錛屽彧澹版槑闈炴ā鏉跨被鍑芥暟鐨勫師鍨嬶紝涓嶇粰鍑哄嚱鏁頒綋錛岃屽嚱鏁頒綋鍊熺敤鍑芥暟妯℃澘鐨勫嚱鏁頒綋銆?/span>
渚嬪錛?/span>
template <class T>
T max( T x, T y)
{
return( x > y )? x : y;
}
int max( int, int);
//int max 閲嶈澆浜嗗嚱鏁版ā鏉跨殑鍑芥暟浣擄紱
int i;
char c;
max錛?/span>i, c錛?/span>;
3 瀹氫箟涓涓畬鏁寸殑鏈夊嚱鏁頒綋鐨勯潪妯℃澘鍑芥暟銆?/span>
姣斿錛?/span>max(char, char)鏃訛紝涓婇潰鐨勫嚱鏁版ā鏉夸笉鑳芥瘮杈冩瘮涓涓瓧絎︽洿闀跨殑瀛楃涓蹭簡銆?/span>
鎵浠ワ紝鍍忎竴鑸殑閲嶈澆鍑芥暟涓鏍峰畾涔夈?/span>
char *max( char *x, char *y )
{
return ( strcmp(x, y) > 0 ) ? x 錛?/span>y錛?/span>
}
char * max閲嶈澆浜嗗嚱鏁版ā鏉匡紝褰撹皟鐢ㄤ負錛?/span>
max ( “abcd”, “efgh” ); 灝嗘墽琛屾鍑芥暟銆?/span>
class A
{ …
private:
A(const A &a); // 縐佹湁鐨勬嫹璐濇瀯閫犲嚱鏁?span lang=EN-US>
A & operate =(const A &a); // 縐佹湁鐨勮祴鍊煎嚱鏁?span lang=EN-US>
};
濡傛灉鏈変漢璇曞浘緙栧啓濡備笅紼嬪簭錛?/span>
A b(a); // 璋冪敤浜嗙鏈夌殑鎷瘋礉鏋勯犲嚱鏁?span lang=EN-US>
b = a; // 璋冪敤浜嗙鏈夌殑璧嬪煎嚱鏁?span lang=EN-US>
緙栬瘧鍣ㄥ皢鎸囧嚭閿欒錛屽洜涓哄鐣屼笉鍙互鎿嶄綔A鐨勭鏈夊嚱鏁般?/span>
浣嗘槸鎬庢牱鎵嶈兘浣跨敤鏋勯犳嫹璐濆拰璧嬪煎嚱鏁板憿錛?/span>
铏氭嫙鍑芥暟浣跨敤錛?/span>C++exams\destructor
鍦ㄧ紪鍐欐淳鐢熺被鐨勮祴鍊煎嚱鏁版椂錛屾敞鎰忎笉瑕佸繕璁板鍩虹被鐨勬暟鎹垚鍛橀噸鏂拌祴鍊箋備緥濡傦細
鏋愭瀯鍑芥暟
鏋勯犲嚱鏁板垵濮嬪寲琛細鏋勯犲嚱鏁扮壒孌婄殑鍒濆鍖栨柟寮?#8220;鍒濆鍖栬〃杈懼紡琛?#8221;錛堢畝縐板垵濮嬪寲琛級銆?/p>
鍒濆鍖栬〃浣嶄簬鍑芥暟鍙傛暟琛ㄤ箣鍚庯紝鍗村湪鍑芥暟浣?{} 涔嬪墠銆傝繖璇存槑璇ヨ〃閲岀殑鍒濆鍖栧伐浣滃彂鐢熷湪鍑芥暟浣撳唴鐨勪換浣曚唬鐮佽鎵ц涔嬪墠銆?/p>
瑙勫垯
u 濡傛灉綾誨瓨鍦ㄧ戶鎵垮叧緋伙紝媧劇敓綾誨繀欏誨湪鍏跺垵濮嬪寲琛ㄩ噷璋冪敤鍩虹被鐨勬瀯閫犲嚱鏁般?/p>
u 綾葷殑const甯擱噺鍙兘鍦ㄥ垵濮嬪寲琛ㄩ噷琚垵濮嬪寲錛屽洜涓哄畠涓嶈兘鍦ㄥ嚱鏁頒綋鍐呯敤璧嬪肩殑鏂瑰紡鏉ュ垵濮嬪寲銆?/p>
u 綾葷殑鏁版嵁鎴愬憳鐨勫垵濮嬪寲鍙互閲囩敤鍒濆鍖栬〃鎴栧嚱鏁頒綋鍐呰祴鍊間袱縐嶆柟寮忥紝榪欎袱縐嶆柟寮忕殑鏁堢巼涓嶅畬鍏ㄧ浉鍚屻?/p>
鏁堢巼
1 鍐呴儴鎴愬憳錛?/p>
鍒濆鍖栬〃鍜屽嚱鏁頒綋鍐呰祴鍊奸兘鍙互錛屼絾鏁堢巼涓嶅畬鍏ㄧ浉鍚岋紝浣嗗悗鑰呮洿涓烘竻鏅扮洿瑙傘?/p>
渚嬪瓙錛?/p>
class F
{
public:
F(int x, int y); // 鏋勯犲嚱鏁?/p>
private:
int m_x, m_y;
int m_i, m_j;
}
F::F(int x, int y) : m_x(x), m_y(y) { m_i = 0; m_j = 0; } |
F::F(int x, int y) { m_x = x; m_y = y; m_i = 0; m_j = 0; } |
紺轟緥9-2(c) 鏁版嵁鎴愬憳鍦ㄥ垵濮嬪寲琛ㄤ腑琚垵濮嬪寲 紺轟緥9-2(d) 鏁版嵁鎴愬憳鍦ㄥ嚱鏁頒綋鍐呰鍒濆鍖?/p>
涓ょ鏂瑰紡鏁堢巼鍖哄埆涓嶅ぇ銆?/p>
2 闈炲唴閮ㄦ垚鍛橈細
鍙兘鐢ㄥ垵濮嬪寲琛紝鎻愰珮鏁堢巼銆?/p>
渚嬪瓙錛?/p>
class A
{…
A(void); // 鏃犲弬鏁版瀯閫犲嚱鏁?/p>
A(const A &other); // 鎷瘋礉鏋勯犲嚱鏁?/p>
A & operate =( const A &other); // 璧嬪煎嚱鏁?/p>
}錛?/p>
class B
{
public:
B(const A &a); // B鐨勬瀯閫犲嚱鏁?/p>
private:
A m_a; // 鎴愬憳瀵硅薄
};
姣旇緝涓庡垎鏋愶細
B::B(const A &a) : m_a(a) { … } |
B::B(const A &a) { m_a = a; … } |
1 B綾繪瀯閫犲嚱鏁扮殑鍒濆鍖栭噷錛岃皟鐢ㄤ簡A綾葷殑鎷瘋礉鏋勯犲嚱鏁般?/p>
2 B綾繪瀯閫犲垵濮嬪寲閲岋紝闅愯棌浜嗕互涓嬪嚑涓楠わ細
鍏堝垱寤轟簡a瀵硅薄錛岃皟鐢ㄤ簡A綾葷殑鏃犲弬鏁版瀯閫犲嚱鏁幫紱
鎶奱璧嬪肩粰m_a錛岃皟鐢ㄤ簡A綾葷殑璧嬪煎嚱鏁幫紱
娣卞叆鎺㈣錛?/p>
鏋勯犲拰鏋愭瀯鐨勬搴忥紵
鏋勯犱粠鏈娣卞鐨勫熀綾誨紑濮嬬殑錛屽厛涓灞傚眰璋冪敤鍩虹被鐨勬瀯閫犲嚱鏁幫紝鐒跺悗璋冪敤鎴愬憳瀵硅薄鐨勬瀯閫犲嚱鏁般?/p>
鑰屾瀽鏋勫嚱鏁頒弗鏍兼寜鐓ф瀯閫犲嚱鏁扮浉鍙嶇殑嬈″簭鎵ц錛岃嬈″簭鍞竴錛屼互渚胯緙栬瘧鍣ㄨ嚜鍔ㄦ墽琛屾瀽鏋勫嚱鏁般?/p>
鐗瑰埆涔嬪鏄紝鎴愬憳瀵硅薄鍒濆鍖栨搴忎笉鍙楁瀯閫犲嚱鏁板垵濮嬪寲琛ㄦ搴忓獎鍝嶏紝鐢卞湪綾諱腑澹版槑鐨勬搴忓喅瀹氥傝岀被澹版槑鏄敮涓鐨勶紝鏋勯犲嚱鏁板嵈鍙兘鏈夊涓紝鎵浠ユ湁澶氫釜涓嶅悓嬈″簭鍑芥暟鍒濆鍖栬〃銆傚鏋滄寜鐓ф瀯閫犲嚱鏁扮殑嬈″簭鏋勯狅紝閭d箞瑙f瀽鍑芥暟涓嶈兘寰楀埌鍞竴鐨勯嗗簭銆?/p>
#define OTL_ORA7 // Compile OTL 3.1/OCI7
#include <otlv4.h> // include the OTL 4 header file
otl_connect db; // connect object
void insert()
// insert rows into table
{
otl_stream o(50, // buffer size
"insert into test_tab values(:f1<float>,:f2<char[31]>)",
// SQL statement
db // connect object
);
char tmp[32];
for(int i=1;i<=100;++i){
sprintf(tmp,"Name%d",i);
o<<(float)i<<tmp;
}
}
void select()
{
otl_stream i(50, // buffer size
"select * from test_tab where f1>=:f<int> and f1<=:f*2",
// SELECT statement
db // connect object
);
// create select stream
float f1;
char f2[31];
i<<8; // assigning :f = 8
// SELECT automatically executes when all input variables are
// assigned. First portion of output rows is fetched to the buffer
while(!i.eof()){ // while not end-of-data
i>>f1>>f2;
cout<<"f1="<<f1<<", f2="<<f2<<endl;
}
i<<4; // assigning :f = 4
// SELECT automatically executes when all input variables are
// assigned. First portion of output rows is fetched to the buffer
while(!i.eof()){ // while not end-of-data
i>>f1>>f2;
cout<<"f1="<<f1<<", f2="<<f2<<endl;
}
}
int main()
{
otl_connect::otl_initialize(); // initialize OCI environment
try{
db.rlogon("scott/tiger"); // connect to Oracle
otl_cursor::direct_exec
(
db,
"drop table test_tab",
otl_exception::disabled // disable OTL exceptions
); // drop table
otl_cursor::direct_exec
(
db,
"create table test_tab(f1 number, f2 varchar2(30))"
); // create table
insert(); // insert records into table
select(); // select records from table
}
catch(otl_exception& p){ // intercept OTL exceptions
cerr<<p.msg<<endl; // print out error message
cerr<<p.stm_text<<endl; // print out SQL that caused the error
cerr<<p.var_info<<endl; // print out the variable that caused the error
}
db.logoff(); // disconnect from Oracle
return 0;
}
Any SQL statement, PL/SQL block or a stored procedure call is characterized by its input / output [variables].
Example 1. A SELECT statement has scalar input variables that are used in the WHERE clause of the statement. The SELECT statement also defines output columns. Potentially, the output columns are vector parameters since the SELECT statement may return multiple rows.
Example 2. An INSERT statement writes data into a table, i.e. it has input parameters. Same is true for UPDATE statemements.
Example 3. A DELETE statement deletes rows from a table. Deletion criteria needs to be entered, thus the DELETE statement has input.
Example 4. A stored procedure may have input and/or output parameters. Usually, stored procedure parameters are scalars. There is a special case, though: stored procedure returning a referenced cursor (Oracle) or a result set (MS SQL Server or Sybase).
Example 5. An arbitrary PL/SQL block may have input or/and output parameters that may be either scalars or vectors.
Industrial strength database servers have bulk (or array) operations:
Therefore, parameters in INSERT/UPDATE/DELETE statement may be vectors if the statement is performed in bulk.
The picture is clear: any interaction with SQL or its procedural extension can be treated as a black box with input and/or output. It does not matter what the black box does inside (according to the definition of a black box). What matters is the input wires that send signals into the box and the output wires that receive signals from the box:
Some of the wires may be both input and output.
Why not combine the concept of data streams and SQL? Instead of multiplying constructs and making database API's too convoluted, why not unify and simplify them? The OTL gives an answer to those questions and the answer is the otl_stream class.
Since a SQL statement may be done in bulk, the otl_stream is a buffered stream. Conceptually, the otl_stream has two separate buffers: input and output. The input buffer is comprised of all input variables put together. Respectively, the output buffer is comprised of all output variables put together.
C++ streams are usually manipulated via operator >> and operator <<. The stream reference is on the left of the operator symbol:
s>>variable; s<<variable;
The double arrow shows the direction in which data goes:
OTL streams are similar to buffered C++ streams . A SQL statement or stored procedure call is opened as an ordinary buffered stream. The logic of the OTL stream operations remains the same as the C++ stream operations with the only exception -- the OTL stream has separate input and output buffers which may overlap.
The OTL stream has a flush function for flushing its input buffer when the buffer gets full and a collection of >> and << operators for reading and writing objects of different data types. The most important advantage of the OTL streams is their unified interface to SQL statements and stored procedure call of any kind. This means that the application developer needs to remember just a few syntactical constructs and function names which he already got familiar with when he started working with C++ streams.
Inside the OTL stream there is a small parser for parsing declarations of bind variables and their data types. There is no need to declare C/C++ host variables and bind them with placeholders by special bind function calls. All necessary buffers are created dynamically inside the stream. The stream just needs to be opened for reading and writing values.
The OTL stream interface requires use of the OTL exceptions. This means that potentially any OTL stream operation can throw an exception of the otl_exception type. In order to intercept the exception and prevent the program from aborting, wrap up the OTL stream code with the corresponding try & catch block.
The functioning of the otl_stream is pretty much automatic: when all of the input variables of the stream are defined (in other words, the input buffer is filled out), it triggers the block box inside the stream to execute. The output buffer gets filled out in the process of the execution of the black box. After the execution is finished, the output values can be read from the stream. If it is a SELECT statement and it returns more rows than the output buffer can hold, after the whole output buffer is read, then the stream automatically fetches the next bacth of rows into the output buffer.
OTL 4.0 was designed as a combination of a C++ template framework and OTL-adapters. The framework is a generic implementation of the concept of OTL streams. The OTL-adapters are thin wrappers around the database APIs and are used as class type parameters to be substituted into the template framework.
OTL 4.0 covers the functionality of a whole database API with just a handful of concrete classes: otl_stream, otl_connect, otl_exception, otl_long_string, and several template PL/SQL (Oracle) table container classes, generated from the template framework and the OTL-adapters.
The OTL code gets expanded into direct database API function calls, so it provides ultimate performance, reliability and thread safety in multi-processor environments as well as traditional batch programs. OTL 4.0, being a template library, is highly portable since it is self-sufficient and compact enough.
OTL 4.0 is ANSI C++ compliant (ANSI C++ typecasts, clean templatized code, etc.), tightly integrated with the Standard Template Library (STL) via so-called STL-compliant stream iterators, and natively supports the STL std::string's in otl_stream's.
The current version of the OTL supports Oracle 7 (natively via OCI7), Oracle 8 (natively via OCI8), Oracle 8i (natively via OCI8i), Oracle 9i (natively via OCI9i), Oracle 10g (natively via OCI10g), DB2 (natively via DB2 CLI), ODBC 3.x as well as ODBC 2.5 compliant data sources in MS Windows and Unix (e.g. Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS, etc.). The list of supported database backends is constantly growing.
鏁?/span>C++涓紝鐢ㄥ唴鑱斿彇浠f墍鏈夊畯錛屼絾鍦?/span>Debug鐗堟湰涓紝assert鏄緥澶栥?/span>
assert涓嶄駭鐢熶換浣曞壇浣滅敤錛岃皟鐢ㄥ嚱鏁頒細寮曡搗鍐呭瓨銆佷唬鐮佺殑鍙樺姩錛屾墍浠?/span>assert鏄畯銆?/span>
鍐呰仈鏍煎紡錛?/span>
void Foo(int x, int y);
inline void Foo(int x, int y) // inline涓庡嚱鏁板畾涔変綋鏀懼湪涓璧?span lang=EN-US>
{
…
}
鐢ㄤ簬瀹炵幇鐨勫叧閿瓧錛岃岄潪鐢ㄤ簬澹版槑鐨勫叧閿瓧銆?/span>
鍦ㄧ被涓殑瑙勮寖鏍煎紡錛?/span>
class A
{
public:
void Foo(int x, int y)錛?span lang=EN-US>
}
// 瀹氫箟鏂囦歡
inline void A::Foo(int x, int y)
{
…
}
浠涔堟儏鍐典笉閫傚悎浣跨敤鍐呰仈錛?/span>
1 鍐呰仈鍑芥暟浠g爜杈冮暱錛屽鑷村唴瀛樻秷鑰楄緝楂樸?/span>
2 鍐呰仈鍑芥暟鍖呮嫭寰幆錛屾墽琛屽唴鑱斿嚱鏁頒唬鐮佹瘮璋冪敤鍑芥暟鐨勫紑閿澶с?/span>
F錛氫負浠涔堟瀯閫犲拰瑙f瀽鍑芥暟涓嶄嬌鐢ㄥ唴鑱旓紵
Q錛氬洜涓烘瀽鏋勫嚱鏁板彲鑳?#8220;闅愯棌”涓浜涜涓猴紝渚嬪鎵ц鍩虹被鎴栨垚鍛樺璞$殑鏋愭瀯榪囩▼銆?/span>
鏈夋椂鍊欑紪璇戝櫒浼氳嚜鍔ㄥ彇娑堜竴浜涗笉鍊煎緱鐨勫唴鑱旓紝鎵浠ュ湪澹版槑鏃朵笉鍐?/span>inline鏄悎鐞嗙殑銆?/span>