【现代程序设计】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]="\0";
    strncpy(url,u.c_str(),u.length());
    int i=0;
    while(url[i]==' '||url[i]=='\t'||url[i]=='\n')i++;//消除开头空白符
    for(;url[i]!='\0';i++)
        {
            if(url[i]==':')
            {
                    if(url[i+1]!='\0'&&url[i+1]=='/')
                    if(url[i+1]!='\0'&&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

转载于:https://www.cnblogs.com/Lmeng/p/3428377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值