![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++基础知识专栏(常见面试知识点)
笔者最近在准备跳槽,记录复习知识点,共勉!
倚楼观风雨
每天进步一点点
展开
-
C++类的默认函数
C++类的默认函数在C++中,一个类有八个默认函数:默认构造函数;默认拷贝构造函数;默认析构函数;默认重载赋值运算符函数;默认重载取址运算符函数;默认重载取址运算符const函数;默认移动构造函数(C++11);默认重载移动赋值操作符函数(C++11)。只是声明一个空类,不做任何事情的话,编译器会自动为你生成一个默认构造函数、一个默认拷贝构造函数、一个默认重载赋值操作符函数和一个默认析构函数。这些函数只有在第一次被调用时,才会被编译器创建,当然这几个生转载 2020-05-30 03:18:35 · 772 阅读 · 0 评论 -
STL迭代器是怎么删除元素的呢
这个主要考察的是迭代器失效的问题。对于序列容器vector,deque来说,使用erase(itertor)后,后边的每个元素的迭代器都会失效,但是后边每个元素都会往前移动一个位置,但是erase会返回下一个有效的迭代器;对于关联容器map set来说,使用了erase(iterator)后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素的,不会影响到下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。对于list来说,它使用了不连续分配的内存,并且它的erase方法也原创 2020-05-25 01:00:48 · 668 阅读 · 0 评论 -
vector和list的区别
vector和list的区别从如下几个方面来说:概念:Vector连续存储的容器,动态数组,在堆上分配空间底层实现:数组两倍容量增长:vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间,之前的迭代器会失效。性能:访问:O(1)插入:在最后插入(空间够):很快原创 2020-05-25 00:56:05 · 331 阅读 · 0 评论 -
map和set有什么区别,分别又是怎么实现的?
map和set有什么区别,分别又是怎么实现的?map和set都是C++的关联容器,其底层实现都是红黑树(RB-Tree)。由于 map 和set所开放的各种操作接口,RB-tree 也都提供了,所以几乎所有的 map 和set的操作行为,都只是转调 RB-tree 的操作行为。map和set区别在于:map中的元素是key-value(关键字—值)对:关键字起到索引的作用,值则表示与索引相关联的数据;Set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字。set的迭代器原创 2020-05-25 00:49:03 · 1425 阅读 · 0 评论 -
C++中拷贝赋值函数的形参能否进行值传递?
请你回答一下C++中拷贝赋值函数的形参能否进行值传递?不能。如果是这种情况下,调用拷贝构造函数的时候,首先要将实参传递给形参,这个传递的时候又要调用拷贝构造函数。。如此循环,无法完成拷贝,栈也会满。...原创 2020-05-25 00:24:58 · 2400 阅读 · 2 评论 -
C++ 虚函数和多态
多态的实现主要分为静态多态和动态多态静态多态主要是重载,在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了virtual关键字的函数,在子类中重写时候不需要加virtual也是虚函数。虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.原创 2020-05-25 00:07:28 · 179 阅读 · 0 评论 -
c++中的四个智能指针
C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被11弃用:auto_ptr(c++98的方案,cpp11已经抛弃) 采用所有权模式。 auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”)); auto_ptr<string> p2; p2 = p1; //auto_ptr不会报原创 2020-05-25 00:06:50 · 373 阅读 · 0 评论 -
为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数
为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。...原创 2020-05-25 00:06:23 · 4557 阅读 · 2 评论 -
C++中++i和i++的区别
++i和i++的区别++i先自增1,再返回,i++先返回i,再自增1++i和i++的实现++i 实现:int& int::operator++(){ *this +=1; return *this;}i++ 实现:const int int::operator(int){ int oldValue = *this; ++(*this); return oldValue;}...原创 2020-05-25 00:05:34 · 1608 阅读 · 0 评论 -
C/C++ 中指针和引用的区别
C/C++ 中指针和引用的区别1.指针有自己的一块空间,而引用只是一个别名;2.使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;3.指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象 的引用;4.作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对象;5.可以有const指针,但是没有const引用;6.指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变;7.指针可以有多级指针(**p),而引原创 2020-05-24 23:32:37 · 228 阅读 · 0 评论 -
c++中四种cast转换
C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast为什么不使用C的强制转换?C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。1、const_cast 用于将const变量转为非const2、static_cast 用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知;原创 2020-05-24 23:28:02 · 212 阅读 · 0 评论 -
C++和C的区别
设计思想上:C++是面向对象的语言,而C是面向过程的结构化编程语言语法上:C++具有封装、继承和多态三种特性C++相比C,增加多许多类型安全的功能,比如强制类型转换、C++支持范式编程,比如模板类、函数模板等...原创 2020-05-24 23:24:23 · 2209 阅读 · 0 评论 -
static关键字的作用 C++知识点
static关键字的作用全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量.静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。局部静态变量在局部变量之前加上关键字sta...原创 2020-05-24 19:15:58 · 130 阅读 · 0 评论