??xml version="1.0" encoding="utf-8" standalone="yes"?>国产呻吟久久久久久久92,国产呻吟久久久久久久92,久久这里只精品国产99热http://www.shnenglu.com/yearner/category/4821.html智慧需要点滴的U篏zh-cnThu, 20 Nov 2008 17:57:44 GMTThu, 20 Nov 2008 17:57:44 GMT60 Quoted printable ~码说明http://www.shnenglu.com/yearner/archive/2008/11/20/67421.html(Leyn)主(Leyn)主Thu, 20 Nov 2008 13:46:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/20/67421.htmlhttp://www.shnenglu.com/yearner/comments/67421.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/20/67421.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/67421.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/67421.html

3.2      Quoted printable ~码

         QP ~码用于表示含有大量对应可打印字W的数组Q这U编码方式字符单元在传输过E中被更改的可能性很。如果正在编码的数据大部分是ASCII文本Q那么编码后的Ş式具有很高的可读性。一个完全是ASCII值的正文数据?/span>QP~码后可以保证数据在字符译或经qx数据的完整性?/span>

       ~码规则如下Q?/span>

       规则1Q?/span>(一?/span>8位组的表C方?/span>), M的八位组Q都可以?/span>”=”后加该八位组?/span>16q制值来表示Q除了那些根据数据编码规范中新行的惯例来指定短行的表C单位。必ȝ大写字母。比如值是12 Q则表示?/span>”=0C”?/span>

       规则2Q?/span>(文字表示)值在33-60 Q以?/span>62-126的八位组(包含头尾?/span>)Q可以表C成那些八位l对应的ASCII字符?/span>

       规则3Q?/span>(I格) 值是9?/span>32的八位组可以分别表示?/span>ASCII ?/span>TAB?/span>SPACE|但是不可以出现在~码行的末尾。Q何在~码行的TAB?/span>SPACE字符必须后面有可打印字符出现。特D情况下Q编码行的末և现的”=”Q表C断行,其前面可能是一个或多个TAB?/span>SPACE?/span> 实行q条规则的原因是一?/span>METs(Message Transport Agents-消息传输单元)会在文本末尾补上SPACEQ因此,解码ӞM跟在行后的空格必d除?/span>

       规则4Q?/span>(断行)在原文中的断行必表C成协议中的断行W?/span>-CRLF序列Q?/span>"=0D=0A” Q?/span>。由于非文本cd的规范表CZ般不包括断行Q所以这U类型的qp~码没有换行。通常Q?/span>base64~码在二q制~码上更占优ѝ?/span>

       规则5Q?/span>(软换?/span>)QP~码要求~码后每行不能超q?/span>76个字W。当过q个限制Ӟ适用软换行,?/span>”=”表示~码行的断行Q后?/span>CRLF。(76的限制包?/span>”=”Q?/span>

      



(Leyn)主 2008-11-20 21:46 发表评论
]]>
Base 64 ~码说明http://www.shnenglu.com/yearner/archive/2008/11/20/67418.html(Leyn)主(Leyn)主Thu, 20 Nov 2008 13:45:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/20/67418.htmlhttp://www.shnenglu.com/yearner/comments/67418.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/20/67418.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/67418.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/67418.html阅读全文

(Leyn)主 2008-11-20 21:45 发表评论
]]>
MIME邮g格式说明http://www.shnenglu.com/yearner/archive/2008/11/20/67417.html(Leyn)主(Leyn)主Thu, 20 Nov 2008 13:44:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/20/67417.htmlhttp://www.shnenglu.com/yearner/comments/67417.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/20/67417.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/67417.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/67417.html阅读全文

(Leyn)主 2008-11-20 21:44 发表评论
]]>
[?]谈C++的智能指?http://www.shnenglu.com/yearner/archive/2008/11/09/66447.html(Leyn)主(Leyn)主Sun, 09 Nov 2008 12:43:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/09/66447.htmlhttp://www.shnenglu.com/yearner/comments/66447.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/09/66447.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/66447.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/66447.html谈C++的智能指?/h1>
内存泄露是C++E序员都头疼的大问题。C++~Z像JAVA、C#一P拥有GCq么一Ҏ利的武器Q它内存管理的部分权限交给了程序员。虽然GC的存在节U了开发、排错的旉与成本,但是C++Zq求q行速度?0q来坚决不予补充q其标准。(题外话:C++通过加大开发难度去换取执行速度的做法,在现在看来不知是否能l与正面的评Pq是留给来再说吧。)

  从此Q在堆上甌了内存忘了释放、所造成的内存泄露的问题׃直困扰着C++E序员。也ؓ了稍许I补没有垃圑֛收器所造成的开发门槛高Q各大厂商开发的C++库中都像COM学习引入指针试图解决部分目前存在的问题?br>
  指针是存储指向动态分配(堆)对象指针的类, 用于生存期控? 能够保自动正确的销毁动态分配的对象Q防止内存泄霌Ӏ它的一U通用实现技术是使用引用计数(reference count)。智能指针类一个计数器与类指向的对象相兌Q引用计数跟t该cL多少个对象共享同一指针。每ơ创建类的新对象Ӟ初始化指针ƈ引用计? |ؓ1Q当对象作ؓ另一对象的副本而创建时Q拷贝构造函数拷贝指针ƈ增加与之相应的引用计敎ͼ对一个对象进行赋值时Q赋值操作符减少左操作数所指对象的? 用计敎ͼ如果引用计数为减?Q则删除对象Q,q增加右操作数所指对象的引用计数Q调用析构函数时Q构造函数减引用计敎ͼ如果引用计数减至0Q则删除? 对象Q?br>
  说到指针Q我们一定要看看标准C++库提供的“搞笑?#8221;指针:auto_ptr?br>
  标准库中提供了C++E序的基本设施。虽然C++标准库随着C++标准折腾了许多年Q直到标准的出台才正式定型,|上评论C++标准库时都说Q?#8220;在标准库 的实C却很令hƣ慰得看到多U实玎ͼq且已被实践证明为有工业U别强度的佳作?#8221;但目前的标准C++中,只有一U独苗智能指 针:std::auto_ptr?br>
  auto_ptr指针是一个RAII对象,它初始化时获得资?析构时自动释放资?生命期结?.它的~点C胜数Q?br> 1、auto_ptr要求一个对象只能有一个拥有者,严禁一物二?br> 2、缺对引用数和数组的支持?br> 3、不可将auto_ptr对象作ؓSTL容器的元素。C++标准明确止q样做,否则可能会碰C可预见的l果。(q一条晕M大片Q?br>4、auto_ptr在被复制的时候会传输所有权

反正由此可见Q标准库的智能指针就是无甚大用?br>
    在这L情况下,C++标准委员会自焉要考虑引入新的指针。目前由C++标准委员会库工作l发LBoost l织开发了Boostpd指针?br>
  在Boost中的指针有五U: scoped_ptrQscoped_arrayQshared_ptrQshared_arrayQweak_ptr.

?U完全是针对标准库中的auto_ptr提出解决ҎQ如Qscope_ptr是针?#8220;auto_ptr在被复制的时候会传输所有权”q一q提出的。最后一U没见过Q看名字像是弱引用智能指针,我怀?span onclick="sendmsg('pw_ajax.php','action=relatetag&tagname=是不?,this.id)" style="border-bottom: 1px solid #fa891b; cursor: pointer;" id="rlt_3">是不?/span>cM于JAVA中弱引用一?有待q一步学习?/div>

(Leyn)主 2008-11-09 20:43 发表评论
]]>[转]C++中的指针--指针http://www.shnenglu.com/yearner/archive/2008/11/09/66445.html(Leyn)主(Leyn)主Sun, 09 Nov 2008 12:37:00 GMThttp://www.shnenglu.com/yearner/archive/2008/11/09/66445.htmlhttp://www.shnenglu.com/yearner/comments/66445.htmlhttp://www.shnenglu.com/yearner/archive/2008/11/09/66445.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/66445.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/66445.htmlSmart Pointer?a class="channel_keylink">C++中的一个大题目Q要说清楚他的所有好处很需要费点力气。我׃个功能一个功能的说。有我理解不透的地方希望大家指点?br>
1.copy-to-write
当生成一?a class="channel_keylink">C++ object的时候如果这个class很大Q这个object会占用很多空间。那么每生成一个就占用一片空_q样会占用很多系l资源。同旉低效率。一个解x法就是对用拷贝构?a class="channel_keylink">函数生成的objectQ让他不存储数据Q而只存储一个指向原来object数据?a class="channel_keylink">指针?q样I间p省了很多。但问题在于q样两个object完全联结在了一赗如果修改了其中一个,另一个也跟着变了。所以这U方法不可取。这里讲?copy-to-write技术就是解册c问题的Ҏ。当通过引用一个已有objectL贝构造新objectӞ新object只有一个指向已?object?a class="channel_keylink">指针? q两个object׃n数据。直到其中一个需要修Ҏ据的时候,再把q两块数据分R这里D一个最化的例子。假设一个class? CLargeObjectQ里面存有很多数据。我们用一个inner class来把所有数据放在一P叫CData。CData里面存有大量数据Q例如一?a class="channel_keylink">数据?/a>。这里用最单的模型来表C,假设只有一个整数int m_nVal; CData里面需要包含另一个变量。叫作烦引数?reference count)。它记录了指向这个CData object的来自CLargetObjectcȝ指针各数。也是_d有多CLargeObject的object正在引用着当前的CData object?br>
class CLargeObject
{
private:
    struct CData
    {
    private:
        int m_nVal;
        int m_nReferenceCount;
    }
};

对于每个CLargeObject的objectQ我们用一个CDatacȝ指针来指向其数据?br>CData *m_pData;

CLargeObject臛_有两个构?a class="channel_keylink">函数。第一个是标准的构?a class="channel_keylink">函数Q初始化其数据。这时数据是唯一的,所以必L生成一个CData的object来存储数据?br>CLargeObject::CLargeObject(int nVal)
{
    m_pData = new Data(nVal);
}
而对于CDatacȝ构?a class="channel_keylink">函数而言Q初始化他的CLargeObject是第一个指向他的,q一时刻索引数目m_nReferenceCount??br>CLargeObject::Data::Data(int nVal) : m_nVal(nVal), m_nReferenceCount(1) {}

CLargeObject的第二个构?a class="channel_keylink">函数是拷贝构?copy constructor)。这L成的object不需要有新的数据Q和已有的object׃n数据可以了。这是烦引数目需要加1。表C又有一个object指向当前的CData了?br>CLargeObject::CLargeObject(const CLargeObject &ob) // copy constructor
{
    ob.m_pData->m_nReferenceCount++;
    m_pData = ob.m_pData;
}


q样CLargeObject构造好了,使用了可能的最的内存。下面看看他的析?a class="channel_keylink">函数(destructor)。当一个object被delete的时候,它的数据不一定无效,如果别的objectq在引用着q个数据Q数据需要留下来。当Ӟ数据的烦引数目无论如何都要减1?br>CLargeObject::~CLargeObject()
{
    if (--m_pData->m_nReferenceCount == 0)
        delete m_pData;
}

下面看一看赋值操作。先说用已有的CLargeObject赋值给q个CLargeObject。这时当前CLargeObject里面的数据要指向已有的这个objectQ就搞定了?br>CLargeObject& CLargeObject::operator = (const CLargeObject& ob)    // copy assignment
{
    ob.m_pData->m_nReferenceCount++;
    if (--m_pData->m_nReferenceCount == 0)
        delete m_pData;
    m_pData = ob.m_pData;

    return *this;
}

再来看看如何对CLargeObject里面的数据进行真正的修改。这样就一定需要对当前的object独立操作了,否则媄响到了其它指向同一块数据的CLargeObject。这样CDatac需要一个新?a class="channel_keylink">函数Q生成只用于当前CLargetObject的数据。如果当前的引用数目?Q那么当然这个CData是只用于这个CLargeObject的了。否则就重新new一个CDataq回?br>        Data* CLargeObject::CData::get_own_copy()    // clone if necessary
        {
            if (m_nReferenceCount==1)
                return this;
            m_nReferenceCount--;
            return new Data(m_nVal);
        }
CLargeObject修改前用q个函数得到唯一的objectQ然后对它赋倹{?br>void CLargeObject::SetVal(int nNewVal)
{
    m_pData = m_pData->get_own_copy();
    m_pData->m_nVal = nNewVal;
}
对于所有可能改变CData值的操作Q都需要用q种Ҏ?br>
下面是只?a class="channel_keylink">函数Q简单。直接返回|什么特D的都不用作?br>int CLargeObject::GetVal() const
{
    return m_pData->m_nVal;
}


q样copy-to-write技术就实现了。下面把完整的程序写一下:
class CLargeObject
{
public:
    CLargeObject(int nVal);
    CLargeObject(const CLargeObject &ob);
    ~CLargeObject();

    CLargeObject& operator = (const CLargeObject& ob);
    void SetVal(int nNewVal);
    int GetVal() const;
private:
    struct Data
    {
    public:
        Data(int nVal) : m_nVal(nVal), m_nReferenceCount(1) {}
    private:
        friend class CLargeObject;
        Data* get_own_copy()    // clone if necessary
        {
            if (m_nReferenceCount==1)
                return this;
            m_nReferenceCount--;
            return new Data(m_nVal);
        }

        // control variables.
        int m_nReferenceCount;
    
        // actual data portion
        int m_nVal;
    };

    Data *m_pData;
};

CLargeObject::CLargeObject(int nVal)
{
    m_pData = new Data(nVal);
}

CLargeObject::CLargeObject(const CLargeObject &ob) // copy constructor
{
    ob.m_pData->m_nReferenceCount++;
    m_pData = ob.m_pData;
}

CLargeObject::~CLargeObject()
{
    if (--m_pData->m_nReferenceCount == 0)
        delete m_pData;
}

CLargeObject& CLargeObject::operator = (const CLargeObject& ob)    // copy assignment
{
    ob.m_pData->m_nReferenceCount++;
    if (--m_pData->m_nReferenceCount == 0)
        delete m_pData;
    m_pData = ob.m_pData;

    return *this;
}

void CLargeObject::SetVal(int nNewVal)
{
    m_pData = m_pData->get_own_copy();
    m_pData->m_nVal = nNewVal;
}

int CLargeObject::GetVal() const
{
    return m_pData->m_nVal;
}


很多存储数据的系lclassQ如stringQCString{都有这U设计。所以记住这个应用是很有必要的?/p>

(Leyn)主 2008-11-09 20:37 发表评论
]]>
[转]利用Rational Roseq行C++代码和数据库l构分析http://www.shnenglu.com/yearner/archive/2008/10/28/65350.html(Leyn)主(Leyn)主Tue, 28 Oct 2008 09:36:00 GMThttp://www.shnenglu.com/yearner/archive/2008/10/28/65350.htmlhttp://www.shnenglu.com/yearner/comments/65350.htmlhttp://www.shnenglu.com/yearner/archive/2008/10/28/65350.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/65350.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/65350.html 利用Rational Roseq行C++代码和数据库l构分析
?震杰, IBM 中国软g开发中心Y件工E师

本文内容包括:
 一QRational Rose逆向工程介绍
 二.如何用Rational Roseq行C++代码分析
 三.如何用Rational Roseq行数据库结构分?/font>
 四.如何得到逆向工程的模型图
 五.ȝ
 注释

 Rational Rose是利用UMLQ统一建模语言Q进行分析和设计面向对象软gpȝ的强大的可视化工P可以q行目需求分析、结构规划和生成框架代码Q还可以支持从现有系l逆向转出工程代码Q生成Rose模型的功能?br>2004q?0月,IBM推出了支持最新的UML2.0的可视化建模工具 Rational Software ArchitectQ见注释①) 和IBM Rational Software ModelerQ见注释②)。虽然它们支持在建模功能上有了更好的改进、支持了更新的标准,但是RSA的精彩功能主要是集中在对Java应用的支持,而IBM Rational Software Modeler则是主要xpȝ的模型设计,如果要从l构上分析C++~写的系l的代码QRational Roseq是首选的工具?/p>

接下来的文章会对如何利用Rational Rose 的逆向转出工程来进行系l分析进行更加详l地阐述?/p>

一QRational Rose逆向工程介绍

逆向工程QReverse EngineerQ就是从现有pȝ的代码来生成模型的功能。分析已有的代码其主要的目的是了解代码l构和数据结构,q些对应到模型图是cd、数据模型图和组件图Q对UML各种模型囄描述见注释③Q,也就是通过Rational Rose的逆向工程所得到的结果。Rational Rose所支持的逆向工程功能很强大,包括的编E语a有C++, VB, VC, Java, CORBAQ以及数据库DDL脚本{等Qƈ且可以直接连接DB2, SQLServer, Oracle和Sybase{数据库导入Schemaq生成数据模型?/p>

很多大型的C++开发的产品都涉及到数据库的使用Q对q种大型pȝ的开发,其是做二次开发的情况下,主要的难点就是对源码和数据库l构的分析。而利用Rose的逆向工程q一功能Q就可以完成代码'cd以及数据库Schema->数据模型囄转换Q解册两大隄Q可以开发和设计人员在对q种大型pȝ的升U、分析和开发中Q更为方ѝ快捗有条理地掌握系l结构,不用再ؓ分析庞大的系l结构而头疹{?/p>

二.如何用Rational Roseq行C++代码分析

q一节主要介l用户如何用Rose的逆向工程生成UML模型Qƈ用来q行C++代码的结构分析?/p>

Rational Rose可以支持标准C++和Visual C++的模型到代码的{换以及逆向工程。下面将详细地说明这两种C++ project的逆向工程的步骤和具体操作?/p>

1Q?ANSI C++Q标准C++Q逆向工程QReverse EngineerQ用标准C++逆向工程Q需要在lg图(component viewQ中创徏一个组ӞcomponentQ,讄好需要进行{换的lg的信息,也就是该lg的语a、所包含的文件、文件所在的路径、文件后~{等信息Q然后Reverse Engineer可以根据给定的信息代码{换成cd了?/p>

a) 右键点击lg视图QComponent ViewQ,选择New->ComponentQ创Z个新的组?br> 

 b) component的language属性设定ؓANSI C++

①选中创徏的componentQ点d键,选中Open Specification
 

②在q个对话框中该component的language讑֮为ANSI C++


c) 配置该ANSI C++ componentQ设|好该component中包含的C++代码文gQƈq行C++语言的详l设|?/p>

①选中该componentQ点d键,选择ANSI C++->Open ANSI C++ Specification


②把Source file root directory讑֮Z的C++源码文g所在的路径Qƈ且将需要{换的文gd到Project Files中,视你的需要来做其它的讑֮Q比如:头文件扩展名{等?/p>

d) 设|好的component转换成模型图

①选中讄好的componentQ点d键,选中ANSI C++->Reverse Engineer



 ②选中需要{换的classQ点击okQ一个component的逆向转换完成了?/p>



 2Q?Visual C++ 在用这个功能的时候,要求用户的机器上同时安装Visual Studio。Visual C++的逆向工程也需要首先创Z个componentQƈ该component的language属性设|ؓVC++。Rational Rose对VC++模型的{换是通过dVC++ Project File的信息来实现的,用户只需要将对应的project file信息指定lcomponent可以了?/p>

a) VC++ Project的信息赋l刚刚创建好的component?/p>

①选择该componentQ点d键,选择Assign To Project


②在对话框中扑ֈ刚刚创徏的componentQ右键点dƈ选择Properties?/p>


③在下面对话框中选中需要进行{换的ProjectQ点击okQ该component׃需要{换的project兌上了?/p>



 b) 设|好的component转换成模型图

选中讄好的componentQ点d键,Update Model…Q将会弹出确认对话框Q选中需要{换的classQ点击finish可以了?/p>


三.如何用Rational Roseq行数据库结构分?/strong>

利用Rational Rose可以q行关系数据库的数据模型设计q导出DDL语言脚本Q相反还可以导入已有的DDL脚本生成数据模型以及q接SQLServer, DB2, Oracle{数据库q导入数据库的schema生成数据模型?/p>

下面以SQL ServerZ说明一下逆向转换工程的步骤?/p>

a) 首先Q选择Tools->Data Modeler-> Reverse Engineer


 
 b) 在进行逆向工程转换的过E中可以选择是从数据库还是DDL脚本q行转换Q如果是DDL脚本转换Q就直接l定DDL脚本文g位置可以了。本例子l出的是q接SQLServer数据库将schema导入生成数据模型的过E,所以选中DatabaseQ进入下一步?/p>



 c) 填写数据库相关信?/p>



 d) 选中所有需要{换的schema



 e) 选择需要将哪些数据库中的元素导入到数据模型?br>

转换操作会自动在lg图(Component ViewQ中d数据库组Ӟq在逻辑图(Logical ViewQ中生成以《Schema》作为命名开头的数据模型?/p>



 打开数据模型Q可以看C数据库中转换q来的各个表和视图?/p>



 从数据模型图中可以看到表的结构以及各个表和视图之间的逻辑关系?/p>

四.如何得到逆向工程的模型图

在Rational Rose中,有些模型图是不会自动生成的,很多时候这个工作需要用h工来完成。也是_Rational Rose只负责生成模型,包括模型中的元素、元素的属性以及各个元素之间的关系Q但是需要用户做一些额外的工作来得到视图?/p>

首先Q通过逆向工程Q用户已l得CUML模型或者数据模型的各个lg以及它们之间的关pR?下一步需要在该模型上创徏一个视图,它们可以是类图(class diagramQ描q系l的静态结构)或者数据模型图QData model digramQ描q关pL据结构)。然后,手动从左边的explorer中将各个元素拖进视图中,在这个过E中Q各个元素之间的兌关系会自动在图中表示出来Q而不需要用户再做其他工作?/p>

例如Q生成一个数据模型的数据模型囄q程

从左边将数据模型中的数据元素拖到双的数据模型图中,表CustomerCustomerDemo和表CustomerDemographics之间的依赖关pȝ菱Ş头是自动生成的Q无需手工操作?/p>


一般来_一个系l中所涉及的数据元素非常多Q导致视囑־拥挤Q排版也非常困难。Rational Rose提供的自动排版功能可以很方便地帮助用戯册个问题?/p>

选择Format->Layout DiagramQ系l会图中的所有元素用最优方式重新排列,l用户一个清晰的视图?/p>



 五.ȝ

了解了Rational Rose的逆向工程功能Q用户就可以方便地利用这一工具q行大型数据库相关的C++pȝ的分析和研究了?/p>

注释

①IBM Rational Software Architect是一个集成式设计和开发工P使用户可以用UML模型驱动的开发方式开发出l构清晰的应用程序和服务?/p>

②IBM Rational Software Modeler是基于UML2.0的可定制的可视化建模和设计工P遵@它所提供的工作流E,可以使得pȝ设计师,pȝ分析师,设计人员{写出更为清晰的文档Q更为有效地q行沟通和设计工作?/p>

③UML提供的各U类型的模型描述?/p>

用例?Use Case Diagram)Q描q系l提供的一个功能单元,主要目的是帮助开发团队以一U可视化的方式理解系l的功能需求,包括Z基本程?角色"QactorsQ也是与系l交互的其他实体Q关p,以及pȝ内用例之间的关系?/p>

序列?Sequence Diagram)Q显C具体用例(或者是用例的一部分Q的详细程?/p>

状态图(Statechart Diagram)Q表C某个类所处的不同状态和该类的状态{换信息?/p>

zd?Activity Diagram)Q表C在处理某个zdӞ两个或者更多类对象之间的过E控制流?/p>

cd(Class Diagram)Q表CZ同的实体Qh、事物和数据Q如何彼此相养I换句话说Q它昄了系l的静态结构?/p>

lg?Component Diagram)Q提供系l的物理视图。组ӞComponentQ表C模型代码库、执行库和其它组件的信息。组件是代码的实际模块,lg图主要用h负责控制代码和编译部|应用程序的人。有些组件是代码库,有些lg是运行组Ӟ如执行文件或动态链接库QDLLQ文件。)

部v?Deployment View)Q表C软gpȝ如何部v到硬件环境中?/p>

数据模型?Data Model Diagram)Q描q关pL据结构?/p>



(Leyn)主 2008-10-28 17:36 发表评论
]]>
COM 学习W记(2)-引用计数http://www.shnenglu.com/yearner/archive/2008/10/08/63500.html(Leyn)主(Leyn)主Wed, 08 Oct 2008 13:57:00 GMThttp://www.shnenglu.com/yearner/archive/2008/10/08/63500.htmlhttp://www.shnenglu.com/yearner/comments/63500.htmlhttp://www.shnenglu.com/yearner/archive/2008/10/08/63500.html#Feedback0http://www.shnenglu.com/yearner/comments/commentRss/63500.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/63500.html COM接口采用引用计数来控制组件的生命周期?br> 主要用AddRef ,Release 来进行内存管理,当客户从lg中取得一个接口时Q此引用计数值将?。当客户使用完某个接口后Q组件的引用计数值将??br> 当引用计数gؓ0Ӟlg卛_自׃内从中删除?br> 
 (1)正确使用引用计数的三条简单原?
   1)在返回之前调用AddRef.
   2)使用完接口后调用Release.
   3)在赋g后调用AddRef(指针复制).
  基本原则是避免在使用lgӞlg已被删除?br>  QueryInterface 和CreateInstance中已l调用了AddRef,因此不必再调用它?br>  但两者返回的IUnknow接口和一般接口,用完后都需要调用Release来释放?br>  一般而言Q每当复制一个接口的指针Ӟ都应该相应的增加引用计数?br>   IUnknown* pIUnknown=CreateInstance();
   IX * pIX=NULL;
   HRESULT hr= pIUnknown->QueryInterface(IID_IX,(void **)&pIX);
   pIUnknown->Release();
   if(SUCCEEDED(hr))
   {
    pIX->Fx();    //Fx()为功能函?br>    IX * pIX2=pIX;   //复制指针Q即增加了一个用组?的接?的可能,
    pIX2->AddRef();  //所以要增加计数Qƈ在用完之后release
    pIX2->Fx();     
    pIX2->Release(); //
    pIX->Release(); 
   }
   //上面代码中,作ؓ复制指针pIX2Q其生存周期与pIX相同Q即Q在pIX Release之前pIX2已l不再用了Q?br>   pIX保证了组件用安全的前提下,pIX不用AddRef和Release是肯定没问题的?br>   
   但有时很隑ֈ断某些没有加上AddRef和Release的调用是不是正确Q是优化q是E序错误。一般用来封?br>   引用计数Q从而解册个问题?指针)
   
   lg可以对其每一个接口分别维护一个引用计敎ͼ也可以对整个lgl护单个的引用计数。原则上选择了ؓ每一?br>   接口单独l护一个引用计数而不是针Ҏ个维护计敎ͼ原因Q一QɽE序调试更方便,二,支持pȝ资源的按需获取?br>   
 (2)AddRef\Release 实现
   主要是改变成员变量m_cRef的数倹{AddRef增加其数|Release减小数|q在此gؓ0时将lg删除?br>   单实玎ͼ
    ULONG _stdcall AddRef()
    {
     return ++m_cRef;//return InterlockIncrement(&m_cRef);
    }
    ULONG _stdcall Release()
    {
     if(--m_cRef==0)//if(InterlockDecrement(&m_cRef)==0)
     {
      delete this;
      return 0;
     }
     return m_cRef;
    }
   一般用InterlockIncrement和InterlockDecrement来实现AddRef\Release; 可以保同一旉只有同一U程来访问成员变量?br>  3)引用计数的优化原?br>    像(1)中例子,pIX能保障在pIX2生命周期内,lg肯定会在内存内存留。即Q那些生命周期嵌套在引用同一接口的指针的生命周期之内Ӟ外层的已有引用计敎ͼ内层的就可以不要了?br>    注意那些生命周期重叠的指针?br>    (1)输出参数原则
      如果接口指针以函数返回值或者以传出参数传出Q那么在函数内部Q返回参数前调用AddRef.
      ?QueryInterface/CreateInstance;
    (2)输入参数原则
      若接口指针作为参C递给一个函敎ͼ该函C修改也将其返回调用者,此时无需调用AddRef\Release例:
       void foo(pIX *pIX)
       {
        pIX->Fx();
       }
       因ؓ函数的生命周期嵌套在调用者的生命周期之内的?br>    (3)输入输出参数原则
      对于传递进来的接口指针Q必dl他附另外一个接口指针之前调用releaseQ返回之前,q必d输出参数指向的新接口调用AddRef;
  4)局部变量原?br>    它们是在函数的生存周期内才存在,因此不需要调用AddRef\Release
  5)全局变量原则
    在传递给另一个函C前,必须调用AddRef.
  6)不确定的情况
    此时需要调用AddRef\Release 以防万一


(Leyn)主 2008-10-08 21:57 发表评论
]]>
COM 学习W记Q?Q?/title><link>http://www.shnenglu.com/yearner/archive/2008/07/22/56882.html</link><dc:creator>(Leyn)主</dc:creator><author>(Leyn)主</author><pubDate>Tue, 22 Jul 2008 10:50:00 GMT</pubDate><guid>http://www.shnenglu.com/yearner/archive/2008/07/22/56882.html</guid><wfw:comment>http://www.shnenglu.com/yearner/comments/56882.html</wfw:comment><comments>http://www.shnenglu.com/yearner/archive/2008/07/22/56882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yearner/comments/commentRss/56882.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yearner/services/trackbacks/56882.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span lang="EN-US">COM </span><span style="font-family: 宋体;">学习W记</span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p> <p class="MsoNormal"><span lang="EN-US">QueryInterface</span><span style="font-family: 宋体;">函数</span></p> <p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">主要用于</span><span lang="EN-US">COM</span><span style="font-family: 宋体;">接口的查询。它?/span><span lang="EN-US">COM</span><span style="font-family: 宋体;">接口定义</span><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">的成员函敎ͼ客户可以调用</span><span lang="EN-US">QueryInterface</span><span style="font-family: 宋体;">来决定组件是否支持某个特定的接口?/span></p> <p class="MsoNormal"><span lang="EN-US"><span>       </span></span><span style="font-family: 宋体;">lg</span><span lang="EN-US">COM</span><span style="font-family: 宋体;">接口都是?/span><span lang="EN-US">IUnkonwn</span><span style="font-family: 宋体;">接口l承而来QQ何一个接口都可以?/span><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">的成?/span><span lang="EN-US">QueryInterface</span><span style="font-family: 宋体;">来获取它所支持的其它接口?/span></p> <p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">1</span><span style="font-family: 宋体;">Q定义:</span></p> <p class="MsoNormal"><span lang="EN-US"><span>       </span>HRESULT _stdcall QueryInterface(const IID& iid,void ** ppv);</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">W一个参数十所需接口的标识,是一个接口标识符</span><span lang="EN-US">IID</span><span style="font-family: 宋体;">l构?/span> <span style="font-family: 宋体;">W二个参数存放所h接口指针的地址?/span></p> <p class="MsoNormal"><span lang="EN-US"><span> </span><span>     </span>2</span><span style="font-family: 宋体;">Q用过E:</span></p> <p class="MsoNormal"><span lang="EN-US"><span>       </span></span><span style="font-family: 宋体;">假定已有一个指?/span><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">的指?/span><span lang="EN-US">pI</span><span style="font-family: 宋体;">Qؓ知道相应的组件是否支持某个特定的接口Q调?/span><span lang="EN-US">QueryInterface</span><span style="font-family: 宋体;">Q传l它一个接口标识符。若成功q回Q那是可以使用它返回的指针?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Void foo(IUnknown * pI)</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>IX *pIX=NULL;</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">HRESULT hr=pI->QueryInterface(IID_IX,(void **)&pIX);</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">If(SUCCEEDED(hr))</span></p> <p class="MsoNormal" style="margin-left: 41.25pt; text-indent: 21.75pt;"><span lang="EN-US">pIX->Fx();</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-family: 宋体;">该函数用于查?/span><span lang="EN-US">pI</span><span style="font-family: 宋体;">是否支持?/span><span lang="EN-US">IID_IX</span><span style="font-family: 宋体;">所标识的接口?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">的承不是虚拟基cR?/span><span lang="EN-US">COM</span><span style="font-family: 宋体;">接口不能按照虚拟方式l承它?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">3</span><span style="font-family: 宋体;">Q实玎ͼ</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Interface IX</span><span style="font-family: 宋体;">Q?/span><span lang="EN-US">IUnknown{/**/}</span><span style="font-family: 宋体;">Q?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Interface IY</span><span style="font-family: 宋体;">Q?/span><span lang="EN-US">IUnknown{/**/}</span><span style="font-family: 宋体;">Q?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Class CA</span><span style="font-family: 宋体;">Q?/span><span lang="EN-US">public IX,public IY{/**/};</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-family: 宋体;">主要通过判断标识W是否ؓ</span><span lang="EN-US">CA</span><span style="font-family: 宋体;">的支持类型,来判断是否ؓ存在?/span><span lang="EN-US">CA</span><span style="font-family: 宋体;">中的</span><span lang="EN-US">COM</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">HRESULT _stdcall CA:;QueryInterface(const IID &iid,void **ppv)</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>If(iid==IID_IUnknown)</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>*ppv=static_cast<IX *>(this);</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Else if(iid==IID_IX)</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>*ppv=static_cast<IX*>(this);</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Else if (iid==IID_IY)</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>*ppv=static_cast<IY*>(this);</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Else </span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">{</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US"><span>       </span>*ppv=NULL;</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Return E_NOINTERFACE;</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Static_cast<IUnknown*>(*ppv)->AddRef();</span></p> <p class="MsoNormal" style="margin-left: 20.25pt; text-indent: 21.75pt;"><span lang="EN-US">Return S_OK;</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">}</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">4</span><span style="font-family: 宋体;">Q关于其中的cd转换</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US"><span>   </span></span><span style="font-family: 宋体;">E序中若?/span><span lang="EN-US">this</span><span style="font-family: 宋体;">指针直接转换?/span><span lang="EN-US">IUnknown*</span><span style="font-family: 宋体;">是不明确的。因为存在两个基cL口,需要指明是转换向哪一个接口的</span><span lang="EN-US">IUnknown</span><span style="font-family: 宋体;">?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span lang="EN-US">Static_cast<IUnknown*> (static_cast<IX *>(this))</span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-size: 10.5pt; font-family: "times new roman","serif";" lang="EN-US"><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="'width:414.75pt; height:235.5pt'"> <v:imagedata src="file:///C:\DOCUME~1\LEYANG~1.ETH\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--><img src="file:///C:/DOCUME~1/LEYANG~1.ETH/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.jpg" v:shapes="_x0000_i1025" height="314" width="553"><!--[endif]--></span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-family: 宋体;">在类型{换时Q?/span><span lang="EN-US">CA</span><span style="font-family: 宋体;">按照序存放它的基类接口及其实现Q其</span><span lang="EN-US">this</span><span style="font-family: 宋体;">指针可以?/span><span lang="EN-US">IX</span><span style="font-family: 宋体;">代替Q地址值相同)?/span></p> <p class="MsoNormal" style="text-indent: 21.75pt;"><span style="font-family: 宋体;">?/span><span lang="EN-US">IY</span><span style="font-family: 宋体;">则需?/span><span lang="EN-US">CA</span><span style="font-family: 宋体;">的基址加上偏移址?/span></p> <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p><img src ="http://www.shnenglu.com/yearner/aggbug/56882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yearner/" target="_blank">(Leyn)主</a> 2008-07-22 18:50 <a href="http://www.shnenglu.com/yearner/archive/2008/07/22/56882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微Y面试l历http://www.shnenglu.com/yearner/archive/2008/05/29/51515.html(Leyn)主(Leyn)主Thu, 29 May 2008 12:36:00 GMThttp://www.shnenglu.com/yearner/archive/2008/05/29/51515.htmlhttp://www.shnenglu.com/yearner/comments/51515.htmlhttp://www.shnenglu.com/yearner/archive/2008/05/29/51515.html#Feedback2http://www.shnenglu.com/yearner/comments/commentRss/51515.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/51515.html       接着面试官给我发了一沓纸Q其中一张是试题Q三张钉在一L是参考资料,主要是范式的说明Q其他都是草U?br>        题目不多Qd五道Q但都比较典型。前三题是c++基础Q?题要求写范式Q?题数据库?br>        W一题:
         ~写字符串{换int型的函数Qint atoi(char* str) Q例如输入字W?123"输出int 型数据?br>        1. 要求不能使用库函?.可能多地考虑Ҏ情况
        q道题主要考察了对各种情况考虑是否全面Q考虑正负P非法字符Q空格的处理Q小数点的处理。尽量一ơ@环搞定。其中小数点后的非法字符按直接略掉处理?br>        W二题:
         ~写函数完成字符串的反{ node * reverse(node * head)
         q个比较单,但注意头指针不在反{范围内,q个是在技术面的时侯,面试官手把手的告诉我?)
         W三?br>         完成函数 char * strtok(char *s ,char delim) 把字W串从delim处split.
         也比较简?br>         W四?br>         write Regulation expression according to the reference.
         1, get all the url from the "         2. write regulation expression for the following url: 
            
http://www.microsoft.com/production/id=123&reviewOid=1985&custom=257
            http://www.microsoft.com/production/id=5343&reviewOid=1431
            http://www.microsoft.com/production/id=6576&reviewOid=31614&custom=412         
             http://www.microsoft.com/production/id=234&reviewOid=43134&custom=22
         2write regulation expression for the email address.
      q道题有参考,所有的范式表达式都有reference,只需L了材料比较简单?br>         W五?br>         数据库题
         design a database for user to borrow or return books from the library.the database should function as follow:
         1)the user can borrow several copies of the same book
         2)when the book borrowed , the time should be recorded.
         3)the user should register in the system to get the authority for the logining in.
        write sql sentence for the follow question:
         1) insert a new record when a book borrowed/returned.
         2) get all the users ,which does not return book.
         3) get all the books ,which are never borrowed.
         3) get the books which have been borrowed for more than 10 times.
         题目是q样?br>         大概作了一个小Ӟ来了个男面试官,收走试卷Q让我等。旁Ҏ俩哥们是同来面试的,聊了两句Q他俩竟是微软别的部门推来面试的Q属于赋闲等待再׃的。正暗自比较与这俩哥们的差距Q面试官来了Q让我留下,竟把那俩哥们直接拒了Q有些庆q,调整心态?br>        q个面试官主要针Ҏ{的试题面试Q不断指正我试卷上的错误和遗漏点Qƈ且给我时间改正。讨Z一会,光也问我问题?br>        然后他走后,接待我的那个女面试官qW记本过来?br>        我俩先聊了一下,我借机问了几个问题。然后我q她讲我的一些经历?br>        她给我一份资料,是关于h工对|页q行分类的说明,告诉我看q后可以问问题,然后打开W记本让我对指定的网分cR大概是按照|页的功能分成了五类Q?br>        最后的面试官比较年轻,问了个关于Hash 表的问题Q然后看了我的简历,问了个ajax的问题?br>        那个hash table 问题不是直接问的Q?br>        文g里存在字典列表,扑և字母正好相反的单词,比如 dog ,god ;
      











(Leyn)主 2008-05-29 20:36 发表评论
]]>
数据l构与算法学习记录:快速排?(?http://www.shnenglu.com/yearner/archive/2008/05/28/51404.html(Leyn)主(Leyn)主Wed, 28 May 2008 08:52:00 GMThttp://www.shnenglu.com/yearner/archive/2008/05/28/51404.htmlhttp://www.shnenglu.com/yearner/comments/51404.htmlhttp://www.shnenglu.com/yearner/archive/2008/05/28/51404.html#Feedback1http://www.shnenglu.com/yearner/comments/commentRss/51404.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/51404.html 数据l构与算法学习记录:快速排?/a>
快速排序的基本思想Q?/strong>
分治法,卻I分解Q求解,l合 .

分解Q?/strong>
? 无序区R[low..high]中Q选一个记录作为基?通常选第一个记录,q记为Pivot,其下标ؓpivotpos),以此为基准划分成两个较小? 子区间R[low,pivotpos - 1]和R[pivotpos + 1 , high],q左边子区间的所有记录均于{于基准记录,双子区间的所有记录均大于{于基准记录,基准记录无需参加后箋的排序。而划分的关键是要求出 基准记录所在的位置pivotpos.

求解Q?br>通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排?br>
l合Q?br>?求解"步骤中的两个递归调用l束Ӟ其左、右两个子区间已有序。对快速排序而言Q?l合"步骤无须做什么,可看作是I操作?br>
具体q程Q?/strong>
讑ֺ列ؓR[low,high]Q从其中选第一个ؓ基准Q设为pivot,然后设两个指针i和j,分别指向序列R[low,high]的v始和l束位置上:
      1Q,i逐渐增大Q直到找到大于pivot的关键字为止Q?br>      2Q,j逐渐减少Q直到找到小于等于pivot的关键字为止Q?br>      3Q,如果i<jQ即R[i,j]的元素数大于1Q则交换R[i]和R[j]Q?br>      4Q,基准记录pivot攑ֈ合适的位置上,即i和j同时指向的位|?则此位置为新的pivotpos?br>
备注Q?br>快速排序是不稳定排?/font>,即相同的关键字排序后Q相对位|是不确定的?br>
CZ代码Q?br>

    public class DataStructure_QuickSort
    
{
        
//划分子区?计算基准位置

        int Partition(int[] arr , int nLower ,int nUpper)
        
{
            
int pivot = arr[nLower] ;//取第一个记录ؓ基准记录

            int nLeft = nLower + 1;  //?Qpivot无需和自w做比较
            int nRight = nUpper ;

            
int
 temp ;
            
do
{
                
while (nLeft <= nRight && arr[nLeft] <= pivot) //nLeft逐渐增大Q直到找到大于pivot的下标ؓ?/span>

                    nLeft++ ;

                
while (nLeft <= nRight && arr[nRight] > pivot) //从nRight逐渐减少Q直到找到小于等于pivot的下标ؓ?/span>

                    nRight-- ;

                
//R[nLeft,nRight]区间的长?元素?大于1Ӟ交换R[nLeft]和R[nRight]

                if (nLeft < nRight)
                
{
                    temp 
=
 arr[nLeft] ;
                    arr[nLeft] 
=
 arr[nRight] ;
                    arr[nRight] 
=
 temp ;

                    nLeft
++
;
                    nRight
--
;
                }

            }
 while (nLeft < nRight); //当nLeft == nRight的时候停止@?br>
            
//把基准记录pivot攑ֈ正确位置Q即nLeft和nRight同时指向的位|?/span>

            temp = arr[nLower];
            arr[nLower] 
=
 arr[nRight];
            arr[nRight] 
=
 temp ;

            
return
 nRight ;
        }


        
public void QuickSort(int[] arr, int nLower, int nUpper)
        
{
            
int pivotpos; //基准下标

            if (nLower < nUpper) //仅当区间范围长度大于1时才L?/span>
            {
                pivotpos 
= Partition(arr, nLower, nUpper);//划分子区?知道基准下标(QuickSort的关?

                QuickSort(arr, nLower, pivotpos - 1);     //对左区间递归排序 
                QuickSort(arr, pivotpos + 1, nUpper);     //对右区间递归排序
            }

        }

    }


(Leyn)主 2008-05-28 16:52 发表评论
]]>
C++ 学习Q二 Q多态性(U篏中)http://www.shnenglu.com/yearner/archive/2008/05/20/50591.html(Leyn)主(Leyn)主Tue, 20 May 2008 15:37:00 GMThttp://www.shnenglu.com/yearner/archive/2008/05/20/50591.htmlhttp://www.shnenglu.com/yearner/comments/50591.htmlhttp://www.shnenglu.com/yearner/archive/2008/05/20/50591.html#Feedback4http://www.shnenglu.com/yearner/comments/commentRss/50591.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/50591.html  从系l实现角度来看。多态性分Zc:静态多态性和动态多态性?br>  静态多态性:在程序编译时pȝp军_调用哪个函数Q因此静态函数有U编译时的多态?实质上是通过函数的重载实?。例如:函数的重载和q算W重载实?
  动态多态性:q行q程中才动态地定操作指针所指的对象。主要通过虚函数和重写来实现?br>

(Leyn)主 2008-05-20 23:37 发表评论
]]>
C++ 学习Q一Q类型{?/title><link>http://www.shnenglu.com/yearner/archive/2008/05/20/50457.html</link><dc:creator>(Leyn)主</dc:creator><author>(Leyn)主</author><pubDate>Tue, 20 May 2008 11:12:00 GMT</pubDate><guid>http://www.shnenglu.com/yearner/archive/2008/05/20/50457.html</guid><wfw:comment>http://www.shnenglu.com/yearner/comments/50457.html</wfw:comment><comments>http://www.shnenglu.com/yearner/archive/2008/05/20/50457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yearner/comments/commentRss/50457.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yearner/services/trackbacks/50457.html</trackback:ping><description><![CDATA[1.cd转换按方式分为隐式{换和昑ּ转换?br>        隐式转换Q由~译器自动完成,无需用户q预?br>        昑ּ转换Q采用一定的形式q行转换Q类型名Q数据) / C中(cd名)数据<br>2.关于转换构造函?br>        构造函数的一U,主要用于cd转换Q格式严D定ؓ单参数构造函数?br>        例:Complexc?br>             Complex(double r){Real=r;imag=0;}  int(double r);<br>             Complex a;<br>              a=2.4; 相当于a=Complex(2.4);<br>         ~译器如果发现语法有问题Q会查是否存在{换构造函敎ͼ有,则隐式{换?br> 3.关于cd转换函数<br>         转换构造函数是一U数据类型{换成cd象。如果编译器发现需要将c{换成某种数据cdQ那该怎么办?<br>         cd转换函数的一般Ş式:operator cd名(Q{转换函数的实现}<br>        没有函数cdQ没有参数?br>         例:<br>     #include<iostream><br>     using namespace std;<br>      class Complex<br>      {<br>        public :<br>         Complex(){real=0;imag=0;}<br>         Complex(double r,double i){real=r;imag=i;}<br>          operator double(){return real;}<br>          private:<br>           double real;<br>           double imag; <br>       };<br>       int main()<br>    {<br>         Complex c1(3,4),c2(5,-10),c3;<br>         double d;<br>         d=2.5+c1;<br>         cout<<d<<end1;<br>         return0;<br>    }<br>     d=2.5+c1;<br>     ׃cL员没有对q算W?重蝲Q所?.5与c1无法直接向加。编译器发现存在cd转换函数Q故?隐式调用double(), c1转换?double ?Qƈ该l果存放在时变量里。运d=2.5+3得到l果?br> 若主函数中有c3=2.5+c1;如果没有q算W+的重载,~译器会出错。当 q算W重载函C为类成员出现Ӟ~译器会理解为c3=2.5.operator +(c1);׃2.5非complexc,q种解析~译器也会出错。对于c3=c1+2.5的格式,~译器会正确处理?br> q种情况使用户不能方便的使用交换率,Z改变q一不便Q需要将重蝲函数作ؓ友元函数而不是类成员函数?双目q算W的重蝲一般都采用友元函数的方?<br> friend Complex operator +(Complex c1,complex c2);<br>    在函C外定义:<br> Complex operator +(Complex c1,complex c2);<br>  {return Complex (c1.real +c2.real,c1.imag+c2.imag);}<br>q样Q对于c3=2.5+c1;Q需要增加{换构造函敎ͼ~译器在遇到Q号Ӟ会搜索+两端的数据ƈ引用友元的运符重蝲函数Q其形式变ؓQc3=operator+(2.5,c1); 而参数定义都是Complex对象Q因此,隐式调用转换构造函敎ͼ形式变ؓQc3=operator+(Complex (2.5),c1); <br>     <br><br>   <br>         <br><br> <img src ="http://www.shnenglu.com/yearner/aggbug/50457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yearner/" target="_blank">(Leyn)主</a> 2008-05-20 19:12 <a href="http://www.shnenglu.com/yearner/archive/2008/05/20/50457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关内存的思考题(U篏中)http://www.shnenglu.com/yearner/archive/2008/05/16/50112.html(Leyn)主(Leyn)主Fri, 16 May 2008 15:59:00 GMThttp://www.shnenglu.com/yearner/archive/2008/05/16/50112.htmlhttp://www.shnenglu.com/yearner/comments/50112.htmlhttp://www.shnenglu.com/yearner/archive/2008/05/16/50112.html#Feedback1http://www.shnenglu.com/yearner/comments/commentRss/50112.htmlhttp://www.shnenglu.com/yearner/services/trackbacks/50112.html

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

strcpy(str, "hello world");

printf(str);

}

请问q行Test 函数会有什么样的结果?

{:E序崩溃?/span>

因ؓGetMemory q不能传递动态内存,

Test 函数中的 str 一直都?/span> NULL?/span>

strcpy(str, "hello world");ɽE序?/span>

溃?/span>

char *GetMemory(void)

{

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}

请问q行Test 函数会有什么样的结果?

{:可能是ؕ码?/span>

因ؓGetMemory q回的是指向“栈内?#8221;

的指针,该指针的地址不是 NULLQ但其原

现的内容已经被清除,新内容不可知?/span>

void GetMemory2(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");

printf(str);

}

请问q行Test 函数会有什么样的结果?

{:

Q?/span>1Q能够输?/span>hello

Q?/span>2Q内存泄?/span>

void Test(void)

{

char *str = (char *) malloc(100);

strcpy(str, “hello”);

free(str);

if(str != NULL)

{

strcpy(str, “world”);

printf(str);

}

}

请问q行Test 函数会有什么样的结果?

{:改动态内存区的内容,后果难以?/span>

料,非常危险?/span>

因ؓfree(str);之后Q?/span>str 成ؓ野指针,

if(str != NULL)语句不v作用?/span>

2.关于内存泄露

  在计机U学中,内存泄漏指由于疏忽或错误造成E序未能释放已经不再使用的内存的情况。内存泄漏ƈ非指内存在物理上的消失,而是应用E序分配某段内存后, ׃设计错误Q失M对该D内存的控制Q因而造成了内存的费。内存泄漏与许多其他问题有着怼的症Ӟq且通常情况下只能由那些可以获得E序源代码的E? 序员才可以分析出来。然而,有不h习惯于把M不需要的内存使用的增加描qCؓ内存泄漏Q即使严格意义上来说q是不准的?br>        一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指E序从堆中分配的Q大Q意的Q内存块的大可以在E序q行期决定)Q用完后必LC释攄内存? 应用E序一般用mallocQreallocQnew{函C堆中分配C块内存,使用完后Q程序必负责相应的调用free或delete释放该内? 块,否则Q这块内存就不能被再ơ用,我们pq块内存泄漏了?/p>

(Leyn)主 2008-05-16 23:59 发表评论
]]>
数据cd转换Qstatic_cast,const_cast{用?转蝲Q?/title><link>http://www.shnenglu.com/yearner/archive/2008/05/16/50077.html</link><dc:creator>(Leyn)主</dc:creator><author>(Leyn)主</author><pubDate>Fri, 16 May 2008 11:01:00 GMT</pubDate><guid>http://www.shnenglu.com/yearner/archive/2008/05/16/50077.html</guid><wfw:comment>http://www.shnenglu.com/yearner/comments/50077.html</wfw:comment><comments>http://www.shnenglu.com/yearner/archive/2008/05/16/50077.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/yearner/comments/commentRss/50077.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yearner/services/trackbacks/50077.html</trackback:ping><description><![CDATA[<div id="cyeuyww" class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl"><font color="#000000"><br></font></a> </div> * C++提供了四U新的类型强Ӟ <br><br>static_cast <br>const_cast <br>reinterpret_cast <br>dynamic_cast <br><br>1)staic_cast静态强Ӟ <br><br>不能在无关的指针之间q行staticcd强制 <br>class CAnimal <br>{ <br>//... <br>public: <br>CAnimal(){} <br>}; <br><br>class CGiraffe:public CAnimal <br>{ <br>//... <br>public: <br>CGiraffe(){} <br>}; <br><br>int main(void) <br>{ <br>CAnimal an; <br>CGiraffe jean; <br><br>an = static_cast<CAnimal>(jean);//对象jean强制成CAnimalcd <br>return 0; <br>} <br><br>2、const_castcd强制 <br><br>const_castcd强制一个const变量变成一个非const的等价Ş?<br>int main() <br>{ <br>const int j = 99; <br>int * k; <br><br>k = const_cast<int *>(&j);//解除const <br>return 0; <br>} <br><br>3、reinterpret_castq算W?<br><br>reinterpret_castq算W用来将一个类型指针{变ؓ另一U类型的指针Q也用在整开型量转ؓ指针Q或指针{为整型量上; <br>int main() <br>{ <br>int j = 10; <br>int * ptr = &j; <br>char * cptr; <br><br>cptr = reinterpret_cast<char *>(ptr);//int指针cd转变为char的指针类?<br><br>return 0; <br>} <br><br>4、dynamic_castq算W?<br><br>dynamic_cast的主要目的是Q?<br><br>1Q它q回zcd象的地址Q?<br>2Q它试基类指针是否指向下一括?lt;>中所指定cd的对?<br><br>dynamic_cast是一个运行时cd信息Qdynamic_castq算W将指向z对象的基c部分的基类指针转变为指向派生对象的zcL针,dynamic_cast必须严格地指定与z对象相同的类Q或者它q回NULL指针; <br>class CAnimal <br>{ <br>//... <br>}; <br>class CGiraffe:public CAnimal <br>{ <br>//... <br>}; <br>class CGoat:public CAnimal <br>{ <br>//... <br>}; <br><br>int main() <br>{ <br>CGiraffe gene; <br>CAnimal * aptr = &gene; <br>CGiraffe * ptr1,* ptr2; <br><br>ptr1 = dynamic_cast<CGiraffe *>(aptr); <br>ptr2 = dynamic_cast<CGoat *>(aptr); //return NULL <br><br>return 0; <br>}  <br><img src ="http://www.shnenglu.com/yearner/aggbug/50077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yearner/" target="_blank">(Leyn)主</a> 2008-05-16 19:01 <a href="http://www.shnenglu.com/yearner/archive/2008/05/16/50077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++面试?/title><link>http://www.shnenglu.com/yearner/archive/2006/09/10/12208.html</link><dc:creator>(Leyn)主</dc:creator><author>(Leyn)主</author><pubDate>Sun, 10 Sep 2006 01:11:00 GMT</pubDate><guid>http://www.shnenglu.com/yearner/archive/2006/09/10/12208.html</guid><wfw:comment>http://www.shnenglu.com/yearner/comments/12208.html</wfw:comment><comments>http://www.shnenglu.com/yearner/archive/2006/09/10/12208.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.shnenglu.com/yearner/comments/commentRss/12208.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yearner/services/trackbacks/12208.html</trackback:ping><description><![CDATA[<p id="fp">1.是不是一个父cd了一个virtual 函数Q如果子c覆盖它的函C加virtual ,也能实现多?<br><br> <br><br>virtual修饰W会被隐形承的?br><br>private 也被集成Q只事派生类没有讉K权限而已<br><br>virtual可加可不?br><br>子类的空间里有父cȝ所有变?static除外)<br><br>同一个函数只存在一个实?inline除外)<br><br>子类覆盖它的函数不加virtual ,也能实现多态?br><br>在子cȝI间里,有父cȝU有变量。私有变量不能直接访问?br><br><br>--------------------------------------------------------------------------<br>2.输入一个字W串Q将光序后输出。(使用C++Q不用伪码)<br><br>#include <iostream><br>using namespace std;<br><br><br>void main()<br>{<br>  char a[50];memset(a,0,sizeof(a));<br>  int i=0,j;<br>  char t;<br>  cin.getline(a,50,'\n');<br>  for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--)<br>  {<br>   t=a[i];<br>      a[i]=a[j];<br>   a[j]=t;<br>  }<br>  cout<<a<<endl;  <br>}<br><br>//W二U?br><br>string str;<br>cin>>str;<br>str.replace;<br>cout<<str;<br><br><br>--------------------------------------------------------------------------<br>3.L单描qWindows内存理的方法?br><br>内存理是操作系l中的重要部分,两三句话恐怕谁也说不清楚吧~~<br>我先说个大概Q希望能够抛砖引玉吧<br><br>当程序运行时需要从内存中读D늨序的代码。代码的位置必须在物理内存中才能被运行,׃现在的操作系l中有非常多的程序运行着Q内存中不能够完全放下,所以引Z虚拟内存的概c把哪些不常用的E序片断放入虚拟内存,当需要用到它的时候在load入主存(物理内存Q中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做Q计程序片D在d中的物理位置Q以便CPU调度?br><br>内存理有块式管理,式理Q段式和D页式管理。现在常用段式理<br><br>块式理Q把d分ؓ一大块、一大块的,当所需的程序片断不在主存时分配一块主存空_把程 序片断load入主存,q所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,q_费?0Q的内存I间Q但时易于管理?br><br>式理Q把d分ؓ一一늚Q每一늚I间要比一块一块的I间很多,昄q种Ҏ的空间利用率要比块式理高很多?br><br>D式理Q把d分ؓ一D一D늚Q每一D늚I间又要比一一늚I间很多,q种Ҏ在空间利用率上又比页式管理高很多Q但是也有另外一个缺炏V一个程序片断可能会被分为几十段Q这样很多时间就会被费在计每一D늚物理地址上(计算机最耗时间的大家都知道是I/O吧)?br><br>D页式管理:l合了段式管理和式理的优炏V把d分ؓ若干,每一又分ؓ若干Dc好处就很明显,不用我多说了吧?br><br>各种内存理都有它自qҎ来计出E序片断在主存中的物理地址Q其实都很相伹{?br><br>q只是一个大概而已Q不以说明内存理的皮毛。无论哪一本操作系l书上都有详l的讲解<br><br><br>--------------------------------------------------------------------------<br>4.<br>#include "stdafx.h"<br>#define SQR(X) X*X<br><br>int main(int argc, char* argv[])<br>{<br> int a = 10;<br> int k = 2;<br> int m = 1;<br><br> a /= SQR(k+m)/SQR(k+m); <br> printf("%d\n",a); <br><br> return 0;<br>}<br>q道题目的结果是什么啊?<br><br>define 只是定义而已Q在~择时只是简单代换X*X而已Qƈ不经q算术法则的<br><br>a /= (k+m)*(k+m)/(k+m)*(k+m);</p> <p id="fp">a/=k+m*k+m/k+m*k+m<br>=>a /= 2+1*2+1/2+1*2+1<br>=>a = a/7;<br>=>a = 1;<br><br>--------------------------------------------------------------------------<br>5.<br>const W号帔RQ?br>(1)const char *p<br>(2)char const *p<br>(3)char * const p<br>说明上面三种描述的区别;<br><br><br>如果const位于星号的左侧,则const是用来修饰指针所指向的变量,x针指向ؓ帔RQ?br>如果const位于星号的右侧,const是修饰指针本nQ即指针本n是常量?br><br>(1)const char *p<br><br>一个指向charcd的const对象指针Qp不是帔R,我们可以修改p的|使其指向不同的charQ但是不能改变它指向非char对象Q如Q?br>const char *p;<br>char c1='a';<br>char c2='b';<br>p=&c1;//ok<br>p=&c2;//ok<br>*p=c1;//error<br><br>(2)char const *p<br>(3)char * const p<br><br>q两个好象是一LQ此?p可以修改Q而p不能修改?br><br>(4)const char * const p<br>q种是地址及指向对象都不能修改?br><br>--------------------------------------------------------------------------<br>6.下面是C语言中两Uif语句判断方式。请问哪U写法更好?Z么?<br> int n;<br> if (n == 10) // W一U判断方?br> if (10 == n) // W二U判断方?br><br>如果了??~译时就会报?减少了出错的可能?可以出是否了=<br><br>--------------------------------------------------------------------------<br>7.下面的代码有什么问题?<br>void DoSomeThing(...)<br>{<br> char* p;<br> ...<br> p = malloc(1024);  // 分配1K的空?br> if (NULL == p)<br>  return;<br> ...<br> p = realloc(p, 2048); // I间不够Q重新分配到2K<br> if (NULL == p)<br>  return;<br> ...<br>}<br><br>A:<br>p = malloc(1024);     应该写成Q?nbsp;p = (char *) malloc(1024); <br>        没有释放p的空_造成内存泄漏?br><br><br>--------------------------------------------------------------------------<br>8.下面的代码有什么问题?q请l出正确的写法?br>void DoSomeThing(char* p)<br>{<br> char str[16];<br> int n;<br> assert(NULL != p);<br> sscanf(p, "%s%d", str, n);<br> if (0 == strcmp(str, "something"))<br> {<br>  ...<br> }<br>}<br><br>A:<br>sscanf(p, "%s%d", str, n);   q句该写成: sscanf(p, "%s%d", str, &n);<br><br>--------------------------------------------------------------------------<br>9.下面代码有什么错?<br>Void test1() <br>{ <br> char string[10]; <br> char *str1="0123456789";<br> strcpy(string, str1); <br>} <br><br>数组界<br><br>--------------------------------------------------------------------------<br>10.下面代码有什么问?<br>Void test2() <br>{ <br>  char string[10], str1[10]; <br>  for(i=0; i<10;i++) <br>  { <br>     str1[i] ='a'; <br>  } <br>  strcpy(string, str1); <br>} <br><br>数组界<br><br>--------------------------------------------------------------------------<br>11.下面代码有什么问?<br>Void test3(char* str1) <br>{ <br>  char string[10]; <br>  if(strlen(str1)<=10) <br>  { <br>    strcpy(string, str1); <br>  } <br>} <br><br>==数组界<br>==strcpy拯的结束标志是查找字符串中的\0 因此如果字符串中没有遇到\0的话 会一直复Ӟ直到遇到\0,上面?23都因此生越界的情况<br> <br>使用 strncpy ?nbsp;memcpy<br><br>--------------------------------------------------------------------------<br>12.下面代码有什么问?<br><br>#define MAX_SRM 256 <br><br>DSN get_SRM_no() <br>{ <br>  static int SRM_no; //是不是这里没赋初|<br>  int I; <br>  for(I=0;I<MAX_SRM;I++,SRM_no++) <br>  { <br>    SRM_no %= MAX_SRM; <br>    if(MY_SRM.state==IDLE) <br>    { <br>      break; <br>    } <br>  } <br>  if(I>=MAX_SRM) <br>    return (NULL_SRM); <br>  else <br>    return SRM_no; <br>} <br><br>pȝ会初始化static int变量?,但该g一直保?所谓的不可重入...<br><br>--------------------------------------------------------------------------<br>13.写出q行l果:<br>{// test1<br>    char str[] = "world"; cout << sizeof(str) << ": ";<br>    char *p    = str;     cout << sizeof(p) << ": ";<br>    char i     = 10;      cout << sizeof(i) << ": ";<br>    void *pp   = malloc(10);  cout << sizeof(p) << endl;<br>}<br><br>6Q?Q?Q?<br><br>--------------------------------------------------------------------------<br>14.写出q行l果:<br>{// test2<br>    union V {<br> struct X {<br>  unsigned char s1:2;<br>  unsigned char s2:3;<br>  unsigned char s3:3;<br> } x;<br><br> unsigned char c;<br>    } v;<br><br>    v.c = 100;<br>    printf("%d", v.x.s3); <br><br>}<br><br>3<br><br>--------------------------------------------------------------------------<br>15.用C++写个E序Q如何判断一个操作系l是16位还?2位的Q不能用sizeof()函数<br><br>A1:<br>16位的pȝ下,<br>int i = 65536;<br>cout << i; // 输出0Q?br>int i = 65535;<br>cout << i; // 输出-1Q?br><br>32位的pȝ下,<br>int i = 65536;<br>cout << i; // 输出65536Q?br>int i = 65535;<br>cout << i; // 输出65535Q?br><br>A2:<br><br>int a = ~0;<br>if( a>65536 ) <br>{<br>    cout<<"32 bit"<<endl;<br>}<br>else<br>{<br>    cout<<"16 bit"<<endl;<br>}<br><br><br>--------------------------------------------------------------------------<br>16.C和C++有什么不?<br><br>从机制上Qc是面向过E的Q但c也可以编写面向对象的E序Q;c++是面向对象的Q提供了cR但是,<br>c++~写面向对象的程序比cҎ<br><br>从适用的方向:c适合要求代码体积的Q效率高的场合,如嵌入式Qc++适合更上层的Q复杂的Q?nbsp; llinux核心大部分是c写的Q因为它是系lYӞ效率要求极高?br><br>从名UC也可以看出,c++比c多了+Q说明c++是c的超集;那ؓ什么不叫c+而叫c++呢,是因为c++?br>c来说扩充的东西太多了Q所以就在c后面放上两个+Q于是就成了c++<br><br>C语言是结构化~程语言QC++是面向对象编E语a?br>C++侧重于对象而不是过E,侧重于类的设计而不是逻辑的设计?br><br>--------------------------------------------------------------------------<br>17.在不用第三方参数的情况下Q交换两个参数的?br>#include <stdio.h><br><br>void main()<br>{<br>        int i=60;<br>        int j=50;<br>        i=i+j;<br>        j=i-j;<br>        i=i-j;<br>        printf("i=%d\n",i);<br>        printf("j=%d\n",j);<br>}<br><br>Ҏ二:<br>i^=j;<br>j^=i;<br>i^=j;<br><br>Ҏ三:<br>// 用加减实玎ͼ而且不会溢出<br>a = a+b-(b=a)<br><br>--------------------------------------------------------------------------<br>18.有关位域的面试题Qؓ什么输出的是一个奇怪的字符Q?br><br>a.t = 'b';效果相当?nbsp;a.t= 'b' & 0xf;<br><br>'b' --> 01100010<br>'b' & 0xf -->>00000010<br>所以输出Ascii码ؓ2的特D字W?br><br><br>char t:4;是4bit的字W变量,同样<br>unsigned short i:8;是8bit的无W号短整形变?br><br>--------------------------------------------------------------------------<br>19.int i=10, j=10, k=3; k*=i+j; k最后的值是?<br><br>60<br><br>--------------------------------------------------------------------------<br>20.q程间通信的方式有?<br><br>q程间通信的方式有 ׃n内存Q?nbsp;道 QSocket Q消息队?nbsp;, DDE{?br><br>--------------------------------------------------------------------------<br>21.<br>struct A <br>{ <br>char t:4; <br>char k:4; <br>unsigned short i:8; <br>unsigned long m; <br>} <br>sizeof(A)=?Q不考虑边界寚wQ?br><br>7<br><br>struct CELL             // Declare CELL bit field<br>{<br>   unsigned character  : 8;  // 00000000 ????????<br>   unsigned foreground : 3;  // 00000??? 00000000<br>   unsigned intensity  : 1;  // 0000?000 00000000<br>   unsigned background : 3;  // 0???0000 00000000<br>   unsigned blink      : 1;  // ?0000000 00000000<br>} screen[25][80];       // Array of bit fields<br>二、位l构 <br>    位结构是一U特D的l构, 在需按位讉K一个字节或字的多个位时, 位结?nbsp;<br>比按位运符更加方便?nbsp;<br>    位结构定义的一般Ş式ؓ: <br>     struct位结构名{ <br>          数据cd 变量? 整型常数; <br>          数据cd 变量? 整型常数; <br>     } 位结构变? <br>    其中: 数据cd必须是int(unsigned或signed)?nbsp;整型常数必须是非负的?nbsp;<br>? 范围?~15, 表示二进制位的个? 卌C有多少位?nbsp;<br>    变量名是选择? 可以不命? q样规定是ؓ了排列需要?nbsp;<br>    例如: 下面定义了一个位l构?nbsp;<br>     struct{ <br>          unsigned incon: 8;  /*incon占用低字节的0~7??/ <br>          unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4?/ <br>          unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3?/ <br>          unsigned blink: 1;  /*blink占用高字节的W??/ <br>     }ch; <br>    位结构成员的讉K与结构成员的讉K相同?nbsp;<br>    例如: 讉K上例位结构中的bgcolor成员可写? <br>      ch.bgcolor <br>  <br>    注意: <br>    1. 位结构中的成员可以定义ؓunsigned, 也可定义为signed,  但当成员?nbsp;<br>度ؓ1? 会被认ؓ是unsignedcd。因为单个位不可能具有符受?nbsp;<br>    2. 位结构中的成员不能用数l和指针, 但位l构变量可以是数l和指针, <br>如果是指? 其成员访问方式同l构指针?nbsp;<br>    3. 位结构总长?位数), 是各个位成员定义的位C?  可以过两个?nbsp;<br>节?nbsp;<br>    4. 位结构成员可以与其它l构成员一起用?nbsp;<br>    例如: <br>     struct info{ <br>          char name[8]; <br>          int age; <br>          struct addr address; <br>          float pay; <br>          unsigned state: 1; <br>          unsigned pay: 1; <br>          }workers;<br>    上例的结构定义了关于一个工人的信息。其中有两个位结构成? 每个位结 <br>构成员只有一? 因此只占一个字节但保存了两个信? 该字节中W一位表C工 <br>人的状? W二位表C工资是否已发放。由此可见用位l构可以节省存贮I间?br><br><br>--------------------------------------------------------------------------<br>22.下面的函数实现在一个固定的C加上一个数Q有什么错误,Ҏ <br>int add_n(int n) <br>{ <br>  static int i=100; <br>  i+=n; <br>  return i; <br>} <br><br>{?<br>因ؓstatic使得i的g保留上次的倹{?br>Lstatic可?br><br>--------------------------------------------------------------------------<br>23.下面的代码有什么问?<br>class A <br>{ <br>public: <br>  A() { p=this; } <br>  ~A() { if(p!=NULL) { delete p; p=NULL; } } <br><br>  A* p; <br>};<br><br>{?<br>会引h限递归<br><br>--------------------------------------------------------------------------<br>24.<br>union a {<br> int a_int1;<br> double a_double;<br> int a_int2;<br>};<br><br>typedef struct<br>{<br> a a1;<br> char y;<br>} b;<br><br>class c<br>{<br> double c_double;<br> b b1;<br> a a2;<br><br>};<br><br>输出cout<<sizeof(c)<<endl;的结?<br><br>{?<br>VC6环境下得出的l果?2<br><br>?<br>?sun)在VC6.0+win2k下做q试?<br>short - 2<br>int-4<br>float-4<br>double-8<br>指针-4<br><br>sizeof(union)Q以l构里面size最大的为union的size<br><br>解析C语言中的sizeof<br><br>一、sizeof的概c <br>  sizeof是C语言的一U单目操作符Q如C语言的其他操作符++?-{。它q不是函数。sizeof操作W以字节形式l出了其操作数的存储大小。操作数可以是一个表辑ּ或括在括号内的类型名。操作数的存储大由操作数的cd军_。  <br><br>二、sizeof的用方法  <br>  1、用于数据类型  <br><br>  sizeof使用形式QsizeofQtypeQ  <br><br>  数据cd必须用括h住。如sizeofQintQ。  <br><br>  2、用于变量  <br><br>  sizeof使用形式QsizeofQvar_nameQ或sizeof var_name  <br><br>  变量名可以不用括h住。如sizeof (var_name)Qsizeof var_name{都是正Ş式。带括号的用法更普遍Q大多数E序员采用这UŞ式。  <br><br>  注意Qsizeof操作W不能用于函数类型,不完全类型或位字Dc不完全cd指具有未知存储大的数据cdQ如未知存储大小的数l类型、未知内容的l构或联合类型、voidcd{。  <br><br>  如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知Qsizeof(void)都不是正Ş式。  <br><br>三、sizeof的结果  <br>  sizeof操作W的l果cd是size_tQ它在头文g<br><br>中typedef为unsigned intcd。该cd保证能容U_现所建立的最大对象的字节大小。  <br><br>  1、若操作数具有类型char、unsigned char或signed charQ其l果{于1。  <br><br>  ANSI C正式规定字符cd?字节。  <br><br>  2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long ?nbsp;float、double、long doublecd的sizeof 在ANSI C中没有具体规定,大小依赖于实玎ͼ一般可能分别ؓ2????nbsp;4????0。  <br><br>  3、当操作数是指针Ӟsizeof依赖于编译器。例如Microsoft C/C++7.0中,nearcL针字节数?Qfar、hugecL针字节数?。一般Unix的指针字节数?。  <br><br>  4、当操作数具有数l类型时Q其l果是数l的d节数。  <br><br>  5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这U类型对象的d节数Q包括Q何垫补在内。  <br><br>  让我们看如下l构Q  <br><br>  struct {char b; double x;} a;  <br><br>  在某些机器上sizeofQaQ?12Q而一般sizeofQcharQ? sizeofQdoubleQ?9。  <br><br>  q是因ؓ~译器在考虑寚w问题Ӟ在结构中插入IZ以控制各成员对象的地址寚w。如doublecd的结构成员x要放在被4整除的地址。  <br><br>  6、如果操作数是函C的数lŞ参或函数cd的Ş参,sizeofl出其指针的大小。  <br><br>四、sizeof与其他操作符的关pR <br>  sizeof的优先?U,??{?U运符优先U高。它可以与其他操作符一L成表辑ּ。如i*sizeofQintQ;其中i为intcd变量。  <br><br>五、sizeof的主要用途  <br>  1、sizeof操作W的一个主要用途是与存储分配和I/Opȝ那样的例E进行通信。例如:  <br><br>  void *mallocQsize_t sizeQ?  <br><br>  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。  <br><br>  2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:  <br><br>  void * memsetQvoid * s,int c,sizeof(s)Q。  <br><br>六、徏议  <br>  ׃操作数的字节数在实现时可能出现变化,在涉及到操作数字节大时用sizeof来代替常量计?br><br><br>=============================================================<br>本文主要包括二个部分Q第一部分重点介绍在VC中,怎么样采用sizeof来求l构的大,以及Ҏ出现的问题,q给决问题的ҎQ第二部分ȝ出VC中sizeof的主要用法?nbsp;<br><br>1?nbsp;sizeof应用在结构上的情?nbsp;<br><br>L下面的结构: <br><br>struct MyStruct <br><br>{ <br><br>double dda1; <br><br>char dda; <br><br>int type <br><br>}; <br><br>对结构MyStruct采用sizeof会出C么结果呢Qsizeof(MyStruct)为多呢Q也怽会这hQ?nbsp;<br><br>sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13 <br><br>但是当在VC中测试上面结构的大小Ӟ你会发现sizeof(MyStruct)?6。你知道Z么在VC中会得出q样一个结果吗Q?nbsp;<br><br>其实Q这是VC对变量存储的一个特D处理。ؓ了提高CPU的存储速度QVC对一些变量的起始地址做了"寚w"处理。在默认情况下,VC规定各成员变量存攄起始地址相对于结构的起始地址的偏U量必须变量的类型所占用的字节数的倍数。下面列出常用类型的寚w方式(vc6.0,32位系l??nbsp;<br><br>cd <br>寚w方式Q变量存攄起始地址相对于结构的起始地址的偏U量Q?nbsp;<br><br>Char <br>偏移量必Mؓsizeof(char)?的倍数 <br><br>int <br>偏移量必Mؓsizeof(int)?的倍数 <br><br>float <br>偏移量必Mؓsizeof(float)?的倍数 <br><br>double <br>偏移量必Mؓsizeof(double)?的倍数 <br><br>Short <br>偏移量必Mؓsizeof(short)?的倍数 <br><br><br>各成员变量在存放的时候根据在l构中出现的序依次甌I间Q同时按照上面的寚w方式调整位置Q空~的字节VC会自动填充。同时VCZ保l构的大ؓl构的字节边界数Q即该结构中占用最大空间的cd所占用的字节数Q的倍数Q所以在为最后一个成员变量申L间后Q还会根据需要自动填充空~的字节?nbsp;<br><br>下面用前面的例子来说明VC到底怎么h存放l构的?nbsp;<br><br>struct MyStruct <br><br>{ <br><br>double dda1; <br><br>char dda; <br><br>int type <br><br>}Q?nbsp;<br><br>Z面的l构分配I间的时候,VCҎ成员变量出现的顺序和寚w方式Q先为第一个成员dda1分配I间Q其起始地址跟结构的起始地址相同Q刚好偏U量0刚好为sizeof(double)的倍数Q,该成员变量占用sizeof(double)=8个字节;接下来ؓW二个成员dda分配I间Q这时下一个可以分配的地址对于l构的v始地址的偏U量?Q是sizeof(char)的倍数Q所以把dda存放在偏U量?的地Ҏ_齐方式,该成员变量占?nbsp;sizeof(char)=1个字节;接下来ؓW三个成员type分配I间Q这时下一个可以分配的地址对于l构的v始地址的偏U量?Q不是sizeof (int)=4的倍数Qؓ了满_齐方式对偏移量的U束问题QVC自动填充3个字节(q三个字节没有放什么东西)Q这时下一个可以分配的地址对于l构的v始地址的偏U量?2Q刚好是sizeof(int)=4的倍数Q所以把type存放在偏U量?2的地方,该成员变量占用sizeof(int)=4个字节;q时整个l构的成员变量已l都分配了空_ȝ占用的空间大ؓQ?+1+3+4=16Q刚好ؓl构的字节边界数Q即l构中占用最大空间的cd所占用的字节数sizeof(double)=8Q的倍数Q所以没有空~的字节需要填充。所以整个结构的大小为:sizeof(MyStruct)=8+1+ 3+4=16Q其中有3个字节是VC自动填充的,没有放Q何有意义的东ѝ?nbsp;<br><br>下面再D个例子,交换一下上面的MyStruct的成员变量的位置Q它变成下面的情况Q?nbsp;<br><br>struct MyStruct <br><br>{ <br><br>char dda; <br><br>double dda1;   <br><br>int type <br><br>}Q?nbsp;<br><br>q个l构占用的空间ؓ多大呢?在VC6.0环境下,可以得到sizeof(MyStruc)?4。结合上面提到的分配I间的一些原则,分析下VC怎么样ؓ上面的结构分配空间的。(单说明) <br><br>struct MyStruct <br><br>{ <br><br>  char dda;//偏移量ؓ0Q满_齐方式,dda占用1个字节; <br><br>double dda1;//下一个可用的地址的偏U量?Q不是sizeof(double)=8 <br><br>             //的倍数Q需要补?个字节才能偏移量变?Q满_?nbsp;<br><br>             //方式Q,因此VC自动填充7个字节,dda1存放在偏U量? <br><br>             //的地址上,它占?个字节?nbsp;<br><br>int typeQ?/下一个可用的地址的偏U量?6Q是sizeof(int)=4的?nbsp;<br><br>           //敎ͼ满int的对齐方式,所以不需要VC自动填充Qtype?nbsp;<br><br>           //攑֜偏移量ؓ16的地址上,它占?个字节?nbsp;<br><br>}Q?/所有成员变量都分配了空_I间ȝ大小?+7+8+4=20Q不是结?nbsp;<br><br>   //的节边界敎ͼ即结构中占用最大空间的cd所占用的字节数sizeof <br><br>   //(double)=8Q的倍数Q所以需要填?个字节,以满结构的大小?nbsp;<br><br>   //sizeof(double)=8的倍数?nbsp;<br><br><br>所以该l构ȝ大小为:sizeof(MyStruc)?+7+8+4+4=24。其中ȝ?+4=11个字节是VC自动填充的,没有放Q何有意义的东ѝ?nbsp;<br><br><br>VC对结构的存储的特D处理确实提高CPU存储变量的速度Q但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以讑֮变量的对齐方式?nbsp;<br><br>VC 中提供了#pragma pack(n)来设定变量以n字节寚w方式。n字节寚w是说变量存攄起始地址的偏U量有两U情况:W一、如果n大于{于该变量所占用的字节数Q那么偏U量必须满默认的对齐方式,W二、如果n于该变量的cd所占用的字节数Q那么偏U量为n的倍数Q不用满默认的寚w方式。结构的d也有个U束条gQ分下面两种情况Q如果n大于所有成员变量类型所占用的字节数Q那么结构的d必Mؓ占用I间最大的变量占用的空间数的倍数Q?nbsp; <br><br>否则必须为n的倍数。下面D例说明其用法?nbsp;<br><br>#pragma pack(push) //保存寚w状?nbsp;<br><br>#pragma pack(4)//讑֮?字节寚w <br><br>struct test <br><br>{ <br><br>  char m1; <br><br>  double m4; <br><br>  int  m3; <br><br>}; <br><br>#pragma pack(pop)//恢复寚w状?nbsp;<br><br>以上l构的大ؓ16Q下面分析其存储情况Q首先ؓm1分配I间Q其偏移量ؓ0Q满x们自p定的寚w方式Q?字节寚wQ,m1占用1个字节。接着开始ؓ m4分配I间Q这时其偏移量ؓ1Q需要补?个字节,q样使偏U量满为n=4的倍数Q因为sizeof(double)大于nQ?m4占用8个字节。接着为m3分配I间Q这时其偏移量ؓ12Q满ؓ4的倍数Qm3占用4个字节。这时已lؓ所有成员变量分配了I间Q共分配?6个字节,满为n的倍数。如果把上面?pragma pack(4)改ؓ#pragma pack(16)Q那么我们可以得到结构的大小?4。(误者自己分析) <br><br>2?nbsp;sizeof用法ȝ <br><br>在VC中,sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个ȝ?nbsp;<br><br>AQ?nbsp; 参数为数据类型或者ؓ一般变量。例如sizeof(int),sizeof(long){等。这U情况要注意的是不同pȝpȝ或者不同编译器得到的结果可能是不同的。例如intcd?6位系l中?个字节,?2位系l中?个字节?nbsp;<br><br>BQ?nbsp; 参数为数l或指针。下面D例说? <br><br>int a[50];  //sizeof(a)=4*50=200; 求数l所占的I间大小 <br><br>int *a=new int[50];// sizeof(a)=4; aZ个指针,sizeof(a)是求指针 <br><br>                   //的大??2位系l中Q当然是?个字节?nbsp;<br><br>CQ?nbsp; 参数为结构或cRSizeof应用在类和结构的处理情况是相同的。但有两炚w要注意,W一、结构或者类中的静态成员不对结构或者类的大生媄响,因ؓ静态变量的存储位置与结构或者类的实例地址无关?nbsp;<br><br>W二、没有成员变量的l构或类的大ؓ1Q因为必M证结构或cȝ每一 <br><br>个实例在内存中都有唯一的地址?nbsp;<br><br>下面举例说明Q?nbsp;<br><br>Class Test{int a;static double c};//sizeof(Test)=4. <br><br>Test *s;//sizeof(s)=4,sZ个指针?nbsp;<br><br>Class test1{ };//sizeof(test1)=1; <br><br>DQ?nbsp; 参数为其他。下面D例说明?nbsp;<br><br>   int func(char s[5]); <br><br>   { <br><br>     cout<<sizeof(s);//q里输?Q本来sZ个数l,但由于做为函 <br><br>                     //数的参数在传递的时候系l处理ؓ一个指针,所 <br><br>                     //以sizeof(s)实际上ؓ求指针的大小?nbsp;<br><br>     return 1; <br><br>} <br><br>sizeof(func("1234"))=4//因ؓfunc的返回类型ؓintQ所以相当于 <br><br>                     //求sizeof(int). <br><br><br>以上为sizeof的基本用法,在实际的使用中要注意分析VC的分配变量的分配{略Q这L话可以避免一些错误?nbsp;<br><br><br>--------------------------------------------------------------------------<br>25.i最后等于多?<br>int i = 1;<br>int j = i++;<br>if((i>j++) && (i++ == j)) i+=j;<br><br>{?<br>i = 5<br><br>--------------------------------------------------------------------------<br>26.<br>unsigned short array[]={1,2,3,4,5,6,7};<br>int i = 3;<br>*(array + i) = ?<br><br>{?<br>4<br><br>--------------------------------------------------------------------------<br>27.<br>class A<br>{<br>  virtual void func1()Q?br>  void func2();<br>}<br>Class B: class A<br>{<br>  void func1(){cout << "fun1 in class B" << endl;}<br>  virtual void func2(){cout << "fun2 in class B" << endl;}<br>} <br>A, A中的func1和B中的func2都是虚函?<br>B, A中的func1和B中的func2都不是虚函数.<br>C, A中的func2是虚函数.QB中的func1不是虚函?<br>D, A中的func2不是虚函敎ͼB中的func1是虚函数.<br><br>{?<br>A<br><br>--------------------------------------------------------------------------<br>28.<br>数据库:抽出部门Q^均工资,要求按部门的字符串顺序排序,不能含有"human resource"部门Q?br><br>employeel构如下Qemployee_id, employee_name, depart_id,depart_name,wage<br><br>{?<br>select depart_name, avg(wage)<br>from employee<br>where depart_name <> 'human resource'<br>group by depart_name<br>order by depart_name<br><br>--------------------------------------------------------------------------<br>29.<br>l定如下SQL数据库:Test(num INT(4)) L一条SQL语句q回num的最|但不怋用统计功能,如MINQMAX{?br><br>{?<br>select top 1 num<br>from Test<br>order by num desc<br><br>--------------------------------------------------------------------------<br>30.<br>输出下面E序l果?nbsp;<br><br>#include <iostream.h> <br><br>class A <br>{ <br>public:<br> virtual void print(void) <br> { <br>    cout<<"A::print()"<<endl; <br> } <br>};<br>class B:public A <br>{ <br>public:<br> virtual void print(void) <br> { <br>   cout<<"B::print()"<<endl;<br> }; <br>}; <br>class C:public B<br>{<br>public:<br> virtual void print(void)<br> {<br>  cout<<"C::print()"<<endl;<br> }<br>};<br>void print(A a) <br>{ <br>   a.print(); <br>} <br>void main(void) <br>{ <br>   A a, *pa,*pb,*pc; <br>   B b; <br>   C c; <br>   <br>   pa=&a; <br>   pb=&b; <br>   pc=&c; <br>   <br>   a.print(); <br>   b.print(); <br>   c.print(); <br>   <br>   pa->print(); <br>   pb->print(); <br>   pc->print(); <br>   <br>   print(a); <br>   print(b); <br>   print(c); <br>}<br><br>A:<br>A::print()<br>B::print()<br>C::print()<br>A::print()<br>B::print()<br>C::print()<br>A::print()<br>A::print()<br>A::print()<br><br>--------------------------------------------------------------------------<br>31.<br>试编写函数判断计机的字节存储顺序是开?little endian)q是降序(bigendian)<br><br>{?<br>bool IsBigendian()<br>{<br> unsigned short usData = 0x1122;<br> unsigned char  *pucData = (unsigned char*)&usData;<br><br> return (*pucData == 0x22);<br>}<br><br>--------------------------------------------------------------------------<br>32.qCritical Section和Mutex的不同点<br><br>{?<br>对几U同步对象的ȝ<br>1.Critical Section<br>A.速度?br>B.不能用于不同q程<br>C.不能q行资源l计(每次只可以有一个线E对׃n资源q行存取)<br><br>2.Mutex<br>A.速度?br>B.可用于不同进E?br>C.不能q行资源l计<br><br>3.Semaphore<br>A.速度?br>B.可用于不同进E?br>C.可进行资源统?可以让一个或过一个线E对׃n资源q行存取)<br><br>4.Event<br>A.速度?br>B.可用于不同进E?br>C.可进行资源统?br><br><br>--------------------------------------------------------------------------<br>33.一个数据库中有两个?<br>一张表为CustomerQ含字段ID,Name;<br>一张表为OrderQ含字段ID,CustomerIDQ连向Customer中ID的外键),RevenueQ?br>写出求每个Customer的Revenued的SQL语句?br><br><br>create table customer<br>(<br>ID int primary key,Name char(10)<br>)<br><br>go<br><br>create table [order]<br>(<br>ID int primary key,CustomerID  int foreign key references customer(id) , Revenue float<br>)<br><br>go<br><br>--查询<br>select Customer.ID, sum( isnull([Order].Revenue,0) )<br>from customer full join [order] <br>on( [order].customerid=customer.id )<br>group by customer.id<br><br>--------------------------------------------------------------------------<br>34.hZ列程序中的错误ƈ且修?br>void GetMemory(char *p){<br>  p=(char *)malloc(100);<br>}<br>void Test(void){<br>  char *str=NULL;<br>  GetMemory=(str);<br>  strcpy(str,"hello world");<br>  printf(str);<br>}<br><br>A:错误--参数的值改变后Q不会传?br>GetMemoryq不能传递动态内存,Test函数中的 str一直都?nbsp;NULL?br>strcpy(str, "hello world");ɽE序崩溃?br><br>修改如下:<br>char *GetMemory(){<br>  char *p=(char *)malloc(100);<br>  return p;<br>}<br>void Test(void){<br>  char *str=NULL;<br>  str=GetMemory(){<br>  strcpy(str,"hello world");<br>  printf(str);<br>}<br><br>Ҏ?void GetMemory2(char **p)变ؓ二指针.<br>void GetMemory2(char **p, int num)<br>{<br> *p = (char *)malloc(sizeof(char) * num);<br>}<br><br>--------------------------------------------------------------------------<br>35.E序攚w<br>class mml<br>{<br>  private:<br>    static unsigned int x;<br>  public:<br>    mml(){ x++; }<br>    mml(static unsigned int &) {x++;}<br>    ~mml{x--;}<br>  pulic:<br>    virtual mon() {} = 0;<br>    static unsigned int mmc(){return x;}<br>    ......                      <br> <br>};<br>class nnl:public mml<br>{<br>  private:<br>    static unsigned int y;<br>  public:<br>    nnl(){ x++; }<br>    nnl(static unsigned int &) {x++;}<br>    ~nnl{x--;}<br>  public:<br>    virtual mon() {};<br>     static unsigned int nnc(){return y;}<br>    ......                   <br>};<br><br>代码片断:<br>mml* pp = new nnl;<br>..........<br>delete pp;<br><br><br>A:<br>基类的析构函数应该ؓ虚函?br>virtual ~mml{x--;}<br><br>--------------------------------------------------------------------------<br>36.101个硬?00真?假,真假区别在于重量。请用无砝码天^UCơ给出真币重q是假币重的l论?br><br>{?<br>101个先取出2?<br>33,33<br>W一ơ称,如果不相{?说明有一堆重或轻<br>那么把重的那堆拿下来,再放另外35个中?3<br>如果相等,说明假的?如果不相{?新放上去的还是重的话,说明假的?不可能新放上ȝ?<br><br>W一ơ称,如果相等的话Q这66个肯定都是真?从这66个中取出35个来,与剩下的没称q的35个比<br>下面׃用说?br><br>Ҏ?<br>W?题也可以拿A(50),B(50)比一下,一L话拿剩下的一个和真的比一下?br>如果不一P拿其中的一堆。比如A(50)再分成两?5比一下,一L话就?br>B(50)中,不一样就在A(50)中,l合W一ơ的l果q道了?br><br>--------------------------------------------------------------------------<br>37.static变量和static 函数各有什么特点?<br><br>{?<br>static变量Q在E序q行期内一直有效,如果定义在函数外Q则在编译单元内可见Q如果在函数内,在在定义的block内可见;<br>static函数Q在~译单元内可见;<br><br>--------------------------------------------------------------------------<br>38.用C 写一个输入的整数,倒着输出整数的函?要求用递归Ҏ ;<br><br>{?<br>void fun( int a )<br>{<br> printf( "%d", a%10 );<br> a /= 10;<br> if( a <=0 )return;<br><br> fun( a );<br>}<br><br>--------------------------------------------------------------------------<br>39.写出E序l果:<br>void Func(char str[100])<br>{<br>  printf("%d\n", sizeof(str));<br>}<br><br>{?<br>4<br>分析:<br>指针长度<br><br>--------------------------------------------------------------------------<br>40.int id[sizeof(unsigned long)];<br>    q个对吗Qؓ什??<br><br>{?<br>?br>q个 sizeof是编译时q算W,~译时就定?br>可以看成和机器有关的帔R?br><br><br>本文主要包括二个部分Q第一部分重点介绍在VC中,怎么样采用sizeof来求l构的大,以及Ҏ出现的问题,q给决问题的ҎQ第二部分ȝ出VC中sizeof的主要用法?nbsp;<br><br>1?nbsp;sizeof应用在结构上的情?nbsp;<br><br>L下面的结构: <br><br>struct MyStruct <br><br>{ <br><br>double dda1; <br><br>char dda; <br><br>int type <br><br>}; <br><br>对结构MyStruct采用sizeof会出C么结果呢Qsizeof(MyStruct)为多呢Q也怽会这hQ?nbsp;<br><br>sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13 <br><br>但是当在VC中测试上面结构的大小Ӟ你会发现sizeof(MyStruct)?6。你知道Z么在VC中会得出q样一个结果吗Q?nbsp;<br><br>其实Q这是VC对变量存储的一个特D处理。ؓ了提高CPU的存储速度QVC对一些变量的起始地址做了"寚w"处理。在默认情况下,VC规定各成员变量存攄起始地址相对于结构的起始地址的偏U量必须变量的类型所占用的字节数的倍数。下面列出常用类型的寚w方式(vc6.0,32位系l??nbsp;<br><br>cd <br>寚w方式Q变量存攄起始地址相对于结构的起始地址的偏U量Q?nbsp;<br><br>Char <br>偏移量必Mؓsizeof(char)?的倍数 <br><br>int <br>偏移量必Mؓsizeof(int)?的倍数 <br><br>float <br>偏移量必Mؓsizeof(float)?的倍数 <br><br>double <br>偏移量必Mؓsizeof(double)?的倍数 <br><br>Short <br>偏移量必Mؓsizeof(short)?的倍数 <br><br><br>各成员变量在存放的时候根据在l构中出现的序依次甌I间Q同时按照上面的寚w方式调整位置Q空~的字节VC会自动填充。同时VCZ保l构的大ؓl构的字节边界数Q即该结构中占用最大空间的cd所占用的字节数Q的?/textarea></p><img src ="http://www.shnenglu.com/yearner/aggbug/12208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yearner/" target="_blank">(Leyn)主</a> 2006-09-10 09:11 <a href="http://www.shnenglu.com/yearner/archive/2006/09/10/12208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.fengbiaochem.com.cn" target="_blank">Ʒһþþþþþվ</a>| <a href="http://www.kinbay.cn" target="_blank">þþƷ7777</a>| <a href="http://www.sky1314.cn" target="_blank">re99þ6Ʒ</a>| <a href="http://www.vmtkcxf.cn" target="_blank">þҹɫƷAV</a>| <a href="http://www.wdcqc.cn" target="_blank">һþ㽶߿ۿ</a>| <a href="http://www.facz.cn" target="_blank">鶹þ</a>| <a href="http://www.wvzw.cn" target="_blank">99þþƷһ</a>| <a href="http://www.sjsgsl.net.cn" target="_blank">þۺ͵͵ɫ</a>| <a href="http://www.fttyz.com.cn" target="_blank">ձþþþƷĻ</a>| <a href="http://www.9258bbs.cn" target="_blank">þþþòҰ¸߳</a>| <a href="http://www.bgbgb.cn" target="_blank">ŷ龫Ʒþþþ</a>| <a href="http://www.3743.com.cn" target="_blank">þþþþþþþþ</a>| <a href="http://www.designelite.com.cn" target="_blank">91޹˾þþƷ</a>| <a href="http://www.xkart.cn" target="_blank">þ޾ƷĻ</a>| <a href="http://www.u6768.cn" target="_blank">ճˮþ޾Ʒtv</a>| <a href="http://www.eobt.cn" target="_blank">Ʒþþþþһ</a>| <a href="http://www.f-lover.cn" target="_blank">þ޹ӰԺ</a>| <a href="http://www.jfjn.net.cn" target="_blank">پþþƷþ</a>| <a href="http://www.sunmuying.cn" target="_blank">Ʒһþ㽶߿ </a>| <a href="http://www.east110.com.cn" target="_blank">˾þ뾫ƷĻ</a>| <a href="http://www.yundizhijia.cn" target="_blank">þˬˬƬAV</a>| <a href="http://www.vygd.cn" target="_blank">ҹƷþ</a>| <a href="http://www.uzijav.cn" target="_blank">Ʒþþ99</a>| <a href="http://www.cfgcurn.cn" target="_blank">26uuuþ</a>| <a href="http://www.0379f.cn" target="_blank">þùƷ-þþƷ</a>| <a href="http://www.znkt.net.cn" target="_blank">þ޾ƷĻ</a>| <a href="http://www.uzijav.cn" target="_blank">Ļþۺ</a>| <a href="http://www.bolezi333.cn" target="_blank">þþþһëþþ</a>| <a href="http://www.shssdq.cn" target="_blank">91ƷۺϾþ㽶 </a>| <a href="http://www.dghaishi.com.cn" target="_blank">þþþþAvӰԺ</a>| <a href="http://www.gzzmlhlaw.cn" target="_blank">þô̫㽶av</a>| <a href="http://www.feichangyemen.cn" target="_blank">þùҹAVӰԺ</a>| <a href="http://www.mxklj.cn" target="_blank">պƷھþ</a>| <a href="http://www.su26.cn" target="_blank">2021þùԲľƷ</a>| <a href="http://www.88177.com.cn" target="_blank">þݺҹҹ96׽ </a>| <a href="http://www.oahk.cn" target="_blank">99þù뾫Ʒ</a>| <a href="http://www.yyyyya.cn" target="_blank">պƷþþþþþõӰ</a>| <a href="http://www.292284.cn" target="_blank">ƷþþþþþþþӰԺ</a>| <a href="http://www.atzkw.cn" target="_blank">ҹƷþþþþ</a>| <a href="http://www.vetg.cn" target="_blank">þþþAVۿ</a>| <a href="http://www.ktze6z.cn" target="_blank">þ޾Ʒվ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>