开发工具:
文件大小: 581kb
下载次数: 0
上传时间: 2019-09-04
详细说明:都是在网上搜集的常见笔试面试题,整理不易,希望能帮到求职的小伙伴在成功编译之后,就进入了链接阶段。
用法: 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最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.