導航:首頁 > 編程語言 > 虛函數php

虛函數php

發布時間:2022-04-12 09:45:43

① C++程序設計大作業要求

C++程序設計從零開始之語句
 http://seasonfive.cn/read.php?tid-234.html
h用C++實現簡單的文件I/O操作
G http://seasonfive.cn/read.php?tid-236.html
lzw壓縮演算法的c語言實現
g http://seasonfive.cn/read.php?tid-237.html
%C/C++中的日期和時間
V http://seasonfive.cn/read.php?tid-238.html
)論C/C++函數間動態內存的傳遞
# http://seasonfive.cn/read.php?tid-239.html
MC++中的虛函數(virtual function)
Y http://seasonfive.cn/read.php?tid-240.html
鏈表的C語言實現之單鏈表的查找運算
[ http://seasonfive.cn/read.php?tid-241.html
L鏈表的C語言實現之單鏈表的實現
K http://seasonfive.cn/read.php?tid-242.html
"C++程序設計從零開始之指針
h http://seasonfive.cn/read.php?tid-243.html
NC++箴言:將強制轉型減到最少
j http://seasonfive.cn/read.php?tid-244.html

java 和javaWeb的區別 關系

java:一種編程語言

java web(JSP):網頁代碼

我們平常說的Java一般指Java SE,也就是Java Standard Edition,Java的標准版,一般用來開發桌面應用程序,但是在開發桌面應用程序上相對VB,Delphi,VC++並沒有什麼優勢。


JavaWeb則到了Java EE領域了,也就是Java Enterprise Edition,Java的企業版,看那個web就應該想到是與Internet有關的,其實開發JavaWeb應用程序,初級的一般是用JSP(Java Server Pages)+servlet+Javabean來開發的,對大型的網站一般是使用框架來開發的,例如struts,hibernate,spring,例如校內,你在登陸的時候會在地址欄看見Login.do,登陸以後會看見Home.do這樣的請求,典型的struts框架結構。


Java還有一個版本是JavaME,Java Micro Edition,Java的微型版,諾基亞手機上運行的Java程序就是指用這個版本開發的程序。

希望對您有所幫助!~

③ C++有虛函數的類的指針

」我如何判定一個給出的A類的指針當前是指向A類還是指向B類?「
指針指向的是對象而不是類。
」A* X;「,X為指向A類對象的一個指針,B為A的派生類。
所以A,B類對象的地址都可以賦值給X。
應為Test定義為虛函數,A的派生類B重新定義了虛函數Test(),
故當X指向B類對象會調用派生類B所重新定義的虛函數。
因為X定義為A類的指針,故編譯器會認為X指向的是A類的對象。
將B類的對象賦值給X,編譯器也會認為X指向的是A類對象。
因為Test()為虛函數,當X指向B類對象時,會調用B類重新定義的虛函數Test()

④ 用什麼軟體來查看一個用Microsoft Visual C++ 6.0 編寫的程序的源代碼

標 題: MFC逆向初級研究(1)
作 者: 北斗之搖光
時 間: 2007-03-15 17:14
鏈 接: http://bbs.pediy.com/showthread.php?t=41087
詳細信息:

【文章標題】: MFC逆向初級研究(1)
【文章作者】: 北斗之搖光
【作者郵箱】: [email protected]
【下載地址】: 自己搜索下載
【作者聲明】: 只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!
--------------------------------------------------------------------------------
【詳細過程】
引言
本文主要針對微軟的VC++6.0中使用MFC產生的EXE文件的逆向研究,我曾經使用微軟的Visual Studio 2005編譯了一
個EXE文件,通過IDA反匯編以後發現該文件與VC++6.0產生的文件還是有所區別,因此特別在此聲明一下。文中主要使用了I
DA pro 5.0和在看雪(www.pediy.com)下載的OllyICE作為工具對目標文件進行反匯編。在此也感謝看雪論壇的各位的無私奉
獻,在研究過程的中的困難多通過各位的帖子得到了幫助。
逆向的關鍵
我認為逆向的關鍵主要是要弄明白目標文件的演算法和實現過程,在Window操作系統下,軟體的實現過程就體現在其
對Window消息的處理,而軟體的演算法則包含在處理的具體過程中。對於通過SDK編寫的"傳統"的Windows應用程序基本都具備
幾個共同的特徵:WinMain函數、WinProc函數、窗口注冊、消息循環。對於這類目標文件的分析主要集中的WinProc的分析上
,WinProc的函數地址獲得一般是通過窗口注冊函數中的參數獲得。(由於我對於這類文件沒有具體逆向過,所以只是大概的
說說,有不對的地方請各位不要客氣,盡管拍磚)
而使用MFC(Microsoft Function Class)顧名思義,該類庫主要封裝了大部分的Windows API函數所以在代碼中看
不到原本的SDK編程中的消息循環、窗口過程函數等等東西,所有這些封裝在相應的mfcxx.dll中,讓程序員能夠專著與處理
過程與演算法。這種做法於逆向而言有好處也有壞處:
壞處就是加大了對於MFC產生的EXE文件的逆向難度,讓許多的和我一樣的菜鳥迷失在匯編代碼中找不找北了,基本主要就靠
猜測實現過程中用到了那些函數,然後對文件導入表的函數下斷點來尋找我們所需要的處理過程;
好處就是這樣的做法使得EXE文件中主要都是目標程序的Window消息處理流程以及演算法,而且dll中的大部分函數的功能都能
在MSDN中查到。如果能夠通過對目標文件的分析得到這個Window消息處理流程和演算法架構,基本上我們就可以重寫整個軟體;
要做到上面的目標,首先我們要對MFC有所了解,推薦沒有基礎的兄弟們讀讀候俊傑的《深入淺出MFC》。該書在逆向過
程中完全可以作為一本參考書,讓你能通過源代碼了解實現過程,網上有很多該書的電子版下載。
一個逆向MFC產生的EXE文件的例子
下面我們就通過一個具體的例子來學習一下如何從目標文件中挖到我們需要的東西。首先我們來產生一個需要的EXE文件。
在此我假定各位對MFC有過一定的使用經驗,畢竟逆向分析才是本文的重點。
1.產生例子所需要的目標文件:
我們通過VC++6.0的向導來產生一個名為ReverseMFC的工程,這個工程的設置情況如下:
Application type of fff:
Dialog-Based Application targeting:
Win32
Classes to be created:
Application: CFffApp in ReverseMFC.h and ReverseMFC.cpp
Dialog: CFffDlg in ReverseMFCDlg.h and ReverseMFCDlg.cpp
Features:
+ Uses shared DLL implementation (MFC42.DLL)
+ Localizable text in:
中文[中國]
直接編譯以後就能夠運行,為了確定我們是否正確的分析的整個目標文件,在該對話框中加入一個我們自定義的按鈕如
下,對於該按鈕的處理函數如下設定為:
AfxMessageBox("I find it!",MB_OK);編譯後就得到了我們需要的目標文件。
現在我們得到了所需要的目標文件,在IDA中載入該文件。在此我們最好是產生Release版本的EXE文件,畢竟所有的發
布軟體都是Release版本的。
2.具體分析
在IDA中按Ctrl+S找到.rdata段,該段主要存儲了目標文件的類運行時創建信息、MessageMap信息、MessageEntry信息、
虛函數表、RTTI數據(如果編譯選項中選擇了支持RTTI的話)。
在到達.rdata段後我們可以看到這樣的代碼,對數據進行格式轉換後可以得到如下圖所示的數據。
.rdata:004021C0 ; 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?
.rdata:004021C0
.rdata:004021C0 ; Segment type: Pure data
.rdata:004021C0 ; Segment permissions: Read
.rdata:004021C0 _rdata segment para public 'DATA' use32
.rdata:004021C0 assume cs:_rdata
.rdata:004021C0 ;org 4021C0h
.rdata:004021C0 off_4021C0 dd offset sub_401000 ; DATA XREF: sub_401010o
.rdata:004021C4 dd offset dword_4021C8
.rdata:004021C8 dword_4021C8 dd 111h ; DATA XREF: .rdata:004021C4o
.rdata:004021CC dd 0
.rdata:004021D0 dd 0E146h
.rdata:004021D4 dd 0E146h
.rdata:004021D8 dd 0Ch
.rdata:004021DC dd offset CWinApp::OnHelp(void)
.rdata:004021E0 dd 0
.rdata:004021E4 dd 0
.rdata:004021E8 dd 0
.rdata:004021EC dd 0
.rdata:004021F0 dd 0
.rdata:004021F4 dd 0
.rdata:004021F8 off_4021F8 dd offset CWinApp::GetRuntimeClass(void)
.rdata:004021F8 ; DATA XREF: unknown_libname_1-56o
.rdata:004021FC dd offset sub_401040
.rdata:00402200 dd offset nullsub_2
.rdata:00402204 dd offset nullsub_3
.rdata:00402208 dd offset nullsub_2
.rdata:0040220C dd offset CCmdTarget::OnCmdMsg(uint,int,void *,AFX_CMDHANDLERINFO *)
其中的off_4021C0就是一個MessageMap數據;dword_4021C8就是MessageMap所指的MessageEntry數據;off_4021F8就是一個
類的虛函數表的開始位置。那麼具體這些數據時那個類的相關數據呢?如此判斷的依據是什麼?
首先我們知道MessageEntry是的數據結構定義如下,而且以6個0表示整個數組的結束。
struct AFX_MSGMAP_ENTRY
{
UINT nMessage; // windows message
UINT nCode; // control code or WM_NOTIFY code
UINT nID; // control ID (or 0 for windows messages)
UINT nLastID; // used for entries specifying a range of control id's
UINT nSig; // signature type (action) or pointer to message #
AFX_PMSG pfn; // routine to call (or special value)
};
因此我們有理由假設"dword_4021C8就是MessageMap所指的MessageEntry數據"。
而MessageMap數據結構定義如下:
struct AFX_MSGMAP
{
#ifdef _AFXDLL
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
#else
const AFX_MSGMAP* pBaseMap;
#endif
const AFX_MSGMAP_ENTRY* lpEntries;
};
off_4021C0的兩個數據中第二個數據恰恰就是我們前面假設為MessageEntry的指針,跟入其第一個數據,我們看到如下的代
碼:
.text:00401000 ; *************** S U B R O U T I N E ***************************************
.text:00401000
.text:00401000
.text:00401000 sub_401000 proc near ; DATA XREF: .rdata:off_4021C0o
.text:00401000 mov eax, ds:AFX_MSGMAP const CWinApp::messageMap
.text:00401005 retn
.text:00401005
.text:00401005 sub_401000 endp
恰恰是一個返回基類的MessageMap的函數。因此我們也同樣有理由假設"off_4021C0就是一個MessageMap數據"。
對於虛函數表的假設是如何被證明呢?首先我們要知道關於虛函數表的一點知識:虛函數表由虛函數的地址組成,表中函數
地址的順序和它們第一次出現的順序(即在類定義的順序)一致。若有重載的函數,則替換掉基類函數的地址。通過這個我
們可以知道MFC中虛函數表中的函數順序必然是先按照CObject->CCmdtarget->。。。。這個類繼承順序中的虛函數順序來處
理虛函數表中的函數順序的。只要證明這個我們"假設的虛函數"中的函數順序與上面提到的知識相符合則有理由說明我們的
假設成立。
首先來看CObject中虛函數的順序,在查看CObject的聲明文件後得到了這個類的虛函數順序:
virtual CRuntimeClass* GetRuntimeClass() const;
virtual ~CObject(); // virtual destructors are necessary
virtual void Serialize(CArchive& ar);
#if defined(_DEBUG) || defined(_AFXDLL)
// Diagnostic Support
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
再來查看CCmdtarget的虛函數順序,在查看CObject的聲明文件後得到了這個類的虛函數順序:
DECLARE_DYNAMIC(CCmdTarget);
virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo);
#ifndef _AFX_NO_OLE_SUPPORT
// called when last OLE reference is released
virtual void OnFinalRelease();
#endif
#ifndef _AFX_NO_OLE_SUPPORT
// called before dispatching to an automation handler function
virtual BOOL IsInvokeAllowed(DISPID dispid);
virtual BOOL GetDispatchIID(IID* pIID);
virtual UINT GetTypeInfoCount();
virtual CTypeLibCache* GetTypeLibCache();
virtual HRESULT GetTypeLib(LCID lcid, LPTYPELIB* ppTypeLib);
之所以還要列出"DECLARE_DYNAMIC(CCmdTarget);"是因為這個宏的定義如下:
#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static const AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
這個virtual CRuntimeClass* GetRuntimeClass() const; 覆蓋掉了一開始的CObject的相對應函數。依次按照類的順序對
照下來,就可以知道該表確實是虛函數表。同時,對應的GetMessageMap虛函數的位置上跟入後,可以得到如下代碼:
.text:00401010 ; *************** S U B R O U T I N E ***************************************
.text:00401010
.text:00401010
.text:00401010 sub_401010 proc near ; DATA XREF: .rdata:00402228o
.text:00401010 mov eax, offset off_4021C0
.text:00401015 retn
.text:00401015
.text:00401015 sub_401010 endp

恰恰是返回了我們之前假設的MessageMap的地址。

--------------------------------------------------------------------------------
【版權聲明】: 本文原創於看雪技術論壇, 轉載請註明作者並保持文章的完整, 謝謝!

⑤ 怎樣定義一個PHP的函數

定義PHP的函數很簡單啊:

/**
*注釋(函數說明)
*
*@param(參數介紹)
*
*@returnarray(返回值)
*@authorSphenginx
**/
functionmyFunction()//函數頭
{
//這里是函數體
}

⑥ 我想學PHP編程 我對這個方面不怎麼會 您可以幫我推薦一下這個方面的知識嗎

C是一個結構化語言,如譚老爺子所說:它的重點在於演算法和數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制),而對於C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態信息得到輸出或實現過程(事務)控制。所以C與C++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為「設計這個概念已經被融入到C++之中」,而就語言本身而言,在C中更多的是演算法的概念。那麼是不是C就不重要了,錯!演算法是程序設計的基礎,好的設計如果沒有好的演算法,一樣不行。而且,「C加上好的設計」也能寫出非常好的東西。對語言本身而言,C是C++的子集,那麼是什麼樣的一個子集?從上文可以看出,C實現了C++中過程化控制及其它相關功能,而在C++中的C(我稱它為「C+」),相對於原來的C還有所加強,引入了重載、內聯函數、異常處理等等玩藝兒,C++更是拓展了面向對象設計的內容,如類、繼承、虛函數、模板和包容器類等等。再提高一點,在C++中,數據封裝、類型這些東東已不是什麼新鮮事了,需要考慮的是諸如:對象粒度的選擇、對象介面的設計和繼承、組合與繼承的使用等等問題。所以相對於C,C++包含了更豐富的「設計」的概念,但C是C++的一個自洽子集,也具有強大的功能,同樣值得學習。

⑦ 有提問介面嗎

介面的概述
滑鼠、攝像頭、優盤都是使用USB介面的設備,如果想要使用他們就必須連接在USB介面上,這些設備的介面必須遵守USB介面的規范才能通過USB介面來使用。可以這樣說:介面是一套規范,滿足這個規范的設備,我們就可以把他們組裝到一起,從而實現該設備的功能。
介面(港台稱之為埠)指的是MD產品具有哪些輸入輸出的介面。首先作為MD產品,耳機的輸出介面自然是必須有的。除了基本的耳機輸出介面之外,錄放型產品還應該具有線路輸入的介面,這樣才能夠把MD和其它播放設備相連接,把播放的音頻輸入MD並且將其錄制到MD片上。而目前的NetMD產品還應具有USB介面,這樣才能夠和電腦相連接,從而能夠進行文件的傳輸。有的產品還具有麥克風的介面,可以把外部的聲音通過MD錄制下來。在.NET中,介面同樣是一種規范和標准。它們可以約束類的行為,例如一個類如果實現IComparable介面,就必須實現CompareTo()方法。.雖然,介面種類豐富能夠擴大產品的功能,但是在實際的應用中還應按需進行選購。
[編輯本段]介面類型(圖)
介面類型是指游戲設備與電視機或電腦主機之間的介面類型。具體有與電視機相連的AV介面,與電腦主機相連的串口、USB介面、PCI介面、I-LINK(四針IEEE 1394介面)、連接音效卡的MIDI介面、無線介面等等。
硬碟介面是硬碟與主機系統間的連接部件,作用是在硬碟緩存和主機內存之間傳輸數據。不同的硬碟介面決定著硬碟與計算機之間的連接速度,在整個系統中,硬碟介面的優劣直接影響著程序運行快慢和系統性能好壞。從整體的角度上,硬碟介面分為IDE、SATA、SCSI和光纖通道四種,IDE介面硬碟多用於家用產品中,也部分應用於伺服器,SCSI介面的硬碟則主要應用於伺服器市場,而光纖通道只在高端伺服器上,價格昂貴。SATA是種新生的硬碟介面類型,還正出於市場普及階段,在家用市場中有著廣泛的前景。在IDE和SCSI的大類別下,又可以分出多種具體的介面類型,又各自擁有不同的技術規范,具備不同的傳輸速度,比如ATA100和SATA;Ultra160 SCSI和Ultra320 SCSI都代表著一種具體的硬碟介面,各自的速度差異也較大。
IDE<b>(圖1)</b>
IDE的英文全稱為「Integrated Drive Electronics」,即「電子集成驅動器」,它的本意是指把「硬碟控制器」與「盤體」集成在一起的硬碟驅動器。把盤體與控制器集成在一起的做法減少了硬碟介面的電纜數目與長度,數據傳輸的可靠性得到了增強,硬碟製造起來變得更容易,因為硬碟生產廠商不需要再擔心自己的硬碟是否與其它廠商生產的控制器兼容。對用戶而言,硬碟安裝起來也更為方便。IDE這一介面技術從誕生至今就一直在不斷發展,性能也不斷的提高,其擁有的價格低廉、兼容性強的特點,為其造就了其它類型硬碟無法替代的地位。
IDE代表著硬碟的一種類型,但在實際的應用中,人們也習慣用IDE來稱呼最早出現IDE類型硬碟ATA-1,這種類型的介面隨著介面技術的發展已經被淘汰了,而其後發展分支出更多類型的硬碟介面,比如ATA、Ultra ATA、DMA、Ultra DMA等介面都屬於IDE硬碟。
SCSI
SCSI的英文全稱為「Small Computer System Interface」(小型計算機系統介面),是同IDE(ATA)完全不同的介面,IDE介面是普通PC的標准介面,而SCSI並不是專門為硬碟設計的介面,是一種廣泛應用於小型機上的高速數據傳輸技術。SCSI介面具有應用范圍廣、多任務、帶寬大、CPU佔用率低,以及熱插拔等優點,但較高的價格使得它很難如IDE硬碟般普及,因此SCSI硬碟主要應用於中、高端伺服器和高檔工作站中。
光纖通道
光纖通道的英文拼寫是Fibre Channel,和SCSI介面一樣光纖通道最初也不是為硬碟設計開發的介面技術,是專門為網路系統設計的,但隨著存儲系統對速度的需求,才逐漸應用到硬碟系統中。光纖通道硬碟是為提高多硬碟存儲系統的速度和靈活性才開發的,它的出現大大提高了多硬碟系統的通信速度。光纖通道的主要特性有:熱插拔性、高速帶寬、遠程連接、連接設備數量大等。
光纖通道是為在像伺服器這樣的多硬碟系統環境而設計,能滿足高端工作站、伺服器、海量存儲子網路、外設間通過集線器、交換機和點對點連接進行雙向、串列數據通訊等系統對高數據傳輸率的要求。
SATA
使用SATA(Serial ATA)口的硬碟又叫串口硬碟,是未來PC機硬碟的趨勢。2001年,由Intel、APT、Dell、IBM、希捷、邁拓這幾大廠商組成的Serial ATA委員會正式確立了Serial ATA 1.0規范,2002年,雖然串列ATA的相關設備還未正式上市,但Serial ATA委員會已搶先確立了Serial ATA 2.0規范。Serial ATA採用串列連接方式,串列ATA匯流排使用嵌入式時鍾信號,具備了更強的糾錯能力,與以往相比其最大的區別在於能對傳輸指令(不僅僅是數據)進行檢查,如果發現錯誤會自動矯正,這在很大程度上提高了數據傳輸的可靠性。串列介面還具有結構簡單、支持熱插拔的優點。
支持Serial-ATA技術的標志 (圖2)
串口硬碟是一種完全不同於並行ATA的新型硬碟介面類型,由於採用串列方式傳輸數據而知名。相對於並行ATA來說,就具有非常多的優勢。首先,Serial ATA以連續串列的方式傳送數據,一次只會傳送1位數據。這樣能減少SATA介面的針腳數目,使連接電纜數目變少,效率也會更高。實際上,Serial ATA 僅用四支針腳就能完成所有的工作,分別用於連接電纜、連接地線、發送數據和接收數據,同時這樣的架構還能降低系統能耗和減小系統復雜性。其次,Serial ATA的起點更高、發展潛力更大,Serial ATA 1.0定義的數據傳輸率可達150MB/s,這比目前最新的並行ATA(即ATA/133)所能達到133MB/s的最高數據傳輸率還高,而在Serial ATA 2.0的數據傳輸率將達到300MB/s,最終SATA將實現600MB/s的最高數據傳輸率。
[編輯本段]數據線介面
行動電話作為一種小巧的攜帶型數字設備,具有攜帶方便、功能強大等優點,但儲存容量不大,時不時要將手機里的文件儲存到電腦里,這就涉及到與電腦連接方式的問題。數據傳輸介面是手機與個人電腦等其他設備之間進行連接的介面。憑此介面和其他設備之間能夠實現上傳下載、資料同步等功能。常見的數據傳輸介面有USB介面、串口、紅外線介面和藍牙介面等。
[編輯本段]九大視頻介面全接觸
1 射頻
天線和模擬閉路連接電視機就是採用射頻(RF)介面。作為最常見的視頻連接方式,它可同時傳輸模擬視頻以及音頻信號。RF介面傳輸的是視頻和音頻混合編碼後的信號,顯示設備的電路將混合編碼信號進行一系列分離、解碼在輸出成像。由於需要進行視頻、音頻混合編碼,信號會互相干擾,所以它的畫質輸出質量是所有介面中最差的。有線電視和衛星電視接收設備也常用RF連接,但這種情況下,它們傳輸的是數字信號。
2 復合視頻
不像射頻介面那樣包含了音頻信號,復合視頻(Composite)通常採用黃色的RCA(蓮花插座)接頭。「復合」含義是同一信道中傳輸亮度和色度信號的模擬信號,但電視機如果不能很好的分離這兩種信號,就會出現虛影。
3 S端子
S端子(S-Video)連接採用Y/C(亮度/色度)分離式輸出,使用四芯線傳送信號,介面為四針介面。介面中,兩針接地,另外兩針分別傳輸亮度和色度信號。因為分別傳送亮度和色度信號,S端子效果要好於復合視頻。不過S端子的抗干擾能力較弱,所以S端子線的長度最好不要超過7米。
4 色差
色差(Component)通常標記為Y/Pb/Pr,用紅、綠、藍三種顏色來標注每條線纜和介面。綠色線纜(Y),傳輸亮度信號。藍色和紅色線纜(Pb和Pr)傳輸的是顏色差別信號。色差的效果要好於S端子,因此不少DVD以及高清播放設備上都採用該介面。如果使用優質的線材和介面,即使採用10米長的線纜,色差線也能傳輸優秀的畫面。
5 VGA
VGA(Video Graphics Array)還有一個名稱叫D-Sub。VGA介面共有15針,分成3排,每排5個孔,是顯卡上應用最為廣泛的介面類型,絕大多數顯卡都帶有此種介面。它傳輸紅、綠、藍模擬信號以及同步信號(水平和垂直信號)。使用VGA連接設備,線纜長度最好不要超過10米,而且要注意接頭是否安裝牢固,否則可能引起圖像中出現虛影。
6 DVI
DVI(Digital Visual Interface)介面與VGA都是電腦中最常用的介面,與VGA不同的是,DVI可以傳輸數字信號,不用再進過數模轉換,所以畫面質量非常高。目前,很多高清電視上也提供了DVI介面。需要注意的是,DVI介面有多種規范,常見的是DVI-D(Digital)和DVI-I(Intergrated)。DVI-D只能傳輸數字信號,大家可以用它來連接顯卡和平板電視。DVI-I則在DVI-D可以和VGA相互轉換。
關於DVI介面更詳細信息請參考DVI介面詳解
7 HDMI
HDMI(High Definition Multimedia Interface)介面是最近才出現的介面,它同DVI一樣是傳輸全數字信號的。不同的是HDMI介面不僅能傳輸高清數字視頻信號,還可以同時傳輸高質量的音頻信號。同時功能跟射頻介面相同,不過由於採用了全數字化的信號傳輸,不會像射頻介面那樣出現畫質不佳的情況。對於沒有HDMI介面的用戶,可以用適配器將HDMI介面轉換位DVI介面,但是這樣就失去了音頻信號。高質量的HDMI線材,即使長達20米,也能保證優質的畫質。
8 IEEE 1394
IEEE
1394也稱為火線或iLink,它能夠傳輸數字視頻和音頻及機器控制信號,具有較高的帶寬,且十分穩定。通常它主要用來連接數碼攝像機、DVD錄像機等設備。IEEE 1394介面有兩種類型:6針的六角形介面和4針的小型四角形介面。6針的六角形介面可向所連接的設備供電,而4針的四角形介面則不能。
9 BNC
BNC(同軸電纜卡環形介面)介面主要用於連接高端家庭影院產品以及專業視頻設備。BNC電纜有5個連接頭,分別接收紅、綠、藍、水平同步和垂直同步信號。BNC接頭可以讓視頻信號互相間干擾減少,可達到最佳信號響應效果。此外,由於BNC介面的特殊設計,連接非常緊,不必擔心介面松動而產生接觸不良。
[編輯本段]五類音頻介面全接觸
除了高清視頻帶來的不僅僅是視覺上的沖擊,音頻方面質量也有很大提高,能給大家帶來更逼真的現場效果。目前主流的音頻介面有如下幾種:
RCA模擬音頻
RCA接頭就是常說的蓮花頭,利用RCA線纜傳輸模擬信號是目前最普遍的音頻連接方式。每一根RCA線纜負責傳輸一個聲道的音頻信號,所以立體聲信號,需要使用一對線纜。對於多聲道系統,就要根據實際的聲道數量配以相同數量的線纜。立體聲RCA音頻介面,一般將右聲道用紅色標注,左聲道則用藍色或者白色標注。
S/PDIF
S/PDIF(Sony/Philips Digital Interface,索尼和飛利浦數字介面)是由SONY公司與PHILIPS公司聯合制定的一種數字音頻輸出介面。該介面廣泛應用在CD播放機、音效卡及家用電器等設備上,能改善CD的音質,給我們更純正的聽覺效果。該介面傳輸的是數字信號,所以不會像模擬信號那樣受到干擾而降低音頻質量。需要注意的是,S/PDIF介面是一種標准,同軸數字介面和光線介面都屬於S/PDIF介面的范疇。
數字同軸
數字同軸(Digital Coaxial)是利用S/PDIF介面輸出數字音頻的介面。同軸線纜有兩個同心導體,導體和屏蔽層共用同一軸心。同軸線纜是由絕緣材料隔離的銅線導體,阻抗為75歐姆,在里層絕緣材料的外部是另一層環形導體及其絕緣體,整個電纜由聚氯乙烯或特氟綸材料的護套包住。同軸電纜的優點是阻抗穩定,傳輸帶寬高,保證了音頻的質量。雖然同軸數字線纜的標准接頭為BNC接頭,但市面上的同軸數字線材多採用RCA接頭。
光纖
光纖(Optical)以光脈沖的形式來傳輸數字信號,其材質以玻璃或有機玻璃為主。光纖同樣採用S/PDIF介面輸出,其是帶寬高,信號衰減小,常常用於連接DVD播放器和AV功放,支持PCM數字音頻信號、Dolby以及DTS音頻信號。
XLR介面
與RCA模擬音頻線纜直接傳輸聲音的方式完全不同,平衡模擬音頻(Balanced Analog Audio)介面使用兩個通道分別傳送信號相同而相位相反的信號。接收端設備將這兩組信號相減,干擾信號就被抵消掉,從而獲得高質量的模擬信號。平衡模擬音頻通常採用XLR介面和大三芯介面。XLR俗稱卡儂頭,有三針插頭和鎖定裝置組成。由於採用了鎖定裝置,XLR連接相當牢靠。大三芯介面則採用直徑為6.35毫米的插頭,其優點是耐磨損,適合反復插拔。平衡模擬音頻連接主要出現在高級模擬音響器材或專業音頻設備上。
[編輯本段]介面方式
介面指MP3播放器與電腦的連接方式。介面技術是MP3播放器的最重要的指標之一,介面的速度、方便程度自然也會影響到MP3的實用性和上傳或下載歌曲的速率。
MP3播放器常見介麵包括並口(EPP)、USB介面和IEEE 1394介面,早期的一般是並口,由於傳輸速度的限制,並口的MP3已被淘汰。如今市面上的MP3介面基本是USB介面了,優點在於傳輸速率快和支持熱插拔。還有一類特殊的硬碟式MP3使用1394介面,隨著MP3容量的增大,相信在這方面會有更多人關注,因為速度越快,在容量大的機器上就體現出它的好處了。
[編輯本段]計算機的介面
同一計算機不同功能層之間的通信規則稱為介面。
對協定進行定義的引用類型。其他類型實現介面,以保證它們支持某些操作。介面指定必須由類提供的成員或實現它的其他介面。與類相似,介面可以包含方法、屬性、索引器和事件作為成員。
leon2 附加:
介面中可以聲明屬性、方法、事件和類型(Structure),(但不能聲明變數),但是並不能設置這些成員的具體值,也就是說,只能定義,不能給它裡面定義的東西賦值。
下面是個 VB.NET 2003 的例子。
在 VB.NET 的類里,實現一個介面的語句是:
implements 介面名稱
例如,下面定義一個車(總稱)的介面,這里的車是各種車的總稱:
Public Interface ICar
Property color() As String
Property speed() As Long
Sub PrintInfo()
End Interface
然後在不同類型的「車」類里實現它:
Public Class A_Car
Implements ICar
Dim m_color As String, m_speed As Long
Public Property color() As String Implements ICar.color
Get
Return m_color
End Get
Set(ByVal Value As String)
m_color = Value
End Set
End Property
Protected Overrides Sub Finalize()
MsgBox("I was deconstructed!")
End Sub
Public Sub New()
m_color = "Red"
m_speed = 210
MsgBox("I was constructed!")
End Sub
Public Property speed() As Long Implements ICar.speed
Get
Return m_speed
End Get
Set(ByVal Value As Long)
m_speed = speed
End Set
End Property
Public Sub PrintInfo() Implements ICar.PrintInfo
MsgBox("Color: " & m_color & vbNewLine & "Speed: " & m_speed, MsgBoxStyle.Information)
End Sub
End Class
在 Form 的 Load 事件中編寫:
Dim myCar As New A_Car
myCar.PrintInfo()
運行之後就創建了一個 A_Car 類的實例 myCar,然後出現兩個對話框,分別說明實例已經創建和汽車的信息。當窗體卸載時,這個類的實例 myCar 將自動銷毀,這時將出現一個「I was deconstructed!」的對話框。
聲明一個介面時,需要考慮以下幾點:
1.介面主體只限於對方法,索引器以及屬性的聲明;
2.介面成員是隱式公開的,如果對其顯式指定訪問級別,就會出現編譯器錯誤;
3.介面中不能包含欄位,構造函數和常量等;
4.在介面中不能實現任何方法,屬性或者索引器;
5.在指定方法時,只需要給出返回類型,名稱和參數列表,然後分號結束。
面向對象的介面
在C++中,一個類被允許繼承多個類。但是在Java以後的語言不被允許。
這樣,如果想繼承多個類時便非常困難。所以開發方想出了新辦法:介面。
一個介面內,允許包含變數、常量等一個類所包含的基本內容。但是,介面中的函數不允許設定代碼,也就意味著不能把程序入口放到介面里。由上可以理解到,介面是專門被繼承的。介面存在的意義也是被繼承。和C++里的抽象類里的純虛函數是相同的。不能被實例化。
定義介面的關鍵字是interface,例如:
public interface MyInterface{
public void add(int x,int y);
public void volume(int x,int y,int z);
}
繼承介面的關鍵字是implements,相當於繼承類的extends。
需要注意的是,當繼承一個介面時,介面里的所有函數必須全部被覆蓋。例如:
class Demo implements MyInterface{
public void add(int x,int y){
System.out.println(" "+(x+y));
}
public void volume(int x,int y,int z){
System.out.println(" "+(x*y*z));
}
public static void main(String args[]){
Demo d=new Demo();
d.add(10,20);
d.volume(10,10,10);
}
}
輸出結果:
30
1000
當想繼承多個類時,開發程序不允許,報錯。這樣就要用到介面。因為介面允許多重繼承(,),而類不允許。所以就要用到介面。
Java裡面的介面
Java裡面由於不允許多重繼承,所以如果要實現多個類的功能,則可以通過實現多個介面來實現。
Java介面和Java抽象類代表的就是抽象類型,就是我們需要提出的抽象層的具體表現。OOP面向對象的編程,如果要提高程序的復用率,增加程序的可維護性,可擴展性,就必須是面向介面的編程,面向抽象的編程,正確地使用介面、抽象類這些太有用的抽象類型做為你結構層次上的頂層。
Java介面和Java抽象類有太多相似的地方,又有太多特別的地方,究竟在什麼地方,才是它們的最佳位置呢?把它們比較一下,你就可以發現了。
1、Java介面和Java抽象類最大的一個區別,就在於Java抽象類可以提供某些方法的部分實現,而Java介面不可以,這大概就是Java抽象類唯一的優點吧,但這個優點非常有用。如果向一個抽象類里加入一個新的具體方法時,那麼它所有的子類都一下子都得到了這個新方法,而Java介面做不到這一點,如果向一個Java介面里加入一個新方法,所有實現這個介面的類就無法成功通過編譯了,因為你必須讓每一個類都再實現這個方法才行,這顯然是Java介面的缺點。
2、一個抽象類的實現只能由這個抽象類的子類給出,也就是說,這個實現處在抽象類所定義出的繼承的等級結構中,而由於Java語言的單繼承性,所以抽象類作為類型定義工具的效能大打折扣。在這一點上,Java介面的優勢就出來了,任何一個實現了一個Java介面所規定的方法的類都可以具有這個介面的類型,而一個類可以實現任意多個Java介面,從而這個類就有了多種類型。
3、從第2點不難看出,Java介面是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行為,而且具有其他的次要行為。
[編輯本段]PHP中的介面
<?php
interface demoInterface{
public function doIt();//聲明方法
}
class hello implements demoInterface{
public function doIt(){
echo "實現介面中的方法";
}
}
$demo=new hello();
$demo->doIt();
?>
[編輯本段]RAID卡介面
介面是指RAID卡支持的硬碟介面,目前主要有三種:IDE介面、SCSI介面和SATA介面。 IDE介面:
IDE的英文全稱為「Integrated Drive Electronics」,即「電子集成驅動器」,它的本意是指把「硬碟控制器」與「盤體」集成在一起的硬碟驅動器。把盤體與控制器集成在一起的做法減少了硬碟介面的電纜數目與長度,數據傳輸的可靠性得到了增強,硬碟製造起來變得更容易,因為硬碟生產廠商不需要再擔心自己的硬碟是否與其它廠商生產的控制器兼容,對用戶而言,硬碟安裝起來也更為方便。IDE這一介面技術從誕生至今就一直在不斷發展,性能也不斷的提高,其擁有的價格低廉、兼容性強的特點,為其造就了其它類型硬碟無法替代的地位。
IDE代表著硬碟的一種類型,但在實際的應用中,人們也習慣用IDE來稱呼最早出現IDE類型硬碟ATA-1,這種類型的介面隨著介面技術的發展已經被淘汰了,而其後發展分支出更多類型的硬碟介面,比如ATA、Ultra ATA、DMA、Ultra DMA等介面都屬於IDE硬碟。此外,由於IDE口屬於並行介面,因此為了和SATA口硬碟相區別,IDE口硬碟也叫PATA口硬碟。
SCSI介面:
SCSI的英文全稱為「Small Computer System Interface」(小型計算機系統介面),是同IDE完全不同的介面,IDE介面是普通PC的標准介面,而SCSI並不是專門為硬碟設計的介面,是一種廣泛應用於小型機上的高速數據傳輸技術。SCSI介面具有應用范圍廣、多任務、帶寬大、CPU佔用率低,以及支持熱插拔等優點,但較高的價格使得它很難如IDE硬碟般普及,因此SCSI硬碟主要應用於中、高端伺服器和高檔工作站中。SCSI硬碟和普通IDE硬碟相比有很多優點:介面速度快,並且由於主要用於伺服器,因此硬碟本身的性能也比較高,硬碟轉速快,緩存容量大,CPU佔用率低,擴展性遠優於IDE硬碟,並且支持熱插拔。
SATA介面:
使用SATA(Serial ATA)口的硬碟又叫串口硬碟,是未來PC機硬碟的趨勢。2001年,由Intel、APT、Dell、IBM、希捷、邁拓這幾大廠商組成的Serial ATA委員會正式確立了Serial ATA 1.0規范,2002年,雖然串列ATA的相關設備還未正式上市,但Serial ATA委員會已搶先確立了Serial ATA 2.0規范。Serial ATA採用串列連接方式,串列ATA匯流排使用嵌入式時鍾信號,具備了更強的糾錯能力,與以往相比其最大的區別在於能對傳輸指令(不僅僅是數據)進行檢查,如果發現錯誤會自動矯正,這在很大程度上提高了數據傳輸的可靠性。串列介面還具有結構簡單、支持熱插拔的優點。
串口硬碟是一種完全不同於並行ATA的新型硬碟介面類型,由於採用串列方式傳輸數據而知名。相對於並行ATA來說,就具有非常多的優勢。首先,Serial ATA以連續串列的方式傳送數據,一次只會傳送1位數據。這樣能減少SATA介面的針腳數目,使連接電纜數目變少,效率也會更高。實際上,Serial ATA 僅用四支針腳就能完成所有的工作,分別用於連接電纜、連接地線、發送數據和接收數據,同時這樣的架構還能降低系統能耗和減小系統復雜性。其次,Serial ATA的起點更高、發展潛力更大,Serial ATA 1.0定義的數據傳輸率可達150MB/s,這比目前最新的並行ATA(即ATA/133)所能達到133MB/s的最高數據傳輸率還高,而在Serial ATA 2.0的數據傳輸率將達到300MB/s,最終SATA將實現600MB/s的最高數據傳輸率。
上圖為支持Serial-ATA技術的標志
上圖為主板上的Serial-ATA介面
RAID技術問世時是基於SCSI介面,因其成本高,因此主要面向伺服器等高端應用。普通用戶根本無緣擁有RAID。隨著計算機的大眾化,由此帶動PC計算機的空前繁榮。相應的,在市場的帶動下,用於PC計算機的IDE介面設備價格大幅降低,同時性能大幅提高。鑒於此,RAID技術開始移植到IDE 介面上,推出了基於IDE介面的RAID應用,稱為IDE RAID。而基於SCSI介面的RAID應用則相應稱為SCSI RAID。與SCSI RAID相比,IDE RAID具有極低的價格,和一點也不遜色的性能表現,相應的,IDE RAID 解決方案就具有SCSI RAID無法比擬的高性價比。因此 IDE RAID自推出後,受到普通PC用戶和普通商業應用的普遍歡迎。
當然IDE RAID也有其缺點,比如在CPU佔用率和連接設備數量等方面就無法與SCSI RAID相比,同時,IDE RAID目前為止還只支持RAID0、RAID1和RAID0+1,並且性能上也比SCSI RAID略遜一籌,因此高性能計算機應用方面還是以SCSI RAID為主。SATA RAID是剛剛誕生的RAID方式,它與IDE RAID類似,最大的優點是低成本,其他方面也和IDE RAID接近。
是否可以解決您的問題?

⑧ 軟體開發是學習什麼 asp php asp.net java c++ c vb 到底哪個才是軟體開發要學習的。

如何成為好的程序員?
How To Become a good Programmer?

首先問你一個問題:

你們在學校都學些什麼課程?問這個問題的原因是,我認為學校的計算機科學基礎課很重要。如果你所在學校的課程設置合理,那你應該先把主要精力花在這些基礎課上。很多學生看到基礎理論就茫然,不知道這些圖表,符號,甚至硬體的知識對將來的軟體開發有什麼用。用處大得很哪。比如,操作系統課里講到的多線程的東西在系統編程里很有用。又比如,盡管你將來不會去涉及電腦的硬體,計算機架構里的知識對分析演算法的性能(快慢等等)很有用。可以把計算機語言和開發工具比作文字,而把計算機科學的知識比做思想。只有思想,不會行文,不行;但是,行文流暢,思想空洞,也不行。大學的階段正是打好基礎,豐富思想的年代。

成為一名好的程序員,不是簡單地通過學幾門課程就能做到的。我個人認為成為一名好的程序員的要素有:

1。扎實的基礎知識;
2。很強的解決問題的能力;
3。熟練的編程調試能力;
4。創新能力;
5。團隊合作能力;
6。持續的自學能力;
7。好奇心

這些能力和品質(甚至可以說是習慣)都應該從大學階段就著手培養,並且從身邊的小事開始培養。比如,很多中國的大學畢業生都缺乏編程和調試經驗。學習C語言,考試過關就算學會了。課題項目中,只要程序能夠編譯,運行,並且輸入輸出滿足要求就了事了。但是,寫程序的時候是否想過如何把程序寫得更加精煉,高效,高質量?對程序調試中出現的問題是否刨根問底知道原因,還是不求甚解搪塞過去算數?還有,很多中國的大學畢業生對於知識的掌握膚淺,機械,沒有好奇心,不會刨根問底。比如,學會了C++,有沒有看過一個object在編譯後,在匯編代碼中是如何被初始化的?這個object的各個成員在內存中是如何放的?在一個成員函數被調用的時候編譯器在匯編代碼中加入了哪些額外的動作?虛函數的調用是如何實現的? 這些東西恐怕在編程語言或編譯原理中都沒有詳細提到。但是,你是否有過好奇心去知道?最後,一些中國學生的大問題就是死記硬背,沒有學到某種演算法技術的根本原理,沒有應變和創新的能力。比如,有個問題是如何在不用額外內存的情況下把一棵樹的同一層節點都連起來。很多學生都能夠回答這是一個廣度遍歷的問題。但是,課本上說了廣度遍歷是一定要有額外數據結構輔助的(隊列)。所以,不給額外內存怎麼行?請看,課本上說的用隊列的方法記住了,但是就是不知道為什麼要用隊列。如果深刻掌握了這個隊列的作用,那麼這個問題是很容易的。

舉了這么多例子,我想說明的事,想成為一位好程序員(其實從事任何一個行業都是如此),重要的是要養成一個鑽研,好奇,創新,動手,合作,不滿足於填鴨,不滿足於考試交差,不滿足於表象的一種優秀的習慣。這不是學幾門課能夠一蹴而就的。當然,如果你的在校課程不能使你滿足,我以及論壇上的朋友可能能夠給你推薦一些書或科目。

我覺得要提高編程的能力,有一位良師很重要。這位良師可以是在編程方面比你走在前面的同學,也可以是學校里你幫他做項目的老師,也可以是校外公司里的老師或老闆。很多東西在實際的項目中,有一位良師察看你的程序,幫你指出不足,手把手地指導你調試,會對你很有幫助。所以,當學會了書本上的基本知識以後,可以努力尋找一些有實用性的項目,借機在項目中找到高手指導。這個項目可以在學校找,也可以到校外找。一開始不要計較報酬,甚至如果能夠尋到高手指點,白乾也行。

其次是讀好的源代碼。多讀好的源代碼就象多讀好的文章,會有利於自己寫作。能夠讀懂別人的代碼也是一門硬功夫。將來很多項目中你不會重頭做,而是在半途加入(一般文檔又不很齊全),因此需要能夠很快讀懂別人代碼和想法的能力。

再次是看一些編程方面的好書。Writing Solid Code是一本很經典的書。最近出的Writing Secure Code也不錯。在你熟練掌握C以後,可以學一下C++並熟悉面向對象的程序設計思路。在掌握C++的基礎上可以看一下Design Patterns。

看你要把編程學到多麼專業。到一定程度,你會發現如果沒有學過數據結構,演算法原理,編譯原理和操作系統,可能在某些方面會遇到一些障礙。所以,如果有精力和條件的話,可以同時了解這些方面的知識。

最後,我要提醒你不要因為編程這一業余愛好而影響了你本專業的課程,除非你決定轉行。對很多在校學生來說,本專業的成績很重要,因為這個成績可能會影響到將 來找工作,申請研究生院等等。英語也很重要。我讀翻譯的計算機書總覺得隔了一層,翻得不貼切。能夠直接閱讀英文資料更好。

計算機專業修煉和武俠小說中功夫修煉都是一樣的:

金庸先生小說中提到高手習武包括內功和外功,其實這個道理在計算機專業同學中一樣適用!

內功包括:基本心法和高級心法

基本心法需要每個習武者必須修煉,包括:數據結構、編譯原理、計算機組成原理、高等數學、線性代數以及外語等。

高級心法根據個人需要定,比如:網路類需要學習包括TCP/IP原理等;軟體工程需要學習包括軟體工程的基礎課程。

外功包括:基本招式和獨門武功

基本招式:比如像C,C++,C#,SQL,XML 一些語言使用或者是Windows 2000 Server的知識等基礎應用知識。

高級招式:比如像DX9,Web-Services高級等技術。

WEB 開發 網站後台 開發也算是軟體開發。

⑨ 誰有面試phper的經驗

這方面網上有比較多的,針對3-5年的PHPer常見的面試題,參考如下:
1、平時喜歡哪些php書籍及博客?CSDN、虎嗅、獵雲
2、js閉包是什麼?
3、for與foreach哪個更快?
4、php鳥哥是誰?能不能講一下php執行原理?
5、php加速器有哪些?apc、zend、xcache.....能不能講一下它的加速原理?
6、Node.js能徹底代替php+apache是扯淡。
7、怎樣判斷一個值是否存在於數組中?in_array(),array_key_exists,......
8、怎樣判斷select語句中是否使用了索引?explain
9、sphinx的中文分詞詞庫使用第三方庫還是自己建庫?
10、如果一個被面試者經驗少、基礎差,此時卻問些高深的知識。要懷疑它的穩定性,可以提問加班對他會不會有抵觸。
11、mysql與mysqli的區別有哪些?
12、將來的發展方向?安全、還是數據挖掘、大數據處理?
13、php的面向對象:類的修飾符、封裝、繼承、多態體現方面
14、php 多態是什麼?
15、Type Hinting:http://www.php.net/manual/en/language.oop5.typehinting.php
16、php的設計模式:單例模式、工廠模式、生產者模式......等23種
17、伺服器狀態碼:200、202、301、404、500......
18、i++與++i的區別?
19、項目開發:電商項目中的購物車數據持久化、考試系統的安全性考慮、
20、mysql設計基礎:三大範式、功能->思維導圖、創建表的第一欄位是什麼?
21、mysql欄位char、varchar、int、smallint、tinyint、mediumint、bigint、decimal、double、float位元組數及應用場景。
22、memcache與mongoDB、Redis各自的使用場景是什麼?
23、為什麼mongoDB與Redis非但沒有形成競爭反而是互補關系?
24、Redis數據類型有哪些?int、string、hash、set、list ?
25、安裝linux軟體時使用make方式還使用yum方式?
26、linux網路優化:查看進程ps -aux|grep mysqld、怎樣查看最大文件打開數?
27、C語言中的虛函數是什麼?
28、1條微薄要推送給100萬個粉絲該怎麼處理?
29、知道哪些演算法?冒泡排序?快速排序?二分查找法?
30、yii thinkphp ci 各自優點
31、php 設計模式有哪些?
32、c 排序演算法有哪些?
33、php 基本結構是什麼?
34、memcache magent 分布式設計?
35、redis 分布式設計,如何設計?
36、mongo 集群架構是怎樣的?
37、mysql 索引原理及sql性能優化
38、tcp/ip 網路協議,osi7層指是什麼?
39、php 處理大數據業務
40、linux 應用 負載性能查看 ?
41、nginx 實戰優化業務功能 ?
42、談一下近三年來你的得意之作?
43、看看簡歷,會問一些過去做的項目的用戶量、pv、吞吐量、相關難點和解決方法等
44、資料庫設計經驗,為什麼進行分表? 分庫?
45、一般多少數據量開始分表? 分庫? 分庫分表的目的? 什麼是資料庫垂直拆分? 水平拆分? 分區等等?可以舉例說明
46、資料庫優化有哪些? 分別需要注意什麼?
47、web開發方面會遇到哪些緩存? 分別如何優化?
48、給你256M的內存,對10G的文件進行排序(文件每行1個數字),如何實現?
49、對10G的文件進行查找如何實現?
50、統計10G文件每個關鍵字出現的次數如何實現?
51、假如你現在是12306火車訂票的設計師,你該如何設計滿足全國人民訂票?
52、假如有1億用戶的訪問量,你的伺服器架構是怎樣的? 用戶信息的存儲方案如何設計?
53、如果你是技術組長,所帶團隊任務進度無法完成你該如何解決?
54、如果在進度排滿的前提下插入任務,你該如何保證總進度不延期?
55、如果有的工程師今天預定任務沒有完成,你該如何解決?
56、從你的經驗方面談一下如何構建高性能web站點? 需要哪些環節? 步驟? 每個步驟需要注意什麼如何優化等?
57、為什麼要對資料庫進行主從分離?
58、如何處理多伺服器共享session?
59、一個10G的表,你用php程序統計某個欄位出現的次數,思路是?
60、會告訴你一個nginx日誌例子,用你認為最佳的編程語言統計一下http響應時間超過1秒的前10個url?
61、給你一個mysql配置文件,用你認為最佳的編程語言解析該文件?
62、給你兩個路徑a和b,寫一個演算法或思路計算a和b差距幾層並顯示a和b的交集?
63、給你一個url,在nginx配置一下rewrite指定到某個具體路徑?
64、一個php文件的解釋過程是? 一般加速php有哪些? 提高php整體性能會用到哪些技術?
65、session和cookie生存周期區別? 存儲位置區別?
66、require、include、require_once、include_once區別? 載入區別? 如果程序按需載入某個php文件你如何實現?
67、chrome號稱為多線程的,所以多線程和多進程的區別為?
68、php在2011年底出現hash碰撞,hash碰撞原理為? 如何進行修復?
69、web不安全因素有哪些? 分別如何防範?
70、假如兩個單鏈表相交,寫一個最優演算法計算交點位置,說思路也可以?
71、假如你是技術組長? 如何提高團隊效率?
72、nginx負載均衡有哪些? 如果其中一台伺服器掛掉,報警機制如何實現?
73、不優化前提下,apache一般最大連接數為? nginx一般最大連接數為? mysql 每秒insert ? select ? update ? delete?
74、mysql 數據類型有哪些 ? 分別佔用多少存儲空間 ?
75、nginx設置緩存js、css、圖片等信息,緩存的實現原理是?
76、如何提高緩存命中率? 如何對緩存進行顆粒化?
77、php的內存回收機制是?
78、我的所有問題都問完了(當然沒有這么多),你有什麼問題問我沒有?

⑩ 什麼是野指針

野指針,也就是指向不可用內存區域的指針。通常對這種指針進行操作的話,將會使程序發生不可預知的錯誤。首先請諸位看以下一段「危險」的C++代碼:

void function( void )
{
char* str = new char[100];
delete[] str;
// Do something
strcpy( str, "Dangerous!!" );
}

之所以說其危險,是因為這是一段完全合乎語法的代碼,編譯的時候完美得一點錯誤也不會有,然而當運行到strcpy一句的時候,問題就會出現,因為在這之前,str的空間已經被delete掉了,所以strcpy當然不會成功。對於這種類似的情況,在林銳博士的書中有過介紹,稱其為「野指針」。

那麼,諸位有沒有見過安全的「野指針」呢?下面請看我的一段C++程序,靈感來自CSDN上的一次討論。在此,我只需要C++的「類」,C++的其餘一概不需要,因此我沒有使用任何的C++標准庫,連輸出都是用printf完成的。

#include <stdio.h>

class CTestClass
{
public:
CTestClass( void );
int m_nInteger;
void Function( void );
};

CTestClass::CTestClass( void )
{
m_nInteger = 0;
}

void CTestClass::Function( void )
{
printf( "This is a test function.\n" );
}

void main( void )
{
CTestClass* p = new CTestClass;
delete p;
p->Function();
}

OK,程序到此為止,諸位可以編譯運行一下看看結果如何。你也許會驚異地發現:沒有任何的出錯信息,屏幕上竟然乖乖地出現了這么一行字元串:

This is a test function.

奇怪嗎?不要急,還有更奇怪的呢,你可以把主函數中加上一句更不可理喻的:

((CTestClass*)NULL)->Function();

這仍然沒有問題!!

我這還有呢,哈哈。現在你在主函數中這么寫,倘說上一句不可理喻,那麼以下可以叫做無法無天了:

int i = 888;
CTestClass* p2 = (CTestClass*)&i;
p2->Function();

你看到了什麼?是的,「This is a test function.」如約而至,沒有任何的錯誤。

你也許要問為什麼,但是在我解答你之前,請你在主函數中加入如下代碼:

printf( "%d, %d", sizeof( CTestClass ), sizeof( int ) );

這時你就會看到真相了:輸出結果是——得到的兩個十進制數相等。對,由sizeof得到的CTestClass的大小其實就是它的成員m_nInteger的大小。亦即是說,對於CTestClass的一個實例化的對象(設為a)而言,只有a.m_nInteger是屬於a這個對象的,而a.Function()卻是屬於CTestClass這個類的。所以以上看似危險的操作其實都是可行且無誤的。

現在你明白為什麼我的「野指針」是安全的了,那麼以下我所列出的,就是在什麼情況下,我的「野指針」不安全:

在成員函數Function中對成員變數m_nInteger進行操作;
將成員函數Function聲明為虛函數(virtual)。
以上的兩種情況,目的就是強迫野指針使用屬於自己的東西導致不安全,比如第一種情況中操作本身的m_nInteger,第二種情況中變為虛函數的Function成為了屬於對象的函數(這一點可以從sizeof看出來)。

其實,安全的野指針在實際的程序設計中是幾乎毫無用處的。我寫這一篇文章,意圖並不是像孔乙己一樣去琢磨回字有幾種寫法,而是想通過這個小例子向諸位寫明白C++的對象實例化本質,希望大家不但要明白what和how,更要明白why。李馬二零零三年二月二十日作於自宅。

關於成員函數CTestClass::Function的補充說明

這個函數是一個普通的成員函數,它在編譯器的處理下,會成為類似如下的代碼:

void Function( const CTestClass * this ) // ①
{
printf("This is a test function.\n");
}

那麼p->Function();一句將被編譯器解釋為:

Function( p );

這就是說,普通的成員函數必須經由一個對象來調用(經由this指針激活②)。那麼由上例的delete之後,p指針將會指向一個無效的地址,然而p本身是一個有效的變數,因此編譯能夠通過。並且在編譯通過之後,由於CTestClass::Function的函數體內並未對這個傳入的this指針進行任何的操作,所以在這里,「野指針」便成了一個看似安全的東西。

然而若這樣改寫CTestClass::Function:

void CTestClass::Function( void )
{
m_nInteger = 0;
}

那麼它將會被編譯器解釋為:

void Function( const CTestClass * this )
{
this->m_nInteger = 0;
}

你看到了,在p->Function();的時候,系統將會嘗試在傳入的這個無效地址中尋找m_nInteger成員並將其賦值為0,剩下的我不用說了——非法操作出現了。

至於virtual虛函數,如果在類定義之中將CTestClass聲明為虛函數:

class CTestClass
{
public:
// ...
virtual void Function( void );
};

那麼C++在構建CTestClass類的對象模型時,將會為之分配一個虛函數表vptr(可以從sizeof看出來)。vptr是一個指針,它指向一個函數指針的數組,數組中的成員即是在CTestClass中聲明的所有虛函數。在調用虛函數的時候,必須經由這個vptr,這也就是為什麼虛函數較之普通成員函數要消耗一些成本的緣故。以本例而言,p->Function();一句將被編譯器解釋為:

(*p->vptr[1])( p ); // 調用vptr表中索引號為1的函數(即Function)③

上面的代碼已經說明了,如果p指向一個無效的地址,那麼必然會有非法操作。

備註:

①關於函數的命名,我採用了原名而沒有變化。事實上編譯器為了避免函數重載造成的重名情況,會對函數的名字進行處理,使之成為獨一無二的名稱。
②將成員函數聲明為static,可以使成員函數不經由this指針便可調用。
③vptr表中,索引號0為類的type_info。

閱讀全文

與虛函數php相關的資料

熱點內容
程序員看不懂怎麼辦 瀏覽:271
linux操作系統題 瀏覽:765
單片機無符號數加法 瀏覽:227
應用隱藏加密怎麼關閉 瀏覽:269
汽車空調的壓縮機電線有什麼用 瀏覽:429
電腦加密圖片如何取消加密 瀏覽:340
慧凈電子51單片機視頻 瀏覽:343
javamap賦值 瀏覽:165
什麼app可以玩掌機游戲 瀏覽:46
java簡單聊天室 瀏覽:462
通用汽車編程軟體 瀏覽:432
一級抗震框架梁箍筋加密區規定是多少 瀏覽:974
教你如何把安卓手機變成蘋果 瀏覽:11
app編譯分類 瀏覽:323
怎麼用伺服器的資源包 瀏覽:199
oa軟體手機登陸伺服器地址 瀏覽:289
androidrtp打包 瀏覽:723
信息被加密碼了怎麼辦 瀏覽:420
彈出光碟命令 瀏覽:517
kdj公式源碼分享 瀏覽:355