• 【现代程序设计】homework-08


    1. 理解C++变量的作用域和生命周期

    a) 用少于10行代码演示你对局部变量的生命周期的理解

    #include <iostream>
    int
    main() { int i=0; for(int i=0;i<4;i++); std::cout << i <<std::endl;
      return 0: }

     解释:C++语言中,大多数作用域都是用花括号界定的。一般来说,名字从其声明点开始直到其声明所在的作用域结束处都是可见的。请看上面这个程序,在第4行声明了一个变量i(为方便叙述,记为i1),并初始化为0;在随后的for循环里又声明了一个变量i(为方便叙述,记为i2),并在该循环里增加值。直至i<4即i=3时退出。然后这个变量i(即i2)的作用域也随之结束了。最后输出的值为0,也就是第一个变量i(即i1)的值。因为该变量i(即i1)的作用域是从它上一行的花括号开始直到return 0;后面的花括号结束的。因此cout的i是第一个变量i(即i1)。

    2. 理解堆和栈,两种内存的申请和释放的方式

    a) 用少于30行代码演示你对堆和栈两种内存申请方式的理解

     看到这个题目我只想到了数据结构中的栈,以及它“后进先出”这么一条原则,然后就不知道了。查了下网上的资料,恍然惊醒。原来这里说的是内存分配里的堆和栈。抓紧时间学了学,总结在下面:

    内存中的栈区处于相对较高的地址,以地址的增长方向为上的话,栈地址是向下增长的。栈中分配局部变量空间,堆区则是向上增长的,用于分配程序员申请的内存空间。

    int main()
    {
        int a;//
        char *p1;//
        p1 = (char *)malloc(10);//
    }

    两种内存申请方式在于:栈是系统自动分配空间,而堆则是程序员根据需要自己申请空间。

    3. 理解unique_ptr和shared_ptr

    a) http://msdn.microsoft.com/en-us/library/vstudio/hh279676.aspx

    b) http://msdn.microsoft.com/en-us/library/vstudio/hh279669.aspx

     先从unique_ptr说起,unique_ptr很重要的特点就是不能分享它的指针。从名字中的“unique”,可见一斑,它不能被复制,所以一切需要复制的操作,它都不能进行。 当这个unique_ptr的资源被传给另一个unique_ptr时,原来的unique_ptr将不再拥有。使用unique_ptr,使某个object任何时候都只有一个所有者,将使程序的逻辑得到简化。 

     那么与之相对的便是shared_ptr。当不止一个的所有者必须去管理内存中某个object的生命周期的时候,shared_ptr是一个很好的选择。share_ptr可以被复制,传值,赋值。所有这些指针可以指向同一个object,这些shared_ptr分享一个"control block",当有指向同一object的shared_ptr被增加、删除时,control block响应变化,指针数做相应更改。当指针数为0时,这个 “control block”将删除内存资源和自身。

    4. 请尝试用“C++0x”,“C++11 & STL”两种不同的代码风格分割一个url,并上传代码到博客上

    For example:

    Input: http://msdn.microsoft.com/en-us/library/vstudio/hh279674.aspx

    Output: http, msdn, Microsoft, com, en-us, library, vstudio, hh279674, aspx

    考察重点:

    1. 类的定义和使用,基本成员是否完整

    2. 输入参数的检查及其他鲁棒性的考虑

    3. STL和C++11元素的使用

    4. 除http://之外, 是否有考虑ftp:// site:// 等情况

    5. 是否考虑url中的中文

    6. 算法是否简洁高效

    7. 代码风格

    首先应该明确这两种代码风格究竟是怎么样的,有什么区别。百度百科上说“C++0x(也被称为C++11)”,那么C++0x”,“C++11 & STL”两种代码风格的不同点就是前者不适用STL而后者使用STL。

    首先采用C++0x风格编写:

    void UrlParse::parse(string u)
    {
        char url[200]="";
        strncpy(url,u.c_str(),u.length());
        int i=0;
        while(url[i]==' '||url[i]=='	'||url[i]=='
    ')i++;//消除开头空白符
        for(;url[i]!='';i++)
            {
                if(url[i]==':')
                {
                        if(url[i+1]!=''&&url[i+1]=='/')
                        if(url[i+1]!=''&&url[i+2]=='/')//这三个字符连起来是 ://
                            if(i!=0)//如果不是开头
                                {
                                    cout<<", ";//输出逗号+空格,并将i增2.用于跳过后面的两个斜杠
                                    i+=2;
                                }
                }// end if(url[i]==':')
                else if(url[i]=='.'||url[i]=='/')
                    cout<<", ";//输出逗号+空格
                else
                    cout<<url[i];
        }
    }

    测试结果如图:

    然后C++11 & STL风格。

    void UrlParse::parseWithSTL(string u)
    {
        string url=u;
        int tmp=0;
    
        tmp=url.find("://");
        while(tmp>=0){
        url.replace(tmp,3,", "); 
        tmp=url.find("://");
        } //将"://"替换为", "
    
        tmp=url.find("/");
        while(tmp>=0){
        url.replace(tmp,1,", "); 
        tmp=url.find("/");
        }//将"/"替换为", "
    
        tmp=url.find(".");
        while(tmp>=0)
        {
        url.replace(url.find("."),1,", ");
        tmp=url.find(".");
        }//将"."替换为", "
        cout<<url<<endl;
    }

    测试结果:

    代码已经上传至github:https://github.com/LmengHoo/homework-08/commit/c0966cd1c362201a3a3f4f33484bdc4790eee565

  • 相关阅读:
    C++面向对象高级编程(下)第二周-Geekband
    C++面向对象高级编程(下)第一周-Geekband
    C++面向对象高级编程(下)-Geekband
    堆,栈,内存管理, 拓展补充-Geekband
    C++面向对象高级编程(上)-Geekband
    MFC 多屏显示
    Open CASCADE Technology: IGES Support
    JAVA反射
    HashMap
    Linux 系统编程
  • 原文地址:https://www.cnblogs.com/Lmeng/p/3428377.html
Copyright © 2020-2023  润新知