锘??xml version="1.0" encoding="utf-8" standalone="yes"?> YUV涓昏鐨勯噰鏍鋒牸寮?/span> 涓昏鐨勯噰鏍鋒牸寮忔湁YCbCr 4:2:0銆?/span>YCbCr 4:2:2銆?/span>YCbCr 4:1:1鍜?/span> YCbCr 4:4:4銆傚叾涓?/span>YCbCr 4:1:1 姣旇緝甯哥敤錛屽叾鍚箟涓猴細(xì)姣忎釜鐐逛繚瀛樹竴涓?/span> 8bit 鐨勪寒搴﹀?/span>(涔熷氨鏄?/span>Y鍊?/span>), 姣?/span> 2x2 涓偣淇濆瓨涓涓?/span> Cr 鍜?/span>Cb 鍊?/span>, 鍥懼儚鍦ㄨ倝鐪間腑鐨勬劅瑙変笉浼?xì)钃v澶ぇ鐨勫彉鍖栥傛墍浠?/span>, 鍘熸潵鐢?/span> RGB(R,G,B 閮芥槸 8bit unsigned) 妯″瀷, 4 涓偣闇瑕?/span> 8x3=24 bites錛堝涓嬪浘絎竴涓浘錛?/span>. 鑰岀幇鍦ㄤ粎闇瑕?/span> 8+(8/4)+(8/4)=12bites, 騫沖潎姣忎釜鐐瑰崰12bites(濡備笅鍥劇浜屼釜鍥?/span>)銆傝繖鏍峰氨鎶婂浘鍍忕殑鏁版嵁鍘嬬緝浜嗕竴鍗娿?/span> 涓婅竟浠呯粰鍑轟簡鐞嗚涓婄殑紺轟緥錛屽湪瀹為檯鏁版嵁瀛樺偍涓槸鏈夊彲鑳芥槸涓嶅悓鐨勶紝涓嬮潰緇欏嚭鍑犵鍏蜂綋鐨勫瓨鍌ㄥ艦寮忥細(xì) 錛?/span>1錛?/span> YUV 4:4:4 YUV涓変釜淇¢亾鐨勬娊鏍風(fēng)巼鐩稿悓錛屽洜姝ゅ湪鐢熸垚鐨勫浘鍍忛噷錛屾瘡涓薄绱犵殑涓変釜鍒嗛噺淇℃伅瀹屾暣錛堟瘡涓垎閲忛氬父8姣旂壒錛夛紝緇忚繃8姣旂壒閲忓寲涔嬪悗錛屾湭緇忓帇緙╃殑姣忎釜鍍忕礌鍗犵敤3涓瓧鑺傘?/span> 涓嬮潰鐨勫洓涓儚绱犱負(fù): [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 瀛樻斁鐨勭爜嫻佷負(fù): Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 錛?span>2錛?span> YUV 4:2:2 姣忎釜鑹插樊淇¢亾鐨勬娊鏍風(fēng)巼鏄寒搴︿俊閬撶殑涓鍗婏紝鎵浠ユ按騫蟲柟鍚戠殑鑹插害鎶芥牱鐜囧彧鏄?span>4:4:4鐨勪竴鍗娿傚闈炲帇緙╃殑8姣旂壒閲忓寲鐨勫浘鍍忔潵璇達(dá)紝姣忎釜鐢變袱涓按騫蟲柟鍚戠浉閭?cè)潥勫儚绱牼l勬垚鐨勫畯鍍忕礌闇瑕佸崰鐢?span>4瀛楄妭鍐呭瓨銆?/span> 涓嬮潰鐨勫洓涓儚绱犱負(fù): [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 瀛樻斁鐨勭爜嫻佷負(fù): Y0 U0 Y1 V1 Y2 U2 Y3 V3 鏄犲皠鍑哄儚绱犵偣涓猴細(xì)[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3] 錛?span>3錛?span> YUV 4:1:1 4:1:1鐨勮壊搴︽娊鏍鳳紝鏄湪姘村鉤鏂瑰悜涓婂鑹插害榪涜4:1鎶芥牱銆傚浜庝綆绔敤鎴峰拰娑堣垂綾諱駭鍝佽繖浠嶇劧鏄彲浠ユ帴鍙楃殑銆傚闈炲帇緙╃殑8姣旂壒閲忓寲鐨勮棰戞潵璇達(dá)紝姣忎釜鐢?span>4涓按騫蟲柟鍚戠浉閭?cè)潥勫儚绱牼l勬垚鐨勫畯鍍忕礌闇瑕佸崰鐢?span>6瀛楄妭鍐呭瓨 涓嬮潰鐨勫洓涓儚绱犱負(fù): [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 瀛樻斁鐨勭爜嫻佷負(fù): Y0 U0 Y1 Y2 V2 Y3 鏄犲皠鍑哄儚绱犵偣涓猴細(xì)[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2] 錛?span>4錛?span>YUV4:2:0 4:2:0騫朵笉鎰忓懗鐫鍙湁Y,Cb鑰屾病鏈?span>Cr鍒嗛噺銆傚畠鎸囧緱鏄姣忚鎵弿綰挎潵璇達(dá)紝鍙湁涓縐嶈壊搴﹀垎閲忎互2:1鐨勬娊鏍風(fēng)巼瀛樺偍銆傝繘琛岄殧琛屾壂鎻忥紝鐩擱偦鐨勬壂鎻忚瀛樺偍涓嶅悓鐨勮壊搴﹀垎閲忥紝涔熷氨鏄錛屽鏋滀竴琛屾槸4:2:0鐨勮瘽錛屼笅涓琛屽氨鏄?span>4:0:2錛屽啀涓嬩竴琛屾槸4:2:0...浠ユ綾繪帹銆傚姣忎釜鑹插害鍒嗛噺鏉ヨ錛屾按騫蟲柟鍚戝拰绔栫洿鏂瑰悜鐨勬娊鏍風(fēng)巼閮芥槸2:1錛屾墍浠ュ彲浠ヨ鑹插害鐨勬娊鏍風(fēng)巼鏄?span>4:1銆傚闈炲帇緙╃殑8姣旂壒閲忓寲鐨勮棰戞潵璇達(dá)紝姣忎釜鐢?span>2x2涓?span>2琛?span>2鍒楃浉閭?cè)潥勫儚绱牼l勬垚鐨勫畯鍍忕礌闇瑕佸崰鐢?span>6瀛楄妭鍐呭瓨銆?/span> 涓嬮潰鍏釜鍍忕礌涓猴細(xì)[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] [Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8] 瀛樻斁鐨勭爜嫻佷負(fù)錛?span>Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8 鏄犲皠鍑虹殑鍍忕礌鐐逛負(fù)錛?span>[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7] 瀵瑰簲AVPicture閲岄潰鏈塪ata[4]鍜宭inesize[4]鍏朵腑data鏄竴涓寚鍚戞寚閽堢殑鎸囬拡錛堜簩綰с佷簩緇存寚閽堬級錛屼篃灝辨槸鎸囧悜瑙嗛鏁版嵁緙撳啿鍖虹殑棣栧湴鍧錛岃宒ata[0]~data[3]鏄竴綰ф寚閽堬紝鍙互鐢ㄥ涓嬬殑鍥炬潵琛ㄧず錛? data -->xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 姣斿璇達(dá)紝褰損ix_fmt=PIX_FMT_YUV420P鏃訛紝data涓殑鏁版嵁鏄寜鐓UV鐨勬牸寮忓瓨鍌ㄧ殑錛屼篃灝辨槸錛? linesize鏄寚瀵瑰簲浜庢瘡涓琛岀殑澶у皬錛屼負(fù)浠涔堥渶瑕佽繖涓彉閲忥紝鏄洜涓哄湪YUV鏍煎紡鍜孯GB鏍煎紡鏃訛紝姣忚鐨勫ぇ灝忎笉涓瀹氱瓑浜庡浘鍍忕殑瀹藉害錛屽浜嶳GB鏍煎紡杈撳嚭鏃?鍙湁涓涓氶亾(bgrbgrbgr......)鍙敤錛屽嵆linesize[0],鍜宒ata[0],so RGB24 : data[0] = packet rgb//bgrbgrbgr...... 鍏朵粬鐨勫data[1][2][3]涓巐inesize[1][2][3]鏃犱換浣曟剰涔? 鑰屽浜庯脊錛碉級鏍煎紡杈撳嚭鏃訛紝鏈変笁涓氶亾鍙敤錛屽嵆data[0][1][2],涓巐inesize[0][1][2]錛岃寉uv鏍煎紡瀵逛簬榪愬姩浼拌鏃訛紝闇瑕佸~鍏卲adding(right, bottom),鏁咃細(xì)
{
//閲嶈澆闇瑕佺殑綆楁硶鎿嶄綔
template <typename R>
op<R> operator=(R i)
{
return op<R>(i);
}
};
template <typename T>
struct op
{
op(T i): _i(i) {}
T operator()(T &i)
{
return i = _i;
}
T _i;
};
浠ヤ笂鐨勪唬鐮佸疄鐜?鎿嶄綔濡傛灉闇瑕佸叾浠栨搷浣滃垯閲嶈澆鐩稿簲鐨勬搷浣滀緥濡?=
渚濇綾繪帹鍗犱綅綾誨疄鐜?=騫墮氳繃浠垮嚱鏁板彲浠ュ疄鐜?=鐨勬搷浣滀互涓嬫槸瀹屾垚鐨勪唬鐮?br>
#include "stdafx.h"
#include <vector>
#include <algorithm>
using namespace std;
//浠垮嚱鏁幫紝鍗抽噸杞戒簡()鎿嶄綔鐨勭被
template <typename T>
struct op
{
op(T i): _i(i) {}
T operator()(T &i)
{
return i = _i;
}
T _i;
};
template <typename T>
struct op1
{
op1(T i):_i(i){}
T operator()(T &i)
{
return i + _i;
}
T _i;
};
//鍗犱綅絎?/span>
struct place_holder
{
//閲嶈澆闇瑕佺殑綆楁硶鎿嶄綔
template <typename R>
op<R> operator=(R i)
{
return op<R>(i);
}
template <typename R>
op1<R> operator+=(R i)
{
return op1<R>(i);
}
};
place_holder _1;
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
//for_each(v.begin(), v.end(), op()); //鍘熸牸寮忓姝?/span>
for_each(v.begin(), v.end(), _1=2); //_1=2鏄竴涓豢鍑芥暟,閫氳繃閲嶈澆=瀹炵幇
return 0;
}
]]>
^ ^ ^
| | |
data[0] data[1] data[2]data -->YYYYYYYYYYYYYYUUUUUUUUUUUUUVVVVVVVVVVVV
^ ^ ^
| | |
data[0] data[1] data[2]
linesize[0] = width*3
linesize=width+padding size(16+16).
///////////////////////////////////////////////////////////////////////////////////////
case PIX_FMT_YUV420P:
case PIX_FMT_YUVJ420P:
case PIX_FMT_RGB555:
if (PIC_DIRECTION_0 == m_dwFilpPicDirection)
{
m_pYuvFrame->data [0] += m_pYuvFrame->linesize[0] * m_pVCodecContext->height;
//鍥犱負(fù)鏄殧琛屾壂鎻廢涓嶸鍙湁楂樺害鐨勪竴鍗?br> m_pYuvFrame->data [1] += m_pYuvFrame->linesize[1] * m_pVCodecContext->height/2;
m_pYuvFrame->data [2] += m_pYuvFrame->linesize[2] * m_pVCodecContext->height/2;
m_pYuvFrame->linesize[0] = -m_pYuvFrame->linesize[0];
m_pYuvFrame->linesize[1] = -m_pYuvFrame->linesize[1];
m_pYuvFrame->linesize[2] = -m_pYuvFrame->linesize[2];
}
break;
case PIX_FMT_YUVJ422P:
case PIX_FMT_YUV422P:
case PIX_FMT_YUYVJ422:
case PIX_FMT_YUV411P:
case PIX_FMT_YUYV422:
if (PIC_DIRECTION_0 == m_dwFilpPicDirection)
{
m_pYuvFrame->data [0] += m_pYuvFrame->linesize[0] * m_pVCodecContext->height;
m_pYuvFrame->data [1] += m_pYuvFrame->linesize[1] * m_pVCodecContext->height;
m_pYuvFrame->data [2] += m_pYuvFrame->linesize[2] * m_pVCodecContext->height;
m_pYuvFrame->linesize[0] = -m_pYuvFrame->linesize[0];
m_pYuvFrame->linesize[1] = -m_pYuvFrame->linesize[1];
m_pYuvFrame->linesize[2] = -m_pYuvFrame->linesize[2];
}
break;
}
鍦‵FMPEG涓漿鎹GB鏃墮『渚塊鍊掑浘鍍忕殑鏂瑰悜綆楁硶
]]>
]]>
void ExtractString(CStringArray& arr, const CString strSrc, const TCHAR sep = '|')

{
CString str(strSrc);
str.TrimLeft();
str.TrimRight();
if(str.IsEmpty())
return;
int pos = str.Find(sep);
while (pos != -1)
{
arr.Add(str.Left(pos));
str = str.Mid(pos + 1);
pos = str.Find(sep);
}
if (strcmp(str, _T("")) != 0)
arr.Add(str);
}
int StrIndex(const char *str, const char *substr)

{

int nEnd = strlen(str) - strlen(substr); /**//* 璁$畻緇撴潫浣嶇疆 */

if ( nEnd > 0 ) /**//* 瀛愬瓧絎︿覆灝忎簬瀛楃涓?nbsp;*/
{
for (int i = 0; i <= nEnd; i++ )
for (int j = i; str[j] == substr[j-i]; j++ )
if ( substr[j-i+1] == '\0' ) /**//* 瀛愬瓧絎︿覆瀛楃粨鏉?nbsp; */
return i + 1;
}
return -1;
}
]]>
//閫傚悎浜庢瘮杈冨皬鐨勫璞?/span>
class CSingletonObj

{
public:
virtual ~CSingletonObj(void); //蹇呴』涓哄叕鏈?/span>
static CSingletonObj& Instance(void)
{return m_Instance;}
protected:
CSingletonObj(void); //闃叉鏋勯犱笌鎷瘋礉
CSingletonObj(const CSingletonObj&);
private:
static CSingletonObj m_Instance;
};
]]>
]]>
涓嶈繃C椋庢牸鐨勭被鍨嬭漿鎹㈠茍涓嶄唬琛ㄦ墍鏈夌殑綾誨瀷杞崲鍔熻兘銆?
涓鏉ュ畠浠繃浜庣矖椴侊紝鑳藉厑璁鎬綘鍦ㄤ換浣曠被鍨嬩箣闂磋繘琛岃漿鎹€備笉榪囧鏋滆榪涜鏇寸簿紜殑綾誨瀷杞崲錛岃繖浼?xì)鏄竴涓紭鐐廣傚湪榪欎簺綾誨瀷杞崲涓瓨鍦ㄧ潃宸ㄥぇ鐨勪笉鍚岋紝渚嬪鎶婁竴涓寚鍚慶onst瀵硅薄鐨勬寚閽堬紙pointer-to-const-object錛夎漿鎹㈡垚鎸囧悜闈瀋onst瀵硅薄鐨勬寚閽堬紙pointer-to-non-const-object錛?鍗充竴涓粎浠呭幓闄onst鐨勭被鍨嬭漿鎹?錛屾妸涓涓寚鍚戝熀綾葷殑鎸囬拡杞崲鎴愭寚鍚戝瓙綾葷殑鎸囬拡錛堝嵆瀹屽叏鏀瑰彉瀵硅薄綾誨瀷錛夈備紶緇熺殑C椋庢牸鐨勭被鍨嬭漿鎹笉瀵逛笂榪頒袱縐嶈漿鎹㈣繘琛屽尯鍒嗐傦紙榪欎竴鐐逛篃涓嶄護(hù)浜烘儕璁訛紝鍥犱負(fù)C椋庢牸鐨勭被鍨嬭漿鎹㈡槸涓篊璇█璁捐鐨勶紝鑰屼笉鏄負(fù)C++璇█璁捐鐨勶級銆?
浜屾潵C椋庢牸鐨勭被鍨嬭漿鎹㈠湪紼嬪簭璇彞涓毦浠ヨ瘑鍒傚湪璇硶涓婏紝綾誨瀷杞崲鐢卞渾鎷彿鍜屾爣璇嗙緇勬垚錛岃岃繖浜涘彲浠ョ敤鍦–錛嬶紜涓殑浠諱綍鍦版柟銆傝繖浣垮緱鍥炵瓟璞¤繖鏍蜂竴涓渶鍩烘湰鐨勬湁鍏崇被鍨嬭漿鎹㈢殑闂鍙樺緱寰堝洶闅撅細(xì)“鍦ㄨ繖涓▼搴忎腑鏄惁浣跨敤浜嗙被鍨嬭漿鎹紵”銆傝繖鏄洜涓轟漢宸ラ槄璇誨緢鍙兘蹇界暐浜嗙被鍨嬭漿鎹㈢殑璇彞錛岃屽埄鐢ㄨ薄grep鐨勫伐鍏風(fēng)▼搴忎篃涓嶈兘浠庤鍙ユ瀯鎴愪笂鍖哄垎鍑哄畠浠潵銆?
C++閫氳繃寮曡繘鍥涗釜鏂扮殑綾誨瀷杞崲鎿嶄綔絎﹀厠鏈嶄簡C椋庢牸綾誨瀷杞崲鐨勭己鐐癸紝榪欏洓涓搷浣滅鏄? static_cast, const_cast, dynamic_cast, 鍜宺einterpret_cast銆傚湪澶у鏁版儏鍐典笅錛屽浜庤繖浜涙搷浣滅浣犲彧闇瑕佺煡閬撳師鏉ヤ綘涔?fàn)鎯簬杩欐牱鍐欏Q?
(type) expression
鑰岀幇鍦ㄤ綘鎬誨簲璇ヨ繖鏍峰啓錛?
static_cast<type>(expression)
渚嬪錛屽亣璁句綘鎯蟲妸涓涓猧nt杞崲鎴恉ouble錛屼互渚胯鍖呭惈int綾誨瀷鍙橀噺鐨勮〃杈懼紡浜х敓鍑烘誕鐐規(guī)暟鍊肩殑緇撴灉銆傚鏋滅敤C椋庢牸鐨勭被鍨嬭漿鎹紝浣犺兘榪欐牱鍐欙細(xì)
int firstNumber, secondNumber;
...
double result = ((double)firstNumber)/secondNumber錛?
濡傛灉鐢ㄤ笂榪版柊鐨勭被鍨嬭漿鎹㈡柟娉曪紝浣犲簲璇ヨ繖鏍峰啓錛?
double result = static_cast<double>(firstNumber)/secondNumber;
榪欐牱鐨勭被鍨嬭漿鎹笉璁烘槸瀵逛漢宸ヨ繕鏄紼嬪簭閮藉緢瀹規(guī)槗璇嗗埆銆?
static_cast鍦ㄥ姛鑳戒笂鍩烘湰涓婁笌C椋庢牸鐨勭被鍨嬭漿鎹竴鏍峰己澶э紝鍚箟涔熶竴鏍楓傚畠涔熸湁鍔熻兘涓婇檺鍒躲備緥濡傦紝浣犱笉鑳界敤static_cast璞$敤C椋庢牸鐨勭被鍨嬭漿鎹竴鏍鋒妸struct杞崲鎴恑nt綾誨瀷鎴栬呮妸double綾誨瀷杞崲鎴愭寚閽堢被鍨嬶紝鍙﹀錛宻tatic_cast涓嶈兘浠庤〃杈懼紡涓幓闄onst灞炴э紝鍥犱負(fù)鍙︿竴涓柊鐨勭被鍨嬭漿鎹㈡搷浣滅const_cast鏈夎繖鏍風(fēng)殑鍔熻兘銆?
鍏跺畠鏂扮殑C++綾誨瀷杞崲鎿嶄綔絎﹁鐢ㄥ湪闇瑕佹洿澶氶檺鍒剁殑鍦版柟銆俢onst_cast鐢ㄤ簬綾誨瀷杞崲鎺夎〃杈懼紡鐨刢onst鎴杤olatileness灞炴с傞氳繃浣跨敤const_cast錛屼綘鍚戜漢浠拰緙栬瘧鍣ㄥ己璋冧綘閫氳繃綾誨瀷杞崲鎯沖仛鐨勫彧鏄敼鍙樹竴浜涗笢瑗跨殑constness鎴栬? volatileness灞炴с傝繖涓惈涔夎緙栬瘧鍣ㄦ墍綰︽潫銆傚鏋滀綘璇曞浘浣跨敤const_cast鏉ュ畬鎴愪慨鏀筩onstness 鎴栬卾olatileness灞炴т箣澶栫殑浜嬫儏錛屼綘鐨勭被鍨嬭漿鎹㈠皢琚嫆緇濄備笅闈㈡槸涓浜涗緥瀛愶細(xì)
class Widget { ... };
class SpecialWidget: public Widget { ... };
void update(SpecialWidget *psw);
SpecialWidget sw; // sw 鏄竴涓潪const 瀵硅薄銆?
const SpecialWidget& csw = sw; // csw 鏄痵w鐨勪竴涓紩鐢?
// 瀹冩槸涓涓猚onst 瀵硅薄
update(&csw); // 閿欒!涓嶈兘浼犻掍竴涓猚onst SpecialWidget* 鍙橀噺
// 緇欎竴涓鐞哠pecialWidget*綾誨瀷鍙橀噺鐨勫嚱鏁?
update(const_cast<SpecialWidget*>(&csw));
// 姝g‘錛宑sw鐨刢onst琚樉紺哄湴杞崲鎺夛紙
// csw鍜宻w涓や釜鍙橀噺鍊煎湪update
//鍑芥暟涓兘琚洿鏂幫級
update((SpecialWidget*)&csw);
// 鍚屼笂錛屼絾鐢ㄤ簡涓涓洿闅捐瘑鍒?
//鐨凜椋庢牸鐨勭被鍨嬭漿鎹?
Widget *pw = new SpecialWidget;
update(pw); // 閿欒錛乸w鐨勭被鍨嬫槸Widget*錛屼絾鏄?
// update鍑芥暟澶勭悊鐨勬槸SpecialWidget*綾誨瀷
update(const_cast<SpecialWidget*>(pw));
// 閿欒錛乧onst_cast浠呰兘琚敤鍦ㄥ獎鍝?
// constness or volatileness鐨勫湴鏂逛笂銆?
// 涓嶈兘鐢ㄥ湪鍚戠戶鎵垮瓙綾昏繘琛岀被鍨嬭漿鎹€?
鍒扮洰鍓嶄負(fù)姝紝const_cast鏈鏅氱殑鐢ㄩ斿氨鏄漿鎹㈡帀瀵硅薄鐨刢onst灞炴с?
絎簩縐嶇壒孌婄殑綾誨瀷杞崲絎︽槸dynamic_cast錛屽畠琚敤浜庡畨鍏ㄥ湴娌跨潃綾葷殑緇ф壙鍏崇郴鍚戜笅榪涜綾誨瀷杞崲銆傝繖灝辨槸璇達(dá)紝浣犺兘鐢╠ynamic_cast鎶婃寚鍚戝熀綾葷殑鎸囬拡鎴栧紩鐢ㄨ漿鎹㈡垚鎸囧悜鍏舵淳鐢熺被鎴栧叾鍏勫紵綾葷殑鎸囬拡鎴栧紩鐢紝鑰屼笖浣犺兘鐭ラ亾杞崲鏄惁鎴愬姛銆傚け璐ョ殑杞崲灝嗚繑鍥炵┖鎸囬拡錛堝綋瀵規(guī)寚閽堣繘琛岀被鍨嬭漿鎹㈡椂錛夋垨鑰呮姏鍑哄紓甯革紙褰撳寮曠敤榪涜綾誨瀷杞崲鏃訛級錛?
Widget *pw;
...
update(dynamic_cast<SpecialWidget*>(pw));
// 姝g‘錛屼紶閫掔粰update鍑芥暟涓涓寚閽?
// 鏄寚鍚戝彉閲忕被鍨嬩負(fù)SpecialWidget鐨刾w鐨勬寚閽?
// 濡傛灉pw紜疄鎸囧悜涓涓璞?
// 鍚﹀垯浼犻掕繃鍘葷殑灝嗕嬌絀烘寚閽堛?
void updateViaRef(SpecialWidget& rsw);
updateViaRef(dynamic_cast<SpecialWidget&>(*pw));
//姝g‘銆? 浼犻掔粰updateViaRef鍑芥暟
// SpecialWidget pw 鎸囬拡錛屽鏋減w
// 紜疄鎸囧悜浜嗘煇涓璞?
// 鍚﹀垯灝嗘姏鍑哄紓甯?
dynamic_casts鍦ㄥ府鍔╀綘嫻忚緇ф壙灞傛涓婃槸鏈夐檺鍒剁殑銆傚畠涓嶈兘琚敤浜庢病鏈夎櫄鍑芥暟鐨勭被鍨嬩笂錛屽洜涓轟粬瑕佸緱鍒扮被鐨勮繍琛屾椂淇℃伅錛岃繖涓淇濆瓨浜嶸tablez涓紝涔熶笉鑳界敤瀹冩潵杞崲鎺塩onstness錛?
int firstNumber, secondNumber;
...
double result = dynamic_cast<double>(firstNumber)/secondNumber;
// 閿欒錛佹病鏈夌戶鎵垮叧緋?
const SpecialWidget sw;
...
update(dynamic_cast<SpecialWidget*>(&sw));
// 閿欒! dynamic_cast涓嶈兘杞崲
// 鎺塩onst銆?
濡備綘鎯沖湪娌℃湁緇ф壙鍏崇郴鐨勭被鍨嬩腑榪涜杞崲錛屼綘鍙兘鎯沖埌static_cast銆傚鏋滄槸涓轟簡鍘婚櫎const錛屼綘鎬誨緱鐢╟onst_cast銆?
榪欏洓涓被鍨嬭漿鎹㈢涓殑鏈鍚庝竴涓槸reinterpret_cast銆備嬌鐢ㄨ繖涓搷浣滅鐨勭被鍨嬭漿鎹紝鍏剁殑杞崲緇撴灉鍑犱箮閮芥槸鎵ц鏈熷畾涔夛紙implementation-defined錛夈傚洜姝わ紝浣跨敤reinterpret_casts鐨勪唬鐮佸緢闅劇Щ妞嶃?
reinterpret_casts鐨勬渶鏅氱殑鐢ㄩ斿氨鏄湪鍑芥暟鎸囬拡綾誨瀷涔嬮棿榪涜杞崲銆備緥濡傦紝鍋囪浣犳湁涓涓嚱鏁版寚閽堟暟緇勶細(xì)
typedef void (*FuncPtr)(); // FuncPtr is 涓涓寚鍚戝嚱鏁?
// 鐨勬寚閽堬紝璇ュ嚱鏁版病鏈夊弬鏁?
// 榪斿洖鍊肩被鍨嬩負(fù)void
FuncPtr funcPtrArray[10]; // funcPtrArray 鏄竴涓兘瀹圭撼
// 10涓狥uncPtrs鎸囬拡鐨勬暟緇?
璁╂垜浠亣璁句綘甯屾湜錛堝洜涓烘煇浜涜帿鍚嶅叾濡欑殑鍘熷洜錛夋妸涓涓寚鍚戜笅闈㈠嚱鏁扮殑鎸囬拡瀛樺叆funcPtrArray鏁扮粍錛?
int doSomething();
浣犱笉鑳戒笉緇忚繃綾誨瀷杞崲鑰岀洿鎺ュ幓鍋氾紝鍥犱負(fù)doSomething鍑芥暟瀵逛簬funcPtrArray鏁扮粍鏉ヨ鏈変竴涓敊璇殑綾誨瀷銆傚湪FuncPtrArray鏁扮粍閲岀殑鍑芥暟榪斿洖鍊兼槸void綾誨瀷錛岃宒oSomething鍑芥暟榪斿洖鍊兼槸int綾誨瀷銆?
funcPtrArray[0] = &doSomething; // 閿欒錛佺被鍨嬩笉鍖歸厤
reinterpret_cast鍙互璁╀綘榪嬌緙栬瘧鍣ㄤ互浣犵殑鏂規(guī)硶鍘葷湅寰呭畠浠細(xì)
funcPtrArray[0] = // this compiles
reinterpret_cast<FuncPtr>(&doSomething);
杞崲鍑芥暟鎸囬拡鐨勪唬鐮佹槸涓嶅彲縐繪鐨勶紙C++涓嶄繚璇佹墍鏈夌殑鍑芥暟鎸囬拡閮借鐢ㄤ竴鏍風(fēng)殑鏂規(guī)硶琛ㄧず錛夛紝鍦ㄤ竴浜涙儏鍐典笅榪欐牱鐨勮漿鎹細(xì)浜х敓涓嶆紜殑緇撴灉錛堝弬瑙佹潯嬈綧31錛夛紝鎵浠ヤ綘搴旇閬垮厤杞崲鍑芥暟鎸囬拡綾誨瀷錛岄櫎闈炰綘澶勪簬鐫鑳屾按涓鎴樺拰灝栧垁鏋跺枆鐨勫嵄鎬ユ椂鍒匯備竴鎶婇攱鍒╃殑鍒銆備竴鎶婇潪甯擱攱鍒╃殑鍒銆?
濡傛灉浣犱嬌鐢ㄧ殑緙栬瘧鍣ㄧ己涔忓鏂扮殑綾誨瀷杞崲鏂瑰紡鐨勬敮鎸侊紝浣犲彲浠ョ敤浼犵粺鐨勭被鍨嬭漿鎹㈡柟娉曚唬鏇縮tatic_cast, const_cast, 浠ュ強(qiáng)reinterpret_cast銆備篃鍙互鐢ㄤ笅闈㈢殑瀹忔浛鎹㈡潵妯℃嫙鏂扮殑綾誨瀷杞崲璇硶錛?
#define static_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define const_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define reinterpret_cast(TYPE,EXPR) ((TYPE)(EXPR))
浣犲彲浠ヨ薄榪欐牱浣跨敤浣跨敤錛?
double result = static_cast(double, firstNumber)/secondNumber;
update(const_cast(SpecialWidget*, &sw));
funcPtrArray[0] = reinterpret_cast(FuncPtr, &doSomething);
榪欎簺妯℃嫙涓嶄細(xì)璞$湡瀹炵殑鎿嶄綔絎︿竴鏍峰畨鍏紝浣嗘槸褰撲綘鐨勭紪璇戝櫒鍙互鏀寔鏂扮殑鐨勭被鍨嬭漿鎹㈡椂錛屽畠浠彲浠ョ畝鍖栦綘鎶婁唬鐮佸崌綰х殑榪囩▼銆?
娌℃湁涓涓鏄撶殑鏂規(guī)硶鏉ユā鎷焏ynamic_cast鐨勬搷浣滐紝浣嗘槸寰堝鍑芥暟搴撴彁渚涗簡鍑芥暟錛屽畨鍏ㄥ湴鍦ㄦ淳鐢熺被涓庡熀綾諱箣闂磋繘琛岀被鍨嬭漿鎹€傚鏋滀綘娌℃湁榪欎簺鍑芥暟鑰屼綘鏈夊繀欏昏繘琛岃繖鏍風(fēng)殑綾誨瀷杞崲錛屼綘涔熷彲浠ュ洖鍒癈椋庢牸鐨勭被鍨嬭漿鎹㈡柟娉曚笂錛屼絾鏄繖鏍風(fēng)殑璇濅綘灝嗕笉鑳借幏鐭ョ被鍨嬭漿鎹㈡槸鍚﹀け璐ャ傚綋鐒訛紝浣犱篃鍙互瀹氫箟涓涓畯鏉ユā鎷焏ynamic_cast鐨勫姛鑳斤紝灝辮薄妯℃嫙鍏跺畠鐨勭被鍨嬭漿鎹竴鏍鳳細(xì)
#define dynamic_cast(TYPE,EXPR) (TYPE)(EXPR)
璇瘋浣忥紝榪欎釜妯℃嫙騫朵笉鑳藉畬鍏ㄥ疄鐜癲ynamic_cast鐨勫姛鑳斤紝瀹冩病鏈夊姙娉曠煡閬撹漿鎹㈡槸鍚﹀け璐ャ?
鎴戠煡閬擄紝鏄殑錛屾垜鐭ラ亾錛屾柊鐨勭被鍨嬭漿鎹㈡搷浣滅涓嶆槸寰堢編瑙傝屼笖鐢ㄩ敭鐩橀敭鍏ヤ篃寰堥夯鐑︺傚鏋滀綘鍙戠幇瀹冧滑鐪嬩笂鍘誨疄鍦ㄤ護(hù)浜鴻鍘岋紝C椋庢牸鐨勭被鍨嬭漿鎹㈣繕鍙互緇х畫浣跨敤騫朵笖鍚堟硶銆傜劧鑰岋紝姝f槸鍥犱負(fù)鏂扮殑綾誨瀷杞崲絎︾己涔忕編鎰熸墠鑳戒嬌瀹冨譏琛ヤ簡鍦ㄥ惈涔夌簿紜у拰鍙鯨璁ゆт笂鐨勭己鐐廣傚茍涓旓紝浣跨敤鏂扮被鍨嬭漿鎹㈢鐨勭▼搴忔洿瀹規(guī)槗琚В鏋愶紙涓嶈鏄浜哄伐榪樻槸瀵逛簬宸ュ叿紼嬪簭錛夛紝瀹冧滑鍏佽緙栬瘧鍣ㄦ嫻嬪嚭鍘熸潵涓嶈兘鍙戠幇鐨勯敊璇傝繖浜涢兘鏄斁寮僀椋庢牸綾誨瀷杞崲鏂規(guī)硶鐨勫己鏈夊姏鐨勭悊鐢便傝繕鏈夌涓変釜鐞嗙敱錛氫篃璁歌綾誨瀷杞崲絎︿笉緹庤鍜岄敭鍏ラ夯鐑︽槸涓浠跺ソ浜嬨?
]]>
]]>