work_7
2013-11-17 21:21 heiheitian 阅读(150) 评论(0) 编辑 收藏 举报1. 理解C++变量的作用域和生命周期
a) 用少于10行代码演示你对局部变量的生命周期的理解
局部变量分为动态局部变量和静态局部变量,其共同点为作用域均为定义它的函数体或语句块,其不同点为其生命周期不同,动态局部变量的生命周期较短,例如在函数中定义,其生命周期会随着函数的结束而结束,例如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void heiheitian() { int i=0; cout<<i++<<endl; } int _tmain(int argc, _TCHAR* argv[]) { heiheitian(); //输出0 heiheitian(); //输出0 return 0; }
而静态局部变量的生命周期较长,为整个一个程序,例如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void heiheitian() { static int i=0; cout<<i++<<endl; } int _tmain(int argc, _TCHAR* argv[]) { heiheitian(); //输出0 heiheitian(); //输出1 return 0; }
2. 理解堆和栈,两种内存的申请和释放的方式
a) 用少于30行代码演示你对堆和栈两种内存申请方式的理解
栈是由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区,存储的变量通常是局部变量、函数参数等。
堆是由new分配的内存块,它们的释放编译器不去管,需要由我们手动去控制,一般一个new需要有一个delete相对应。如果没有delete,会造成内存泄露。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int _tmain(int argc, _TCHAR* argv[]) { int *p=new int[5]; /*在栈内存中存放了一个指向一块堆内存的指针p 程序会先确定在堆中分配内存的大小(int[5]),然后调用 operator new分配内存,然后返回这块内存的首地址放入栈中*/ delete []p; //及时释放堆中的内存 return 0; }
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. 代码风格
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
截图如下: