导航:首页 > 编程语言 > 虚函数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相关的资料

热点内容
优信二手车解压后过户 浏览:61
Windows常用c编译器 浏览:778
关于改善国家网络安全的行政命令 浏览:833
安卓如何下载网易荒野pc服 浏览:654
javainetaddress 浏览:104
苹果4s固件下载完了怎么解压 浏览:1002
命令zpa 浏览:285
python编译器小程序 浏览:944
在app上看视频怎么光线调暗 浏览:540
可以中文解压的解压软件 浏览:592
安卓卸载组件应用怎么安装 浏览:912
使用面向对象编程的方式 浏览:339
程序员项目经理的年终总结范文 浏览:929
内衣的加密设计用来干嘛的 浏览:432
淮安数据加密 浏览:292
魔高一丈指标源码 浏览:982
松下php研究所 浏览:168
c回调java 浏览:399
梦幻端游长安地图互通源码 浏览:745
电脑本地文件如何上传服务器 浏览:313