Visual C++ 常见面试题


Visual C++常见面试题 王牌7 1 Visual C++常见面试题 一、常见试题 1. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别? 从定义上来说: 重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同, 或许参数类型不同,或许两者都不同)。 重写:是指子类重新定义父类虚函数的方法。 从实现原理上来说: 重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数 就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和 function func(p:string):integer;。那么编译器做过修饰后的函数名 称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了, 是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关! 重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的 不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确 定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的 (晚绑定)。 2. main 函数执行以前,还会执行什么代码? 全局对象的构造函数会在 main 函数之前执行。 3. 简述数组与指针的区别? 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指 向任意类型的内存块。 修改内容上的差别: char a[] = “hello”; a[0] = ‘X’; char *p = “world”; // 注意 p 指向常量字符串 p[0] = ‘X’; // 编译器不能发现该错误,运行时错误 2 Visual C++从入门到精通 用运算符 sizeof 可以计算出数组的容量(字节数)。sizeof(p)p 为指针得到的是一个指 针变量的字节数,而不是 p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存 容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动 退化为同类型的指针。 char a[] = "hello world"; char *p = a; coutnext); } return head ; } 4. 引用和指针的区别? 引用和指针有如下三种区别: 1. 引用必须在声明时初始化,而指针不用; 2. 对于 NULL 不能引用,而指针可以指向 NULL; 3. 引用一旦声明,对象不能改变;而指针可以随时改变指向 的对象。 引用能做到的,指针也可以,但指针更危险; 5. 虚函数的本质和实现机制 虚函数的本质是通过基类访问派生类定义的函数。虚函数只能借助于指针或者引用来 达到多态效果。 6. 请问 C++的类和 C 里面的 struct 有什么区别? c++中的类具有成员保护功能,并且具有继承,多态这类 oo 特点,而 c 里的 struct 没 有 7. struct 和 class 的区别? struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class 在其他方面是 功能相当的。 大垛数的开发者感到类和结构有很大的差别。感觉上结构仅仅象一堆缺乏 封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢 固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你的类有 很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!)时,你也许应该 使用 struct 关键字,否则,你应该使用 class 关键字。 Visual C++常见面试题 王牌7 3 8. static 有什么用途?(请至少说明两种) 限制变量的作用域、设置变量的存储域。 9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据区,局部变量在堆栈中。 10. 队列和栈有什么区别? 队列先进先出,栈后进先出 11. 类成员函数的重载、覆盖和隐藏区别? a. 成员函数被重载的特征: (1) 相同的范围(在同一个类中); (2) 函数名字相同; (3) 参数不同; (4) virtual 关键字可有可无。 b. 覆盖是指派生类函数覆盖基类函数,特征是: (1) 不同的范围(分别位于派生类与基类); (2) 函数名字相同; (3) 参数相同; (4) 基类函数必须有 virtual 关键字。 c. “隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下: (1) 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)。 (2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 12. 如何打印出当前源文件的文件名以及源文件的当前行号? cout << __FILE__ ; cout<<__LINE__ ; __FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编 译器定义的 4 Visual C++从入门到精通 13. 有哪几种情况只能用 intialization list 而不能用 assignment? 当类中含有 const、reference 成员变量;基类的构造函数都需要初始化表。 14. 如何判断一段程序是由 C 编译程序还是由 C++编译程序编译的? #ifdef __cplusplus cout<<"c++"; #else cout<<"c"; #endif 15. 请说出 const 与#define 相比,有何优点? const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检 查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不 到的错误。有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调 试。 16. 结构与联合有和区别? 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放 了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成 员的存放地址不同)。 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于 结构的不同成员赋值是互不影响的。 17. 面向对象的三个基本特征,并简单叙述之? 封装:将客观事物抽象成类,每个类对自身的数据和方法实行 protection(private, protected,public) 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外 编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属 性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以 及纯虚函数)构成了功能复用的两种方式。 多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对 象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话: 允许将子类类型的指针赋值给父类类型的指针。 Visual C++常见面试题 王牌7 5 18. *p++自增 p 还是 p 所指向的变量? 后缀++和--操作符本质上比前缀一元操作符的优先级高,因此*p++和*(p++)等价,它 自增 p 并返回 p 自增之前所指向的值。要自增 p 指向的值,则使用(*p)++,如果副作用的 顺序无关紧要也可以使用++*p。 19. New delete 与 malloc free 的联系与区别? 都是在堆(heap)上进行动态的内存操作。用 malloc 函数需要指定内存分配的字节数并 且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的 destructor, 而 free 不会调用对象的 destructor. 20. 请讲一讲析构函数和虚函数的用法和作用? 析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没 有重载。知识在类对象生命期结束的时候,由系统自动调用释放在构造函数中分配的资 源。这种在运行时,能依据其类型确认调用那个函数的能力称为多态性,或称迟后联编。 另:析构函数一般在对象撤消前做收尾工作,比如回收内存等工作,虚拟函数的功能是 使子类可以用同名的函数对父类函数进行重载,并且在调用时自动调用子类重载函数, 如果是纯虚函数,则纯粹是为了在子类重载时有个统一的命名而已。 21. 在 C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”? C++语言支持函数重载,C 语言不支持函数重载。函数被 C++编译后在库中的名字与 C 语言的不同。假设某个函数的原型为: void foo(int x, int y); 该函数被 C 编译器编译后在库中的名字为_foo,而 C++编译器则会产生像_foo_int_int 之类的名字。C++提供了 C 连接交换指定符号 extern“C”来解决名字匹配问题。 22. 描述内存分配方式以及它们的区别? 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个 运行期间都存在。例如全局变量,static 变量。 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执 行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。 从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多少 的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员 决定,使用非常灵活,但问题也最多。 6 Visual C++从入门到精通 23. delete 与 delete []区别: delete 只会调用一次析构函数,而 delete[]会调用每一个成员的析构函数。 当 delete 操作符用于数组时,它为每个数组元素调用析构函数,然后调用 operator delete 来释放内存。 delete 与 New 配套,delete []与 new []配套。 MemTest *mTest1 = new MemTest[10]; MemTest *mTest2 = new MemTest; int *pInt1 = new int[10]; int *pInt2 = new int; delete []pInt1; //-1- delete []pInt2; //-2- delete []mTest1; //-3- delete []mTest2; //-4- 在-4-处报错。 这就说明:对于内建简单数据类型,delete 和 delete[]功能是相同的。对于自定义的复 杂数据类型,delete 和 delete[]不能互用。delete[]删除一个数组,delete 删除一个指针,简 单来说,用 new 分配的内存用 delete 删除,用 new[]分配的内存用 delete[]删除,delete [] 会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用 delete 时没用括号,delete 就会认为指向的是单个对象,否则,它就会认为指向的是一个 数组 24. 子类析构时要调用父类的析构函数吗? 析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用 的时候,派生类的信息已经全部销毁了 定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰 好相反:先调用派生类的析构函数、然后调用基类的析构函数 25. 什么是预编译 ?何时需要预编译? 情况 1:总是使用不经常改动的大型代码体。 情况 2:程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选 项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 26. 求下面函数的返回值(微软) int func(x) Visual C++常见面试题 王牌7 7 { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; } 将 x 转化为 2 进制,看含有的 1 的个数。假定 x = 9999。 27. 什么是“引用”?申明和使用“引用”要注意哪些问题? 引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全 相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变 量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。 声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名, 它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。 不能建立数组的引用。 28. 下面的函数实现在一个固定的数上加上一个数,有什么错误,改正 int add_n(int n) { static int i=100; i+=n; return i; } 因为 static 使得 i 的值会保留上次的值。会导致调用一次 i 值累加。 29. 什么是 COLORREF? 我该怎样用它? COLORREF 是一个 32-bit 整型数值,它代表了一种颜色。你可以使用 RGB 函数来初 始化 COLORREF。例如: COLORREFcolor=RGB(0,255,0); RGB 函数接收三个 0-255 数值,一个代表红色,一个代表绿色,一个代表蓝色。在上 面的例子中,红色和蓝色值都为 0,所以在该颜色中没有红色和蓝色。绿色为最大值 255。 所以该颜色为绿色。0,0,0 为黑色,255,255,255 为白色。 8 Visual C++从入门到精通 另一种初始化 COLORREF 的方法如下所示: CColorDialogcolorDialog; COLORREFcolor; if(colorDialog.DoModal()==IDOK) { color=colorDialog.GetColor(); } 这段代码使用了 MFC 中的颜色对话框,它需要文件。 30. 如何设定视图窗口大大小。 设定视图窗口的大小不能在 OnCreate 、 OnCreateClient 等函数中简单的用 CREATESTRUCT 的对象来设定,而应该在 CMainFrame::PreCreateWindow 调 用::AdjustWindowRectEx 函数来设定。然后把宽度传递给 CREATESTRUCT 的引用变量。 如下代码: CRectrect(0,0,800,515); ::AdjustWindowRectEx(&rect,cs.style,TRUE,cs.dwExStyle); cs.cx=rect.Width(); cs.cy=rect.Height(); 31. 在程序的某些部分,可以调用 MessageBox 函数来建立一个信息对话框,例如在视类中。 但是,在其它部分却不能,如文档类中。为什么?怎样才能在应用程序类中建立一个信息对 话框? MessageBox 函数来自 CWnd 类,所以只能在从 CWnd 继承的类(如 CView)中调用它。 但是,MFC 也提供了 AfxMessageBox 函数,你可以在任何地方调用它。 32. 如何禁止和使能控件 控件也是窗口,所以可以调用 CWnd::EnableWindow 使能和禁止控件。 //Disablebuttoncontrols. m_wndOK.EnableWindow(FALSE) m_wndApply.EnableWindow(FALSE) 33. 如何动态创建控件 分配一个控件对象的实例并调用其 Create 成员函数。开发者最容易忽略两件事:忘记 指定 WS_VISBLE 标签和在栈中分配控件对象。下例动态地创建一个下压按钮控件: Visual C++常见面试题 王牌7 9 //Inclassdeclaration(.Hfile). private:CButton*m_pButton //Inclassimplementation(.cppfile). m_pButton=newCButton ASSERT_VALID(m_pButton) m_pButton — >Create(_T("ButtonTitle"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON.Crect(0,0,100,24),this,IDC_MYBUTTON) 34. 如何向编辑控件中添加文本 由于没有 CEdit::AppendText 函数,用户只好自己做此项工作。调用 CEdit::SetSel 移动 到编辑控件末尾,然后调用 CEdit::ReplaceSel 添加文本。下例是 AppendText 的一种实现 方法: voidCMyEdit::AppendText(LPCSTRpText) { intnLen=GetWindowTextLength() SetFocus() SetSel(nLen,nLen) ReplaceSel(pText) } 35. 如何获取位图大小? 获取位图大小,最简单的方法就是使用 Picture 空间,当 Picture 空间加载图像时, 会自动调整空间的大小,其大小就是图像的大小。 例如: m_image.SetBitmap(m_hbitmap)//m_hbitmap 是位图句柄 CRectm_bitrect; m_image.GetWindowRect(m_bitrect); 还可以通过 Cbitmap 累的 GetObject 方法获取位图大小。 例如: CBitmapbitmap; BITMAPINFObInfo; bitmap.Attach(m_hbitmap); bitmap.GetObject(sizeof(bInfo),&bInfo); intx=bInfo.bmiHeader.biWidth; inty=bInfo.bmiHeader.biHeight; 10 Visual C++从入门到精通 36. 如何通过一个点坐标知道点所处在的窗口? 我们可以通过 ChildWindowFromPoint 函数来实现。 ChildWindowFromPoint,WindowsAPI 函数。 函数原型:HWNDChildWindowFromPoint(HWNDhWnd,LONGxPoint,LONGyPoint); 函数功能:返回父窗口中包含了指定点的第一个子窗口的句柄。 函数参数:hWnd 父窗口的句柄 xPoint 点的 X 坐标,以像素为单位 yPoint 点的 Y 坐标,以像素为单位 返回值:发现包含了指定点的第一个子窗口的句柄。如未发现任何窗口,则返回 hWnd (父窗口的句柄)。如指定点位于父窗口外部,则返回零。 37. 让一个矩形向中心缩小 要让一个矩形向中心缩小指定的像素我们可以调用 GetClientRect 函数,此函数的具体 使用方法请查阅 MSDN。 如下示例: m_demo.GetClientRect(m_rect);//两个变量都是矩形 m_rect.DeflateRect(1,1,1,1); 38. 拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。 深拷贝意味着拷贝了资源和指针,而浅拷贝只是拷贝了指针,没有拷贝资源 这样使得两个指针指向同一份资源,造成对同一份析构两次,程序崩溃。 临时对象的开销比局部对象小些。 39. 你如何理解 MVC。简单举例来说明其应用。 MVC 模式是 observer 模式的一个特例,典型的有 MFC 里面的文档视图架构。 40. 多重继承如何消除向上继承的二义性。 使用虚拟继承即可. 41. 继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。 在 OOD,OOP 中,组合优于继承. 当然多态的基础是继承,没有继承多态无从谈起。 Visual C++常见面试题 王牌7 11 当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。 当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。 42. 已知一个数组 table,用一个宏定义,求出数据的元素个数 #defineNTBL #defineNTBL(sizeof(table)/sizeof(table[0])) 43. C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。 多态的基础是继承,需要虚函数的支持,简单的多态是很简单的。 子类继承父类大部分的资源,不能继承的有构造函数,析构函数,拷贝构造函数, operator=函数,友元函数等等。 二、程序题 1. 从键盘中输入一个字符串,将小写字母全部转化成大写字母,然后输出到一个磁盘文件 test 中保存,输出字符串以!结束。 #include"stdio.h" main() {FILE*fp; charstr[100],filename[10]; inti=0; if((fp=fopen("test","w"))==NULL) {printf("cannotopenthefile\n"); exit(0);} printf("pleaseinputastring:\n"); gets(str); while(str[i]!='!') {if(str[i]>='a'&&str[i]<='z') str[i]=str[i]-32; fputc(str[i],fp); i++;} fclose(fp); } 12 Visual C++从入门到精通 2. 已知 String 类定义如下,尝试写出类的实现。 classString { public: String(constchar*str=NULL);//通用构造函数 String(constString&another);//拷贝构造函数 ~String();//析构函数 String&operater=(constString&rhs);//赋值函数 private: char*m_data;//用于保存字符串 }; 以下是实现代码: String::String(constchar*str) { if(str==NULL);//strlen 在参数为 NULL 时会抛异常才会有这步判断 { m_data=newchar[1]; m_data[0]='\0'; } else { m_data=newchar[strlen(str)+1]; strcpy(m_data,str); } } String::String(constString&another) { m_data=newchar[strlen(another.m_data)+1]; strcpy(m_data,other.m_data); } String&String::operator=(constString&rhs) { if(this==&rhs) return*this; delete[]m_data;//删除原来的数据,新开一块内存 m_data=newchar[strlen(rhs.m_data)+1]; Visual C++常见面试题 王牌7 13 strcpy(m_data,rhs.m_data); return*this; } String::~String() { delete[]m_data; } 3. 给定一个自然数 n,试完成如下程序,它输出不大于 n 的所有素数(质数)。请提供程序 代码,以及思路文档。 求出一个数 j 的平方根 sqrt(j),将 j 除以 2~sqrt(j)之间的数,只要除尽一次,就不是素数, 之后数 j 加 2。 #include #include voidmain() {intN=1000; inti,j,k,m=0; for(j=1;jk)/*/除到 k 一直没除尽,是素数*/ printf("%d",j); } } 4. 输入一个 N 进制数,将其转换成 M 进制数(1 #include #include #include #include usingnamespacestd; intmain() 14 Visual C++从入门到精通 { chardigit[16]={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}; cout<<"输入待转换整数:"; charc; chara[80]; charb[80]; inti=0,j=0,length; while((c=getchar())!='\n')//输入 {a[i]=c; i++; } length=i;//输入的数的位数 0~i-1 for(j=0;j='0'&&a[j]<='9') b[j]=a[j]-'0'; elseif(a[j]>='a'&&a[j]<='f') b[j]=a[j]-'a'+10; elseif(a[j]>='A'&&a[j]<='F') b[j]=a[j]-'A'+10; else returnFALSE; } cout<<"输入的数是多少进制 N:"; intn cin>>n; assert((n>1)&&(n<=16)); intnum=0; for(i=0,j=length-1;j>=0;j--,i++)//输入的数转成十进制 {num+=b[i]*pow(n,j); } cout<<"转换成进制数 M:"; intm; cin>>m; cout<1)&&(m<=16)); stackstk; charremain; Visual C++常见面试题 王牌7 15 while(num!=0)//转成 M 进制 { remain=digit[num%m]; stk.push(remain); num/=m; } cout<<"结果:";//输出结果 while(!stk.empty()) { cout<KillTimer(1); AfxMessageBox("已经到达最后一个图像文件!"); return""; } 6. 国际象棋有 8×8 格,每个格子可放一个棋子。皇后的规则是可以横、竖、斜移动。在一 个棋盘放置 8 个皇后,并使它们互相无法威胁到彼此。 参考代码: #include intcheck(intc[]) /*判断棋盘上八位数列是否符合斜率不为+1、-1、或 0,且每位数字从 1 到 8 各出 现一次,若符合返回 1,否则为 0*/ {intn,m; for(n=0;n<7;n++) for(m=n+1;m<8;m++) if(c[m]<1||c[m]>8||c[n]==c[m]||abs(c[n]-c[m])==abs(n-m)) return(0); return(1); } main() {intqp[8]={8,7,6,5,4,3,2,1},*p;/*qp[8]代表棋盘上八行,八个皇后在棋盘上一定是每 行一个*/ /*八个皇后在棋盘上的横坐标一定各不相同,即 1--->8 各出现一次*/ /*由于数 12345678 可被九整除,于是用穷举法找出所有能被九整除的八位数,*/ /*其中必包含 1--->8 在八位中所有的排列组合*/ /*检测这些数列就能找出八皇后的所有可能*/ for(p=qp;qp[7]<9;qp[0]+=9) {for(p=qp;p<&qp[7];)/*对 12345678 每次加 9,直加到 87654321*/ {if(*p>9) {*(p+1)+=1; *p-=10; p++; } 18 Visual C++从入门到精通 else p+=8; } if(check(qp))/*检测八位数列,返回值为真则在屏幕上输出*/ {for(p=qp;p<=&qp[7];p++)printf("%d",*p); printf(""); }}} 7. 输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。 main() { charc; inta=0,b=0,d=0,e=0,f=0; printf("请输入字符:"); do { c=getchar(); if(c>='A'&&c<='Z') a++; elseif(c>='a'&&c<='z') b++; elseif(c>='0'&&c<='9') d++; elseif(c=='') e++; elseif((c>=33&&c<=47)||(c>=58&&c<=64)||(c>=93&&c<=96)||(c>=123&&c<=137)) f++; putchar©; }while(c!='\n'); printf("字母个数为:%d\n",a+b); printf("数字个数为:%d\n",d); printf("空格个数为:%d\n",e); printf("其它字符个数为:%d\n",f); } Visual C++常见面试题 王牌7 19 8. 文件中有一组整数,要求排序后输出到另一个文件中 #include #include usingnamespacestd; voidOrder(vector&data)//bubblesort { intcount=data.size(); inttag=false;//设置是否需要继续冒泡的标志位 for(inti=0;idata[j+1]) { tag=true; inttemp=data[j]; data[j]=data[j+1]; data[j+1]=temp; } } if(!tag) break; } } voidmain(void) { vectordata; ifstreamin("c:\\data.txt"); if(!in) { cout<<"fileerror!"; exit(1); } inttemp; while(!in.eof()) { 20 Visual C++从入门到精通 in>>temp; data.push_back(temp); } in.close();//关闭输入文件流 Order(data); ofstreamout("c:\\result.txt"); if(!out) { cout<<"fileerror!"; exit(1); } for(i=0;i
还剩19页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

wujiuliu

贡献于2013-06-02

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf