锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
榪欑闇姹傚緢澶?鍙堝洜涓篊++鍜孋鏄袱縐嶅畬鍏ㄤ笉鍚岀殑緙栬瘧閾炬帴澶勭悊鏂瑰紡,鎵浠ヨ紼嶅姞澶勭悊.鎬葷粨澶ц嚧鏈変袱澶х被瀹炵幇鏂規硶.
鏂囦腑緇欏嚭鐨勬槸瀹屾暣鐨?鍏蜂綋鐨?浣嗗張鏈鍩烘湰鏈綆鍗曠殑瀹炵幇,鑷充簬鐞嗚鎬х殑涓滆タ鍦ㄧ綉涓婂緢瀹規槗鎼滅儲鐨勫埌.
涓.閫氳繃澶勭悊琚皟鐢ㄧ殑C澶存枃浠?/strong>
a.h:
#ifndef __A_H
#define __A_H
#ifdef __cplusplus
extern "C" {
#endif
int ThisIsTest(int a, int b);
#ifdef __cplusplus
}
#endif
#endif
a.c:
#include "a.h"
int ThisIsTest(int a, int b) {
return (a + b);
}
aa.h:
class AA {
public:
int bar(int a, int b);
};
aa.cpp:
#include "a.h"
#include "aa.h"
#include "stdio.h"
int AA::bar(int a, int b){
printf("result=%d\n", ThisIsTest(a, b));
return 0;
}
main.cpp:
#include "aa.h"
int main(int argc, char **argv){
int a = 1;
int b = 2;
AA* aa = new AA();
aa->bar(a, b);
delete(aa);
return(0);
}
Makefile:
all:
gcc -Wall -c a.c -o a.o
gcc -Wall -c aa.cpp -o aa.o
gcc -Wall -c main.cpp -o main.o
g++ -o test *.o
浜? 閫氳繃澶勭悊璋冪敤鐨凜++鏂囦歡
鎭㈠a.h鏂囦歡涓轟竴鑸澶存枃浠?鍦╝a.cpp鏂囦歡涓璭xtern鍖呭惈a.h澶存枃浠舵垨鍑芥暟.
a.h:
#ifndef __A_H
#define __A_H
int ThisIsTest(int a, int b);
#endif
aa.cpp:
extern "C"
{
#include "a.h"
}
#include "aa.h"
#include "stdio.h"
int AA::bar(int a, int b){
printf("result=%d\n", ThisIsTest(a, b));
return 0;
}
or
aa.cpp:
#include "aa.h"
#include "stdio.h"
extern "C"
{
int ThisIsTest(int a, int b);
}
int AA::bar(int a, int b){
printf("result=%d\n", ThisIsTest(a, b));
return 0;
}
typedef const char* ShapeType;
typedef IShape* (*Creator)();
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞ShapeFactory.h錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
class ShapeFactory {
public:
static ShapeFactory& Instance() {
static ShapeFactory instance;
return instance;
}
IShape* Create(ShapeType shapeType);
bool RegisterShape(ShapeType shapeType, Creator creator);
private:
ShapeFactory() {}
std::map<ShapeType, Creator> shapeCreators;
};
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞ShapeFactory.cpp錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
#include "CFactory.h"
IShape* ShapeFactory::Create(ShapeType shapeType) {
Creator creator = shapeCreators.find( shapeType )->second;
if ( creator == NULL )
{
return NULL;
}
return creator();
}
bool ShapeFactory::RegisterShape( ShapeType shapeType, Creator creator ) {
map<ShapeType, Creator>::iterator iter;
iter = shapeCreators.find(shapeType);
if(iter != shapeCreators.end())
{
return false;
} else {
shapeCreators[shapeType] = creator;
return true;
}
}
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞CCircle .h錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
#include<stdio.h>
#include "IShape.h"
#include "CFactory.h"
class CCircle : public IShape
{
public:
CCircle()
{
printf("\n CCircle\n");
}
virtual ~CCircle()
{
printf("\n ~CCircle\n");
}
virtual void Draw();
};
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞CCircle .cpp錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
#include "CCircle.h"
IShape* Create() { return new CCircle(); }
static const bool RegisterShape__ = ShapeFactory::Instance().RegisterShape( "CCircle", Create);
void CCircle::Draw()
{
printf("\n CCircle::Draw\n");
}
錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞main.cpp錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞
#include<stdio.h>
#include"CFactory.h"
#include "IShape.h"
int main() {
IShape* line = ShapeFactory::Instance().Create("CCircle");
line->Draw();
return 0;
}
鏈夌偣灝忓皬鐨勫叴濂嬶紝澶у縐瀬鍙戣█鍝燂紒錛侊紒
涓昏鍙傝冿細 http://blog.csdn.net/jicao/archive/2006/07/01/861343.aspx
http://blog.csdn.net/hjsunj/archive/2008/01/07/2028597.aspx
銆奵++璁捐鏂版濈淮銆?/p>
澹版槑閲岄潰鍙互鍖呮嫭鐨勫厓绱犳湁錛?/span>綾誨瀷璇存槑絎?/span>(int, void, char,struct...)錛屽瓨鍌ㄧ被鍨?/span>extern, static, register, 綾誨瀷闄愬畾絎?/span>(const, volatile), 鍙橀噺鍚?/span>(鏍囪瘑絎?/span>), 絎﹀彿(*錛?/span>鍦嗘嫭鍙峰拰涓嫭鍙?/span>)錛?/span>
鎬諱綋鍘熷垯鏄紝鎵懼埌鏍囪瘑絎?/span>(鍗蟲槸鎴?/span>浠鉤鏃跺彨鐨勫彉閲忓悕)錛屼粠鍙沖悜宸﹁В鏋愶紱
鍏蜂綋姝?/span>楠ゅ涓嬶細
1. 鎵懼埌澹版槑涓渶宸?/span>杈圭殑鏍囪瘑絎?/span>,鍘繪帀鏍囪瘑絎?/span> => 鍙橀噺鏄彨“鏍囪瘑絎?/span>”
2. 鏌ョ湅鏍囪瘑絎﹀彸杈圭殑涓嬩竴涓鍙?/span>錛?/span>濡傛灉鏄柟鎷彿錛屽彇鍑哄彲鑳界殑澶у皬錛屽幓鎺夋柟鎷彿 錛?/span>>鏄竴涓暟緇?/span>銆?/span>
3. 鏌ョ湅鏍囪瘑絎﹀彸杈圭殑涓嬩竴涓鍙?/span>錛?/span>
濡傛灉鏄乏鍦嗘嫭鍙鳳紝鍙栧嚭鍙兘鐨勫弬鏁幫紝涓鐩村埌鍙蟲嫭鍙?/span> 錛?/span>> 鏄竴涓嚱鏁?/span>
4. 鏌ョ湅鏍囪瘑絎﹀乏杈圭殑絎﹀彿錛?/span>濡傛灉鏄乏鎷彿錛屾壘鍒?/span>瀵瑰簲鐨勫彸鎷彿錛屽茍鎶婃嫭鍙蜂腑鐨勫0鏄庣粍鍚堝湪涓璧?/span>銆傚洖鍒扮2姝ラ噸鏂板紑濮嬫墽琛屻?/span>
5. 鏌ョ湅鏍囪瘑絎﹀乏杈圭殑絎﹀彿錛?/span>濡傛灉鏄?/span>const, volatile,*, 緇х畫鍚戝乏璇葷洿鍒頒笉鏄繖涓変釜綾誨瀷涓烘銆?/span>閲嶅絎?span>4姝ャ? =>瑙?/span>閲婁負const, volatile,鎸囧悜浠涔堢殑鎸囬拡
6. 鍓╀笅鐨勭鍙蜂竴騫?/span>璇誨叆 =>static unsigned int
浣犲彲鑳芥兂闂繖鍑犳灝卞彲浠ヨВ鍐充簡? 鏄殑錛岃繖灝辨槸鎵璋撶殑紲炲瑙g爜鐜?/span>
涓嬮潰鎴戞潵闅忎究楠岃瘉涓嬭繖涓畻娉?span>:
鍏堟潵涓畝鍗曠殑
int (*a)[10] 鍜?int* a[10];
澹版槑寮?span> 姝ラ 鎵ц緇撴灉
int (*a)[10] 絎?span>1姝?nbsp; 鎵懼埌鏈宸﹁竟鐨勬爣璇嗙a錛岃〃紺?span>a
鏄竴涓?span>…int (*)[10] 絎?span>2錛?span>3姝?span> 涓嶅尮閰?/span>
int (*)[10] 絎?span>4姝?span> 鍖歸厤(,鐩存帴璇誨埌),鍖呮嫭*錛岃〃紺?span>a鏄竴涓寚鍚?span>…鎸囬拡.Step2
int [10] 絎?span>2姝?span> 鍖歸厤[10]錛岃〃紺?span>a鏄竴涓寚鍚?span>..size=10鐨勬暟緇勭殑鎸囬拡
int 絎?span>3錛?span>4錛?span>5 涓嶅尮閰?/span>
緇撴潫 絎?span>6姝?span> 琛ㄧずa鏄竴涓寚鍚?span>int鏁扮粍鐨勬寚閽?/span>
int* a[10] 絎?span>1姝?span> a鏄竴涓?/span>
int* [10] 絎?span>2姝?span> a鏄竴涓?span>…size=10鐨勬暟緇?/span>
int* 絎?span>3姝?span> 涓嶅尮閰?/span>
int 絎?span>4姝?span> 鍖歸厤錛?span>a鏄竴涓瓨鏀劇潃鎸囬拡錛?span>size=10鐨勬暟緇?/span>
int 絎?span>5姝?span> 鍖歸厤錛?span>a鏄竴涓瓨鏀劇潃int鎸囬拡錛?span>size=10鐨勬暟緇?/span>
澶у鐪?/span>鐨勫嚭涓や釜澹版槑鐨勭粨鏋滄槸涓涓槸鎸囬拡錛屼竴涓槸鏁扮粍銆?/span>
int a1[10];
int a2[20];
int (*b)[10];
int* c[10];
a[0] = 10;
b = &a2; //鎶ラ敊錛?/span>cannot convert from 'int (*)[20]' to 'int (*)[10]'
b = &a1; //b鏄寚鍚?/span>size=10鐨勬暟緇勭殑鎸囬拡
c[0] = &a1[0]; //c鏄竴涓暟緇勶紝閲岄潰瀛樻斁鐨勬槸鎸囬拡錛屾寚閽堟寚鍚?/span>int;
鎴戠殑紼嬪簭寰堢畝鍗曪紝灝辨槸鎶婁箣鍓嶉氳繃涓涓粨鏋勪綋fwrite鍒版枃浠?/span>A閲岀殑鍐呭璇誨嚭錛岀劧鍚庤漿緇欏彟涓涓粨鏋勪綋淇濆瓨銆傜▼搴忔槸綆鍗曪紝浣嗘垜鎷呭績鐨勬槸涔嬪墠鎶?/strong>緇撴瀯浣?/span>fwrite鍒版枃浠?/span>A鐨勭▼搴忓榻愮粨鏋勪綋瑙勫垯鏄庢牱鐨勶紵涓瀹氳鐭ラ亾瀹冨悧? 褰撶劧浜嗭紝濡傛灉閭d釜紼嬪簭緇撴瀯浣撴槸鎸夌収1瀵歸綈鍐欏叆鐨勶紝鎴戠殑紼嬪簭緇撴瀯浣撴槸鎸夌収4瀵歸綈璇誨叆錛岄偅涓嶅氨緋熶簡錛?/span>
榪欓噷鎴戝紩鍏ョ粨鏋勪綋瀵歸綈鐨勬蹇碉紝涔熷彲浠ヨ鏄唴瀛樺榻愪簡銆備負浠涔堣鍐呭瓨瀵歸綈鍛紝灝辨槸鏂逛究CPU瀵誨潃浜嗭紝鍏蜂綋鍘熷洜澶у瑕佸弬鑰冭綆楁満浣撶郴緇撴瀯浜嗐傚厛鐪嬩竴涓唴瀛樺榻愮殑渚嬪瓙錛?/span>
struct example1{
char a;
double b;
long l;
};
struct example2{
char a;
long l;
double b;
};
澶у綆楃畻緇撴瀯浣撳ぇ灝忥紝鍒濇鎺ヨЕ鐨勫崥鍙嬪彲鑳藉絳旀鏈夌偣鎯婅錛?/span>VC緙栬瘧錛?/span> sizeof鍚庣粨鏋滃垎鍒槸錛?/span>24錛?/span>16銆?/span> 鍚屾牱鏄殑緇撴瀯浣擄紝鎴愬憳鎹簡欏哄簭錛屽ぇ灝忓氨涓嶅悓浜嗐傚叾瀹炲唴瀛樺榻愭湁涓鍒欙紝鍙鐭ラ亾浜嗭紝灝?/span>OK銆傞偅涔堜互涓?/span>5鐐規槸鍏抽敭
1錛?span>
鍐呭瓨瀵歸綈涓庣紪璇戝櫒璁劇疆鏈夊叧錛岄鍏堣鎼炴竻緙栬瘧鍣ㄨ繖涓粯璁ゅ兼槸澶氬皯2錛?span> 濡傛灉涓嶆兂緙栬瘧鍣ㄩ粯璁ょ殑璇濓紝鍙互閫氳繃#pragma pack(n)鏉ユ寚瀹氭寜鐓?/span>n瀵歸綈
3錛?span> 姣忎釜緇撴瀯浣撳彉閲忓榻愶紝濡傛灉瀵歸綈鍙傛暟n(緙栬瘧鍣ㄩ粯璁ゆ垨鑰呴氳繃pragma鎸囧畾)澶т簬璇ュ彉閲忔墍鍗犲瓧鑺傛暟(m)錛岄偅涔堝氨鎸夌収m瀵歸綈錛屽唴瀛樺亸縐誨悗鐨勫湴鍧鏄?/span>m鐨勫嶆暟錛屽惁鍒欐槸鎸夌収n瀵歸綈錛屽唴瀛樺亸縐誨悗鐨勫湴鍧鏄?/span>n鐨勫嶆暟銆備篃灝辨槸鏈灝忓寲闀垮害瑙勫垯
4錛?span> 緇撴瀯浣撴誨ぇ灝?/span>: 瀵歸綈鍚庣殑闀垮害蹇呴』鏄垚鍛樹腑鏈澶х殑瀵歸綈鍙傛暟鐨勬暣鏁板嶃傛渶澶у榻愬弬鏁版槸浠庣涓夋寰楀埌鐨勩?/span>
5錛?span> 琛ュ厖錛氬鏋滅粨鏋勪綋A涓繕瑕佺粨鏋勪綋B錛岄偅涔?/span>B鐨勫榻愭柟寮忔槸閫夊畠閲岄潰鏈闀跨殑鎴愬憳鐨勫榻愭柟寮?/span>
鎵浠ヨ綆楃粨鏋勪綋澶у皬瑕佽蛋涓夋錛岄鍏堢‘瀹氭槸褰撳墠紼嬪簭鎸夌収鍑犲榻?/span>(鍙傜収1錛?/span>2鐐?/span>)錛屾帴鐫璁$畻姣忎釜緇撴瀯浣撳彉閲忕殑澶у皬鍜屽亸縐?/span>(鍙傜収3錛?/span>5)錛屾渶鍚庤綆楃粨鏋勪綋鎬誨ぇ灝忥紙鍙傜収4錛夈?/span>
鍏堢畻綆?/span>example1鍚э紝鍋囪緙栬瘧鍣ㄦ槸浠?/span>16瀵歸綈鐨?/span>
1錛庣‘瀹氭寜鐓у嚑瀵歸綈: 16;
2錛庣‘瀹氭瘡涓垚鍛樼殑鍋忕Щ錛?/span>a 鍗犱竴涓瓧鑺傦紝16>1, 鎸夌収1瀵歸綈錛岃搗濮嬩綅緗?/span>0錛?/span>0%1 = 0錛岄偅涔?/span>a灝卞瓨鍦?/span>0浣嶇疆錛?/span>b鍗?/span>8涓瓧鑺傦紝16>8錛屾寜鐓?/span>8瀵歸綈錛岃搗濮嬩綅緗氨涓嶈兘鏄?/span>1浜嗭紝鍥犱負瑕佹寜鐓?/span>8瀵歸綈錛屾墍浠ユ渶榪戠殑鍋忕Щ璧峰浣嶇疆鏄?/span>8錛?/span> 8%8 =0, 閭d箞b灝卞瓨鍦ㄤ綅緗?/span>8-15鐨勪綅緗紱l鍗?/span>4涓瓧鑺傦紝16>4錛屾寜鐓?/span>4瀵歸綈錛岃搗濮嬩綅緗?/span>16錛?/span> 16%4=0錛岄偅涔?/span>l灝卞瓨鍦ㄤ綅緗?/span>16-19鐨勪綅緗傛墍浠ョ粨鏋勪綋浠?/span>0鍒?/span>19涓鍏卞崰鐢?/span>20涓瓧鑺?/span>
3錛庣粨鏋勪綋鎬誨ぇ灝忥細鎴愬憳涓渶澶х殑瀵歸綈鍙傛暟鏄?/span>b鐨?/span>8瀵歸綈錛屾墍浠?/span>20錛?/span>8!=0, 24鍒氬ソ銆?/span>
鐪熺殑寰堟悶錛佸悓鐞嗚綆?/span>example2搴旇鏄?/span>16錛?/span>
鍐嶄婦涓粨鏋勪綋宓屽鐨勪緥瀛愬惂錛?/span>
#pragma pack(push)
#pragma pack(8)
struct test1{
int a;
char b;
int c[20]
long l;
} ;
struct test2{
char a1;
char a2;
struct test1 t1;
double b1;
}
#pragma pack(pop)
鍏堣綆?/span>test1, 8瀵歸綈錛?/span>a鍗犵敤0-3錛?/span>b鍗犵敤4錛?/span>c鍗犵敤8錛?/span>87錛?/span>l鍗犵敤88錛?/span>91錛屼竴鍏?/span>92涓瓧鑺傘傛垚鍛樹腑鏈澶х殑瀵歸綈鍙傛暟鏄?/span>int浜?/span>92%4=0;
鍐嶈綆?/span>test2, a1z鍗犵敤0錛?/span>a2鍗犵敤1錛?/span>t1鍛紝4 % 4 (test1閲岄潰鏈闀跨殑鎴愬憳鐨勫榻愭柟寮? = 0, 4-95錛?/span>b1鍗?/span>96鍒?/span>103錛涗竴鍏?/span>104涓瓧鑺傦紝鎴愬憳涓渶澶х殑瀵歸綈鍙傛暟鏄?/span>double浜?/span>104%8=0; 鎵浠ユ槸104.
閭e叧浜庢垜鏂囩珷寮澶存彁鍒扮殑閭d釜鏂囦歡杞崲錛屾垜鐜板湪鍙鐭ラ亾鍘熷紼嬪簭鏄寜鐓т粈涔堝榻愮殑錛岀劧鍚庡湪鏂扮▼搴忎腑鎸囧畾鎸夌収鍑犲榻愬氨鍙互浜嗭紝鍝堝搱錛?nbsp;
鎸ゆ椂闂村啓鐨勶紝鏈夌殑鍦版柟鏈夐仐婕忥紝璇峰悇浣嶆寚姝o紒
void fn3() {printf("\n ClassA: fn3()\n");}
void fn4(int i){printf("\n ClassA: fn4()\n");}
};
int main()
{
Base* pBase1 = new ClassA(10, 20);
pBase1->fn(); //OK錛孋lassA: fn()
pBase1->fn(11); //OK錛孋lassA: fn(INT)
pBase1->fn2(); //OK錛孊ase: void fn2(int)
pBase1->fn2(2); //NO, 涓嶈兘璁塊棶
pBase1->fn3(); //OK錛孊ase: fn3()
pBase1->fn4(); //OK錛孊ase: fn4()
pBase1->fn4(2); //NO錛屼笉鑳借闂?br> printf("\n============================================\n");
ClassA* pDerived = new ClassA(10, 20);
pDerived->fn(); //OK錛孋lassA: fn()
pDerived->fn(1); //OK錛孋lassA: fn(INT)
pDerived->fn2(); //NO錛屼笉鑳借闂?br> pDerived->fn2(2); //OK錛孋lassA: fn2(INT)
pDerived->fn3(); //OK錛孋lassA: fn3()
pDerived->fn4(); //NO錛屼笉鑳借闂?br> pDerived->fn4(2); //NO錛孋lassA: fn4(INT)
printf("\n============================================\n");
return 0;
}
瀛愮被鐖剁被鍚屽悕virtual鍑芥暟(鍙傛暟鐩稿悓)錛?鐢ㄥ瓙綾葷殑鎸囬拡錛屽紩鐢紝瀵硅薄璁塊棶鏃訛紝瀛愮被浼氳鐩栫埗綾繪柟娉?鍙兘璁塊棶瀛愮被鏂規硶)銆?br>瀛愮被鐖剁被鍚屽悕virtual鍑芥暟(鍙傛暟鐩稿悓)錛?鐢ㄧ埗綾葷殑鎸囬拡錛屽紩鐢紝瀵硅薄璁塊棶鏃訛紝瀛愮被浼氳鐩栫埗綾繪柟娉?鍙兘璁塊棶瀛愮被鏂規硶)銆?br>瀛愮被鐖剁被鍚屽悕virtual鍑芥暟(鍙傛暟涓嶅悓)錛?鐢ㄥ瓙綾葷殑鎸囬拡錛屽紩鐢紝瀵硅薄璁塊棶鏃訛紝瀛愮被浼氳鐩栫埗綾繪柟娉?鍙兘璁塊棶瀛愮被鏂規硶)銆?br>瀛愮被鐖剁被鍚屽悕virtual鍑芥暟(鍙傛暟涓嶅悓)錛?鐢ㄧ埗綾葷殑鎸囬拡錛屽紩鐢紝瀵硅薄璁塊棶鏃訛紝鐖剁被浼氳鐩栧瓙綾繪柟娉?鍙兘璁塊棶鐖剁被鏂規硶)銆?br>瀛愮被鐖剁被鍚屽悕virtual鍑芥暟(鍑芥暟綾誨瀷涓嶅悓const/non-const)錛?鐢ㄥ瓙綾葷殑鎸囬拡錛屽紩鐢紝瀵硅薄璁塊棶鏃訛紝瀛愮被浼氳鐩栫埗綾繪柟娉?鍙兘璁塊棶瀛愮被鏂規硶)銆?br>瀛愮被鐖剁被鍚屽悕virtual鍑芥暟(鍑芥暟綾誨瀷涓嶅悓const/non-const)錛?鐢ㄧ埗綾葷殑鎸囬拡錛屽紩鐢紝瀵硅薄璁塊棶鏃訛紝鐖剁被浼氳鐩栧瓙綾繪柟娉?鍙兘璁塊棶鐖剁被鏂規硶)銆?/p>
緇撹錛氬弬鏁板拰鍑芥暟綾誨瀷鏄痗++緙栬瘧鍣ㄥ垽鏂涓嶈澶氭佺殑鍏抽敭鍥犵礌銆傛敞: 榪斿洖綾誨瀷涓嶅悓鏃訛紝緙栬瘧鍣ㄤ細鎶ラ敊錛寁irtual涓嶈兘鍜宻tatic榪炵敤銆傞潤鎬佹垚鍛樺嚱鏁幫紝娌℃湁闅愯棌鐨則his鎸囬拡錛寁irtual鍑芥暟涓瀹氳閫氳繃瀵硅薄鏉ヨ皟鐢紝鏃㈣this鎸囬拡銆?br>鏀硅繘:錛氬鏋滃瓙綾繪寚閽堟兂璁塊棶鍒扮埗綾伙紝鍙互鍦ㄥ瓙綾婚噷鍔犲叆:using 鐖剁被鍚?:鍑芥暟鍚嶏紱濡俻Derived->fn2(); 璁塊棶鐖剁被鏂規硶錛屽湪ClassA閲岄潰鍔犲叆using Base::fn2錛屽氨鍙互璁塊棶浜嗐傚鏋滅埗綾繪寚閽堟兂璁塊棶鍒板瓙綾伙紝灝遍渶瑕佹寚閽堣漿鎹簡銆?br>
瀛愮被鐖剁被鍚屽悕non-virtual鍑芥暟(鏃犺鍙傛暟/榪斿洖/鍑芥暟綾誨瀷(const鎴杝tatic))錛岀敤瀛愮被鐨勬寚閽堬紝寮曠敤錛屽璞¤闂紝瀛愮被浼氳鐩栫埗綾繪柟娉?鍙兘璁塊棶瀛愮被鏂規硶)銆?br>瀛愮被鐖剁被鍚屽悕non-virtual鍑芥暟(鏃犺鍙傛暟/榪斿洖/鍑芥暟綾誨瀷(const鎴杝tatic))錛岀敤鐖剁被鐨勬寚閽堬紝寮曠敤錛屽璞¤闂紝鐖剁被浼氳鐩栧瓙綾繪柟娉?鍙兘璁塊棶鐖剁被鏂規硶)銆?br>
緇撹: non-virtual鍑芥暟錛屾棦娌℃湁浠諱綍澶氭佹晥鏋滐紝濡傛灉鐖剁被瑕佽闂瓙綾伙紝鍙敤鎸囬拡杞崲銆?nbsp;
鎵璋撳ぇ閬撹嚦綆錛屾兂蹇呭ぇ瀹剁湅鐫榪欎釜閮界儲錛屾垜涔熸槸銆傛兂浜嗘兂搴旇榪欐牱琛ㄨ揪鏈綆鍗曪細
瀛愮被public緇ф壙鐖剁被鐨勫嚱鏁幫紝鍞湁婊¤凍(鍙傛暟錛岃繑鍥炲鹼紝鍑芥暟綾誨瀷鐩稿悓&鐖剁被鏄痸irtual)鍑芥暟錛岀埗綾葷殑鎸囬拡錛屽紩鐢?涔熸寚閽堝疄鐜扮殑)鑳藉澶氭佺殑璁塊棶瀛愮被錛屽惁鍒欑埗綾繪寚閽堝彧鑳借闂埗綾葷殑鏂規硶銆?nbsp;
瀛愮被public緇ф壙鐖剁被鐨勫嚱鏁幫紝瀛愮被鐨勬柟娉曞悕浼氶伄鎺╃埗綾葷殑鐩稿悓鍚嶇殑鏂規硶銆傚瓙綾昏鎯寵闂埗綾葷殑鏂規硶錛屼嬌鐢╱sing 鐖剁被鍚?:鍑芥暟鍚嶃?nbsp;
鍏蜂綋鐨勫師鍥犳垜瑙夊緱鍙兘榪樻槸寰楁壘鏃墮棿鎷滆涓嬪欐澃璇戠殑銆奀++瀵硅薄妯″瀷銆嬶紝鐪嬬湅鍒板簳榪欎釜涓滆タ鏄庝箞璁捐鐨勩?br>
銆銆涓句釜渚嬪瓙錛屼氦閫氬伐鍏風被鍙互媧劇敓鍑烘苯杞﹀拰鑸逛袱涓瓙綾伙紝浣嗘嫢鏈夋苯杞﹀拰鑸瑰叡鍚岀壒鎬ф按闄嗕袱鐢ㄦ苯杞﹀氨蹇呴』緇ф壙鏉ヨ嚜姹借濺綾諱笌鑸圭被鐨勫叡鍚屽睘鎬с?
銆銆鐢辨鎴戜滑涓嶉毦鎯沖嚭濡備笅鐨勫浘渚嬩笌浠g爜錛?/p>
銆褰撲竴涓淳鐢熺被瑕佷嬌鐢ㄥ閲嶇戶鎵跨殑鏃跺欙紝蹇呴』鍦ㄦ淳鐢熺被鍚嶅拰鍐掑彿涔嬪悗鍒楀嚭鎵鏈夊熀綾葷殑綾誨悕錛屽茍鐢ㄩ楀ソ鍒嗛殧銆?/font>
#include <iostream>
using namespace std;
class Vehicle
{
public:
Vehicle(int weight = 0)
{
Vehicle::weight = weight;
}
void SetWeight(int weight)
{
cout<<"閲嶆柊璁劇疆閲嶉噺"<<endl;
Vehicle::weight = weight;
}
virtual void ShowMe() = 0;
protected:
int weight;
};
class Car:public Vehicle//姹借濺
{
public:
Car(int weight=0,int aird=0):Vehicle(weight)
{
Car::aird = aird;
}
void ShowMe()
{
cout<<"鎴戞槸姹借濺錛?<<endl;
}
protected:
int aird;
};
class Boat:public Vehicle//鑸?nbsp;
{
public:
Boat(int weight=0,float tonnage=0):Vehicle(weight)
{
Boat::tonnage = tonnage;
}
void ShowMe()
{
cout<<"鎴戞槸鑸癸紒"<<endl;
}
protected:
float tonnage;
};
class AmphibianCar:public Car,public Boat//姘撮檰涓ょ敤姹借濺,澶氶噸緇ф壙鐨勪綋鐜?nbsp;
{
public:
AmphibianCar(int weight,int aird,float tonnage)
:Vehicle(weight),Car(weight,aird),Boat(weight,tonnage)
//澶氶噸緇ф壙瑕佹敞鎰忚皟鐢ㄥ熀綾繪瀯閫犲嚱鏁?nbsp;
{
}
void ShowMe()
{
cout<<"鎴戞槸姘撮檰涓ょ敤姹借濺錛?<<endl;
}
};
int main()
{
AmphibianCar a(4,200,1.35f);//閿欒
a.SetWeight(3);//閿欒
system("pause");
}
銆銆涓婇潰鐨勪唬鐮佷粠琛ㄩ潰鐪嬶紝鐪嬩笉鍑烘湁鏄庢樉鐨勮鍙戦敊璇紝浣嗘槸瀹冩槸涓嶈兘澶熼氳繃緙栬瘧鐨勩傝繖鏈夋槸涓轟粈涔堝憿錛?
銆銆榪欐槸鐢變簬澶氶噸緇ф壙甯︽潵鐨?font color=#ff0000>緇ф壙鐨勬ā緋婃?/font>甯︽潵鐨勯棶棰樸?/p>
銆鍏堢湅濡備笅鐨勫浘紺猴細
銆銆鍦ㄥ浘涓繁綰㈣壊鏍囪鍑烘潵鐨勫湴鏂規鏄富瑕侀棶棰樻墍鍦紝姘撮檰涓ょ敤姹借濺綾葷戶鎵夸簡鏉ヨ嚜Car綾諱笌Boat綾葷殑灞炴т笌鏂規硶錛孋ar綾諱笌Boat綾誨悓涓篈mphibianCar綾葷殑鍩虹被錛屽湪鍐呭瓨鍒嗛厤涓夾mphibianCar鑾峰緱浜嗘潵鑷袱涓被鐨凷etWeight()鎴愬憳鍑芥暟錛屽綋鎴戜滑璋冪敤a.SetWeight(3)鐨勬椂鍊欒綆楁満涓嶇煡閬撳浣曢夋嫨鍒嗗埆灞炰簬涓や釜鍩虹被鐨勮閲嶅鎷ユ湁浜嗙殑綾繪垚鍛樺嚱鏁癝etWeight()銆?
銆銆鐢變簬榪欑妯$硦闂鐨勫瓨鍦ㄥ悓鏍蜂篃瀵艱嚧浜咥mphibianCar a(4,200,1.35f);鎵ц澶辮觸錛岀郴緇熶細浜х敓Vehicle”涓嶆槸鍩烘垨鎴愬憳鐨勯敊璇?/p>
銆銆浠ヤ笂闈㈢殑浠g爜涓轟緥錛屾垜浠鎯寵AmphibianCar綾繪棦鑾峰緱涓涓猇ehicle鐨勬嫹璐濓紝鑰屼笖鍙堝悓鏃跺叡浜敤Car綾諱笌Boat綾葷殑鏁版嵁鎴愬憳涓庢垚鍛樺嚱鏁板氨蹇呴』閫氳繃C++鎵鎻愪緵鐨?font color=#ff0000>铏氭嫙緇ф壙鎶鏈潵瀹炵幇銆?/p>
銆銆鎴戜滑鍦–ar綾誨拰Boat綾葷戶鎵縑ehicle綾誨嚭錛屽湪鍓嶉潰鍔犱笂virtual鍏抽敭瀛楀氨鍙互瀹炵幇铏氭嫙緇ф壙錛屼嬌鐢ㄨ櫄鎷熺戶鎵垮悗錛?font style="BACKGROUND-COLOR: #b000b0" color=#ffffff>褰撶郴緇熺鍒板閲嶇戶鎵跨殑鏃跺欏氨浼氳嚜鍔ㄥ厛鍔犲叆涓涓猇ehicle鐨勬嫹璐濓紝褰撳啀嬈¤姹備竴涓猇ehicle鐨勬嫹璐濈殑鏃跺欏氨浼氳蹇界暐錛屼繚璇佺戶鎵跨被鎴愬憳鍑芥暟鐨勫敮涓鎬?/font>銆?
銆銆淇敼鍚庣殑浠g爜濡備笅錛屾敞鎰忚瀵熷彉鍖栵細
#include <iostream>
using namespace std;
class Vehicle
{
public:
Vehicle(int weight = 0)
{
Vehicle::weight = weight;
cout<<"杞藉叆Vehicle綾繪瀯閫犲嚱鏁?<<endl;
}
void SetWeight(int weight)
{
cout<<"閲嶆柊璁劇疆閲嶉噺"<<endl;
Vehicle::weight = weight;
}
virtual void ShowMe() = 0;
protected:
int weight;
};
class Car:virtual public Vehicle//姹借濺錛岃繖閲屾槸铏氭嫙緇ф壙
{
public:
Car(int weight=0,int aird=0):Vehicle(weight)
{
Car::aird = aird;
cout<<"杞藉叆Car綾繪瀯閫犲嚱鏁?<<endl;
}
void ShowMe()
{
cout<<"鎴戞槸姹借濺錛?<<endl;
}
protected:
int aird;
};
class Boat:virtual public Vehicle//鑸?榪欓噷鏄櫄鎷熺戶鎵?nbsp;
{
public:
Boat(int weight=0,float tonnage=0):Vehicle(weight)
{
Boat::tonnage = tonnage;
cout<<"杞藉叆Boat綾繪瀯閫犲嚱鏁?<<endl;
}
void ShowMe()
{
cout<<"鎴戞槸鑸癸紒"<<endl;
}
protected:
float tonnage;
};
class AmphibianCar:public Car,public Boat//姘撮檰涓ょ敤姹借濺,澶氶噸緇ф壙鐨勪綋鐜?nbsp;
{
public:
AmphibianCar(int weight,int aird,float tonnage)
:Vehicle(weight),Car(weight,aird),Boat(weight,tonnage)
//澶氶噸緇ф壙瑕佹敞鎰忚皟鐢ㄥ熀綾繪瀯閫犲嚱鏁?nbsp;
{
cout<<"杞藉叆AmphibianCar綾繪瀯閫犲嚱鏁?<<endl;
}
void ShowMe()
{
cout<<"鎴戞槸姘撮檰涓ょ敤姹借濺錛?<<endl;
}
void ShowMembers()
{
cout<<"閲嶉噺錛?<<weight<<"欏匡紝"<<"絀烘皵鎺掗噺錛?<<aird<<"CC錛?<<"鎺掓按閲忥細"<<tonnage<<"欏?<<endl;
}
};
int main()
{
AmphibianCar a(4,200,1.35f);
a.ShowMe();
a.ShowMembers();
a.SetWeight(3);
a.ShowMembers();
system("pause");
}
銆銆娉ㄦ剰瑙傚療綾繪瀯閫犲嚱鏁扮殑鏋勯犻『搴忋?
銆銆铏界劧璇磋櫄鎷熺戶鎵夸笌铏氬嚱鏁版湁涓瀹氱浉浼肩殑鍦版柟錛屼絾璇昏呭姟蹇呰璁頒綇錛屼粬浠箣闂存槸緇濆娌℃湁浠諱綍鑱旂郴鐨勶紒
AOP鎶鏈湪Java騫沖彴涓嬫槸鏈鍏堝緱鍒板簲鐢ㄧ殑銆傚氨鍦≒ARC瀵逛簬闈㈠悜鏂歸潰緙栫▼榪涜鐮旂┒鐨勫悓鏃訛紝緹庡浗Northeastern University鐨勫崥澹敓Cristina Lopes鍜屽叾鍚屼簨涔熷紑濮嬩簡綾諱技鐨勬濊冦傛渶緇堬紝緹庡浗鍥介槻鍏堣繘鎶鏈爺絀惰鍒掔講錛圖efense Advanced Research Projects Agency鍗矰ARPA錛夋敞鎰忓埌浜嗚繖欏瑰伐浣滐紝騫舵彁渚涗簡縐戠爺緇忚垂錛岄紦鍔卞皢浜岃呯殑宸ヤ綔鎴愭灉緇撳悎璧鋒潵銆備粬浠氳繃瀹氫箟涓濂桱ava璇█鐨勬墿灞曠郴緇燂紝浣垮紑鍙戣呭彲浠ユ柟渚跨殑榪涜闈㈠悜鏂歸潰鐨勫紑鍙戯紝榪欏鎵╁睍緋葷粺琚О涓篈spectJ銆備箣鍚庯紝AspectJ鍦?002騫磋杞緇橢clipse Foundation錛屼粠鑰屾垚涓哄湪寮婧愮ぞ鍖轟腑AOP鎶鏈殑鍏堥攱錛屼篃鏄洰鍓嶆渶涓烘祦琛岀殑AOP宸ュ叿銆?br>
閭d箞瀵逛簬C++鎶鏈潵璇達紝鎬庢牱鏉ュ紑灞旳OP鍛紝騫稿ソ鏈塐laf Spinczyk 榪欐牱鐨勪漢瀛樺湪錛屾垜浠篃鏈変簡aspect c++銆傚畠浣跨敤浜嗘彃鍏ヤ唬鐮佺殑鏂規硶銆備竴涓吀鍨嬬殑Aspect C++紺轟緥闇瑕佷竴涓狢++婧愭枃浠?.cpp)銆佷竴涓猘spect C++婧愭枃浠?.ah)錛岄氳繃ac++緙栬瘧鍣ㄦ妸C++婧愭枃浠跺拰aspect C++婧愭枃浠惰漿鎹㈡垚娣峰悎鐨凜++婧愭枃浠?濡傛灉鏈夊ご鏂囦歡涔熶細杞崲)錛屾渶鍚庨氳繃鏅氱殑C++緙栬瘧鍣ㄧ紪璇戝嚭鍙墽琛屾枃浠躲?br>
閭d箞鎴戠幇鍦ㄥ鏋滀笉鎯崇敤絎笁鏂圭紪璇戝櫒錛岃嚜宸卞幓瀹炵幇AOP錛屼笉鐭ラ亾CPPBLOG閲岀殑澶ц櫨鏈変粈涔堟兂娉曪紵
鎴戝湪鐢?/span>C/C++鍑芥暟鏃訛紝浠庢病鏈夊叏闈㈣冭檻榪囪鍑芥暟鍔熻兘錛屽彧鏄煡閬撳畠鑳藉仛錛屽熀鏈鍑芥暟緇嗚妭娌℃湁浜嗚В錛屽氨鎷夸笅闈㈣繖涓嚱鏁板仛涓緥瀛愶細
char *inet_ntoa(struct in_addr in);
struct in_addr { unsigned long int s_addr; }
鐪嬪埌榪欎釜鎴戝氨鑳芥兂鍒拌鍑芥暟鏄妸涓涓?/span>unsigned long type鐨勬暟杞崲鎴愪竴涓瓧絎︿覆銆傚叾瀹冧粈涔堥兘涓嶆兂銆傜幇鍦ㄨ鎴戜滑鏉ヤ粩緇嗗搧璇婚噷闈㈢殑涓滆タ銆?/span>
鎴戜紶鍏ヤ竴涓?/span>unsigned long type鐨勬暟鎹紝瀹冪粰鎴戜紶鍑轟竴涓?/span>char *錛岄偅榪欎釜char * 鍦ㄥ嚱鏁伴噷鎬庝箞鍒嗛厤絀洪棿鐨勩傞鍏堜笉鍙兘鏄爢鍒嗛厤錛屽洜涓哄鏋滄槸閭f牱鐨勮瘽錛屼綘鐢ㄥ畬榪欎釜鍑芥暟鍚庤繕瑕侀噴鏀捐祫婧愩傚叾嬈′笉鍙兘鏄爤鍒嗛厤錛屽洜涓洪偅鏍峰嚱鏁拌繑鍥炲悗鏍堜篃浼氳窡鐫閲婃斁銆傞偅榪樻湁鍙兘鏄叏灞鍙橀噺錛屽鏋滆繖鏍風殑璇濓紝C/C++涓凡緇忔湁濂藉鍏ㄥ眬浜嗐傞偅榪樻湁涓縐嶆槸static鐨勫彲鑳斤紝static涓嶄細闅忕潃鍑芥暟鐨勮繑鍥炶岄噴鏀撅紝涔熷氨鏄錛屽畠鏄竴鍧楅暱鏈熻鍒嗛厤鐨勫唴瀛樼┖闂達紝鐜板湪鍦ㄥ亣鑻ユ垜鍦ㄧ▼搴忎腑榪欐牱鍐欙細
printf(“%s, %s”, inet_ntoa(a), inet_ntoa(b)); //a, b 鏄袱涓笉鐩哥瓑鐨勫?/span>
杈撳嚭浼氳鎴戝ぇ鍚冧竴鎯婏紝杈撳嚭緇撴灉涓鏍楓傚師鍥犲緢綆鍗曪紝灝辨槸printf鍏堟眰b錛屾妸鍊肩粰浜嗛偅涓?/span>static錛岀劧鍚庡啀姹?/span>a, 鎶婂煎張緇欎簡static錛?/span>static鐨勯偅鍧楀唴瀛樻渶緇堣鍐欏叆浜?/span>a鐨勫鹼紝榪欎釜鏃跺欒緭鍑猴紝閭e綋鐒跺氨杈撳嚭鐨勫悓涓涓間簡銆傝繕鏈変竴縐嶉敊璇啓娉曪紝濡備笅錛?/span>
Char *tmp1 = inet_ntoa(a);
Char *tmp2 = inet_ntoa(b);
榪欐牱涔熸槸鏈夐棶棰樼殑錛屽洜涓?/span>tmp1鍜?/span>tmp2閮芥寚鍚戜簡涓鍧楀唴瀛橈紝褰撳墠鐨?/span>static鐨勫煎氨鏄?/span>b鐨勫間簡銆傛墍浠ユ葷粨濡備笅錛屼嬌鐢ㄨ繖縐嶅嚱鏁頒竴瀹氳copy鍑芥暟榪斿洖鐨勫鹼紝鑰屼笉鑳藉幓淇濆瓨鍏跺唴瀛樺湴鍧錛?br>闄刬net_ntoa()婧愮爜錛?br>#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <bits/libc-lock.h>
/* The interface of this function is completely stupid, it requires a
static buffer. We relax this a bit in that we allow at least one
buffer for each thread. */
/* This is the key for the thread specific memory. */
static __libc_key_t key;
/* If nonzero the key allocation failed and we should better use a
static buffer than fail. */
static char local_buf[18];
static char *static_buf; //闈欐?/span>
/* Destructor for the thread-specific data. */
static void init (void);
static void free_key_mem (void *mem);
char *
inet_ntoa (struct in_addr in)
{
__libc_once_define (static, once);
char *buffer;
unsigned char *bytes;
/* If we have not yet initialized the buffer do it now. */
__libc_once (once, init);
if (static_buf != NULL)
buffer = static_buf;
else
{
/* We don't use the static buffer and so we have a key. Use it
to get the thread-specific buffer. */
buffer = __libc_getspecific (key);
if (buffer == NULL)
{
/* No buffer allocated so far. */
buffer = malloc (18);
if (buffer == NULL)
/* No more memory available. We use the static buffer. */
buffer = local_buf;
else
__libc_setspecific (key, buffer);
}
}
bytes = (unsigned char *) ∈
__snprintf (buffer, 18, "%d.%d.%d.%d",
bytes[0], bytes[1], bytes[2], bytes[3]);
return buffer;
}
/* Initialize buffer. */
static void
init (void)
{
if (__libc_key_create (&key, free_key_mem))
/* Creating the key failed. This means something really went
wrong. In any case use a static buffer which is better than
nothing. */
static_buf = local_buf;
}
C 錛?/span>
struct Node{ // 澹版槑
int node;
struct Node *next; // 瀹氫箟
};
struct Node list;
鎴栬?/span>
typedef Node {
int node;
struct Node *next;
}ListLink;
ListLink list;
C++:
struct Node{
Int node;
Node *next;
};
Node list; // 鎼炲畾浜?/span>
榪欐牱涓鐪?/span> C++ 鐨勭‘瀹炲湪浠g爜鐨勫眰闈笂綆鍗曚簡錛屼絾鐞嗚В璧鋒潵鍗翠笉鏄緢鑸掓湇錛?/span>
浠婂ぉ鍒氭帴鍒頒換鍔″仛 Wireless-Lan 錛屽ソ闀挎椂闂存病鍋氭浜嬩簡錛堣繖涓ゅぉ涓昏鍦ㄥ啓鏂囨。錛変笢瑗胯繕姣旇緝澶氾紝浣嗘槸鍜屾垜涓緇勭殑 Danel浜哄緢濂?/span> 錛岀粰鎴戣浜嗕笅鏁翠釜 class diagram 鐨勬祦紼嬶紝铏芥病鏈?/span> sequence 閭d箞瀹規槗鐞嗚В錛屼絾鎴戣繕鏄噦浜嗐傝屼笖鎴戝彂鐜頒粬鍐欑▼搴忔椂鐗瑰埆寮蹇冿紝蹇冩佸緢濂斤紝榪欎篃鏄垜鍦ㄨ拷姹傜殑錛屾參鎱㈡潵鍚с傛葷洃璇磋繖鍛ㄤ簲涔嬪墠鍋氬嚭鐐逛笢瑗匡紝鍛靛懙錛屼笉鑳借浠栧け鏈涘憖錛岃繃浼氬啀鐪嬬湅浠g爜錛?/span> GUI 錛屾垜铔枩嬈㈠啓鐨勩?/span>
鍐嶈璇翠粖澶╃敤鐨勯偅涓伐鍏鳳紝 SOURCE INSIGHT 錛岀湡鐖姐傜湅浠g爜鐨勫己鏈夊姏宸ュ叿銆備笅嬈$粰 PASSION 鐨勫厔寮熶滑浠嬬粛涓嬨?/span>
鎵ц錛?/p>