代码改变世界

work_7

2013-11-17 21:21  heiheitian  阅读(150)  评论(0编辑  收藏  举报

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

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

局部变量分为动态局部变量和静态局部变量,其共同点为作用域均为定义它的函数体或语句块,其不同点为其生命周期不同,动态局部变量的生命周期较短,例如在函数中定义,其生命周期会随着函数的结束而结束,例如:

void heiheitian()
{
    int i=0;
    cout<<i++<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
    heiheitian(); //输出0
    heiheitian(); //输出0
    return 0;
}
dynamic

而静态局部变量的生命周期较长,为整个一个程序,例如:

void heiheitian()
{
    static int i=0;
    cout<<i++<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
    heiheitian(); //输出0
    heiheitian(); //输出1
    return 0;
}
static

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

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

栈是由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区,存储的变量通常是局部变量、函数参数等。

堆是由new分配的内存块,它们的释放编译器不去管,需要由我们手动去控制,一般一个new需要有一个delete相对应。如果没有delete,会造成内存泄露。

int _tmain(int argc, _TCHAR* argv[])
{
    int *p=new int[5]; 
    /*在栈内存中存放了一个指向一块堆内存的指针p
    程序会先确定在堆中分配内存的大小(int[5]),然后调用
    operator new分配内存,然后返回这块内存的首地址放入栈中*/
    delete []p; //及时释放堆中的内存
    return 0;
}
stack and heap

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和shared_ptr为智能指针,unique_ptr持有对对象的独有权,即两个unique_ptr不能指向一个对象,不能进行复制操作,只能进行移动操作,当unique_ptr失效时,其指向的对象也被释放;shared_ptr持有对对象的共享权,指向此对象的指针每多一个,系统内部的计数器就加1,指针每失效一个,系统内部的计数器就减1,当计数器减到0时,此对象被释放。

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. 代码风格

代码如下:

#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
using namespace std;
#define maxlength 100

void Split(string s,char splitchar1,char splitchar2,char splitchar3,vector<string>& vec)
{
    if(vec.size()>0)
        vec.clear();
    int length=s.length();
    int start=0;
    for(int i=0;i<length;i++)
    {
        if((s[i]==splitchar1||s[i]==splitchar2||s[i]==splitchar3)&&i==0)
            start+=1;
        else if(s[i]==splitchar1||s[i]==splitchar2||s[i]==splitchar3)
        {
            vec.push_back(s.substr(start,i-start));
            start=i+1;
        }
        else if(i==length-1)
            vec.push_back(s.substr(start,i+1-start));
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"请输入url:"<<endl;
    string s;
    getline(cin,s);
    vector<string> vec;
    Split(s,'/','.',':',vec);
    for(int i=0;i<vec.size()-1;i++)
    {
        if(vec[i]!="")
            cout<<vec[i]<<",";
    }
    cout<<vec[vec.size()-1]<<endl;
    return 0;
}
url_split

截图如下: