您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 常见C++笔试面试题.pdf
  所属分类: C++
  开发工具:
  文件大小: 581kb
  下载次数: 0
  上传时间: 2019-09-04
  提 供 者: a5300*****
 详细说明:都是在网上搜集的常见笔试面试题,整理不易,希望能帮到求职的小伙伴在成功编译之后,就进入了链接阶段。 用法: gcc hello.o- o hello 作用∶将编译输岀文件 hello.o链接成最终可执行文件helo。 运行该可执行文件,出现正确的结果如下 >>>.hello Hello world! C++11包含大量的新特性:包含 lambda表达式,类型推导 keyword:auto decltype,和模板的大量改进。 decltype实际上有点像auto的反函数auto能够让你声明一个变量。而 decltype 则能够从一个变量或表达式中得到类型 nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,由 于NULL实际上代表的是0, 简化的for循环,能够用于遍历数组、容器、 string以及由 begin和end函数定 义的序列(即有 terator), for (auto p:m) lambda表达式能够用于创建并定义匿名的函数对象,以简化编程工作。 Lambda 的语法例如以下:[函数对象參数](操作符重载函数參数)->返回值类型{函数体} vectorsint> iv15,4, 3, 2, 1] int a =2 for each(iv begin, ivendo, lb(int &x)[cout<<(x+ b)intireturn x *(a+ b);});//(3) ∏内的參数指的是 Lambda表达式能够取得的全局变量。(1)函数中的b就是指函 数能够得到在 Lambda表达式外的全局变量,假设在口中传入=的话,即是能够取 得全部的外部变量,如(2)和(3) Lambda表达式 (内的參数是每次调用函数时传入的參数 >后加上的是 Lambda表达式返回值的类型。如(3)中返回了一个int类型的 变量 变长參数的模板,C++11中引入了变长參数模板,所以发明了新的数据类型 tuple, tuple是一个N元组。能够传入1个,2个甚至多个不同类型的数据 auto t1 make tuple(1, 2.0,C++ 11")i auto t2= make tuple(1,2.0,"C++11",{1,0,2}); 避免了从前的pair中嵌套pair的丑陋做法。使得代码更加整洁 更加优雅的初始化方法,在引入C++11之前。仅仅有数组能使用初始化列表 其它容器想要使用初始化列表,仅仅能用下面方法 int arr[3]={1,2,3} vectorsint> v(arr, arr +3); 在C++11中,我们能够使用下面语法来进行替换 int arr[3]{1,2,3}; vector ill, 2, 3; map1,a,123b; string str["Hello World"); 什么是智能指针?智能指针的原理 将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型 的需求),并在析构函数里编写 delete语句删除指针指向的内存空间。 智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传 入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动 被释放, 智能指针就是一种栈上创建的对象,函数退出时会调用其析构函数,这个析构函 数里面往往就是一堆计数之类的条件判断,如果达到某个条件,就把真正指针指 向的空间给释放了。 注意事项: 不能将指针直接赋值给一个智能指针,一个是类,一个是指针。 常用的智能指针 智能指针在C++11版本之后提供,包含在头文件< memory>中, shared_ptr unique_ptr、weak_ptr 1)std∷auto_ptr,有很多问题。不支持复制(拷贝构造函数)和赋值( operator ),但复制或赋值的时候不会提示出错。所以可能会造成程序崩溃,比如 auto ptr p1(new string auto")//#1 auto ptr p2; //#2 2 p1; //#3 在语句#3中,p2接管 string对象的所有权后p1的所有权将被剥夺。前面说过, 这是好事,可防止p1和p2的析构函数试图刪同一个对象 但如果程序随后试图使用p1,这将是件坏事,因为p1不再指向有效的数据。如 果再访问p1指向的内容则会导致程序崩溃。 auto_ptr是C++98提供的解决方案,C+11已将将其摒弃,摒弃 auto_ptr的原 因,一句话总结就是:避免潜在的内存崩溃问题。 2)C++11引入的 unique_ptr,也不支持复制和赋值,但比auto_ptr好,直接 赋值会编译出错。实在想赋值的话,需要使用:std:mσve。例如: std: unique ptr p1(new int(5)) //#4 std:: unique_ptrp2=p1;//编译会出错 //#5 std:: unique_ptrp3=std::move(p1);//转移所有权,现在那块内 存归p3所有,p1成为无效的指针.//#6 编译器认为语句#5非法,因此, unique_ptr比auto_ptr更安全。 但 unique_ptr还有更聪明的地方。有时候,会将一个智能指针赋给另一个并不 会留下危险的悬挂指针。当程序试图将一个 unique_ptr赋值给另一个时,如果 源 unique_ptr是个临时右值;编译器允许这么做;如果源 unique_ptr将存在 段时间,编译器将禁止这么做 unique ptrsstring> pul(new string hello world ) unique ptr pu2 pu2= pu1 //#1 not allowed unique ptr pu3 pu3 unique ptr(new string You"));//#2 allowed 其中#1留下悬挂的 unique_ptr(pu1),这可能导致危害。而#2不会留下悬挂的 unique_ptr;因为它调用 unique_ptr的构造函数,该构造函数创建的临时对象 在其所有权让给pu3后就会被销毁。这种随情况而已的行为表明, unique_ptr 优于允许两种赋值的auto_ptr。 3)C++11或 boost的 shared_ptr,基于引用计数的智能指针。可随意赋值,直 到内存的引用计数为0的时候这个内存会被释放。 4)C++11或 boost的 weak_ptr,弱引用。引用计数有一个问题就是互相引用 形成环,这样两个指针指向的内存都无法释放。需要手动打破循环引用或使用 weak_ptr。顾名思义,weak_ptr是一个弱引用,只引用,不计数。如果一块内 存被 shared_ptr和weak_ptr同时引用,当所有 shared_ptr析构了之后,不管 还有没有 weak_ptr引用该内存,内存也会被释放。所以 weak_ptr不保证它指向 的内存一定是有效的,在使用之前需要检查Weak_pt是否为空指针 智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员 自己管理。程序员自己管理堆内存可以提髙了程序的效率,但是整体来说堆内存 的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆內存。使用普通 指针,容易造成堆内存泄露〔忘记释放),二次释放,野指针,程序发生异常时 内存泄露等问题等,使用智能指针能更好的管理堆内存。 1、C和C++的区别 1)C是面向过程的语言,是一个结构化的语言,考虑如何通过一个过程对输入进 行处理得到输出;C++是面向对象的语言,主要特征是“封装、继承和多态”。 封装隐藏了实现细节,使得代码模块化;派玍类可以继承父类的数据和方法,扩 展了已经存在的模块,实现了代码重用;多态则是"一个接口,多种实现”,通 过派生类重写父类的虚函数,实现了接口的重用 2)C和C++动态管理内存的方法不一样,C是使用 malloc/free,而C++除此 之外还有new/ delete关键字。 3)C++支持函数重载,C不支持函数重载 4)C++中有引用,C中不存在引用的概念 2、C++中指针和引用的区别 )指针是一个新的变量,存储了另一个变量的地址,我们可以通过访问这个地址 来修改另一个变量; 引用只是一个别名,还是变量本身,对引用的任何操作就是对变量本身进行操作, 以达到修改变量的目的 2)引用只有一级,而指针可以有多级 3)指针传参的时候,还是值传递,指针本身的值不可以修改,需要通过解引用才 能对指向的对象进行操作 引用传参的时候,传进来的就是变量本身,因此变量可以被修改 3、结构体 struct和共同体 union(联合)的区别 结构体:将不同类型的数据组合成一个整体,是自定义类型 共同体:不同类型的几个变量共同占用一段内存 1)结构体中的每个成员都有自己独立的地址,它们是同时存在的; 共同体中的所有成员占用同一段内存,它们不能同时存在; 2) sizeof( struct是内存对齐后所有成员长度的总和, sizeof( union)是内存对齐 后最长数据成员的长度 结构体为什么要内存对齐呢? 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据, 某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常 2硬件原因:经过内存对齐之后,CPU的内存访问速度大大提升。 4、# define和 const的区别 1)# define定义的常量没有类型,所给出的是一个立即数; const定义的常量有 类型名字,存放在静态区域 2)处理阶段不同,# define定义的宏变量在预处理时进行替换,可能有多个拷贝, const所定义的变量在编译时确定其值,只有一个拷贝。 3)# define定义的常量是不可以用指针去指向, const定义的常量可以用指针去 指向该常量的地址 4)# define可以定义简单的函数, const不可以定义函数 5、重载 overload,覆盖(重写) override,隐藏(重定义) overwrite,这三 者之间的区别 1) overload,将语义相近的几个函数用同一个名字表示,但是参数列表(参数 的类型,个数,顺序不同)不同,这就是函数重载,返回值类型可以不同 特征:相同范围(同一个类中)、函数名字相同、参数不同、 virtua关键字可有 可无 2) override,派生类覆盖基类的虚函数,实现接口的重用,返回值类型必须相同
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 输入关键字,在本站1000多万海量源码库中尽情搜索: