![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
C++相关知识
乌克兰水晶小乳猪
一个计算机专业的学生
展开
-
C++11的原子操作
原子操作1.什么是操作系统的原子操作?原子操作是不可分割的,在执行完毕不会被任何其他任务或者时间中断,分为两种情况:在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只能发生于指令之间。在多线程中,不能被其他进程(线程)打断的操作叫做原子操作。2.面试的时候经常问的一道题目是: i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?...原创 2019-10-19 18:00:55 · 329 阅读 · 0 评论 -
nullptr(C++11)和NULL的区别
在使用空时,习惯这么赋值int *p = NULL;编译器进行解释程序时,NULL会被直接解释成0,所以这里的参数根本就不是大家所想的NULL,参数已经被编译器偷偷换成了0,0是整数。因此这面的问题就尴尬了让我们看下面的程序吧:#include<iostream>#include<string>using namespace std;void func(in...原创 2019-09-27 20:56:00 · 332 阅读 · 0 评论 -
C和C++的区别和联系(常考)
C/C++的联系:C++是C的超集,兼容大部分C的语法的结构;联系嘛,我只能想到这个,毕竟cplusplus嘛!C/C++的区别:第一点就应该想到C是面向过程的语言,而C++是面向对象的语言,一般简历上第一条都是熟悉C/C++基本语法,了解C++面向对象的思想;C和C++动态管理内存的方法不一样,C是使用malloc/free函数,而C++除此之外还使用new/delete关键字(下...原创 2019-09-27 20:07:13 · 456 阅读 · 0 评论 -
C++11的override和final
C++11的override和final另外补充一下的是C++11提供override 和 final 来修饰虚函数。实际中我们建议多使用纯虚函数+ override的方式来强制重写虚函数,因为虚函数的意义就是实现多态,如果没有重写,虚函数就没有意义// 1.final 修饰基类的虚函数不能被派生类重写 class Car { public: virtual void Drive...原创 2019-09-26 20:36:41 · 296 阅读 · 0 评论 -
“static成员” 以及 “C++11的成员初始化新玩法”
static成员1.概念声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员函数;用static修饰的成员函数,称之为静态成员函数。静态成员函数一定要在类外进行初始化。面试题:实现一个类,计算程序中创建出多少个类对象class A{public: A() { ++_count; } A(const A& t) { ++...原创 2019-09-20 12:32:07 · 338 阅读 · 0 评论 -
“static成员”以及“c++11的成员初始化新玩法”’
static1.概念声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;;用static修饰的 成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。看代码的注释面试题:实现一个类,计算中程序中出创建出多少个类对象。class A{public: A() { ++_scount; } A(const A&amp; t...原创 2019-01-17 20:08:01 · 1557 阅读 · 0 评论 -
shared_ptr的循环引用(用weak_ptr解决)(重点)
#include<iostream>#include<stdlib.h>#include<thread>#include<mutex>//C++11//shared_ptr:功能全,支持拷贝,引用计数。设计复杂,循环引用namespace juju{ template<class T> class shared_ptr...原创 2019-09-27 19:09:37 · 284 阅读 · 0 评论 -
shared_ptr的局限性(重点)
存在线程安全问题什么是线程安全问题?线程安全就是多个线程同时去改一个东西,可能最后的结果不是正确的结果。看下图:那我们如何去解决呢???我们想让它++的时候是原子的,即原子的加锁#include<iostream>#include<stdlib.h>#include<thread>#include<mutex>//C++11//...原创 2019-09-27 18:30:33 · 367 阅读 · 0 评论 -
shared_ptr
好多细节要注意!!!#include<iostream>#include<stdlib.h>//C++11//shared_ptr:功能全,支持拷贝,引用计数。设计复杂,循环引用namespace juju{ template<class T> class shared_ptr { public: shared_ptr(T* ptr) ...原创 2019-09-27 15:11:40 · 213 阅读 · 0 评论 -
unique_ptr
如果面试官让你写一个智能指针,那你就写unique_ptr#include<iostream>#include<stdlib.h>//C++11//unique_ptr:简单粗暴,防拷贝。效率高,鼓励公司使用namespace juju{ template<class T> class unique_ptr { public: uniqu...原创 2019-09-27 15:10:34 · 229 阅读 · 0 评论 -
auto_ptr
要看注释!!!//C++98//1.管理权转移。带有缺陷的早期设计,公司严禁使用他//2.如果面试官让你写一个智能指针,不要写auto_ptr,因为他本来就是带有缺陷的,写unique_ptrnamespace juju{ template<class T> class auto_ptr { public: auto_ptr(T* ptr) :_ptr(pt...原创 2019-09-27 15:09:06 · 217 阅读 · 0 评论 -
智能指针的使用以及原理(面试官让你写一个RAII)
加粗样式## 1.RAIIRAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句 柄、网络连接、互斥量等等)的简单技术在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:不需要显式...原创 2019-09-27 14:03:46 · 450 阅读 · 0 评论 -
为什么需要智能指针?
为什么需要智能指针?下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort函数中的问题#include<vector>#include<iostream>void _MergeSort(int* a, int left, int right, int* tmp){ if (left >= left) return;...原创 2019-09-26 22:20:55 · 266 阅读 · 0 评论 -
C/C++内存分布(new / delete)
C/C++内存分布我们先来看看下面一段代码:int globalvar = 1;static int staticGlobalVar = 1;void Test(){ static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; char* p...原创 2019-09-19 11:01:06 · 306 阅读 · 0 评论 -
C/C++内存管理
1.C/C++内存分布先看下边的代码体验一下:int globalVar = 1;static int staticGlobalVar = 1;void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; char* ...原创 2019-01-18 17:01:54 · 251 阅读 · 0 评论 -
C++ explicit关键字详解
explicitexplicit关键字的作用就是防止类构造函数的隐式自动转换.explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了.那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:class CxString // 没有使用explicit关键字的类声明, 即默认为...转载 2019-09-19 20:43:21 · 400 阅读 · 0 评论 -
友元
友元友元分为: 友元函数和友元类友元提供了一种突破封装的方式,有时候提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。友元函数问题: 现在我们尝试去重载operator<<,然后发现我们没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是 实际...原创 2019-09-21 13:31:53 · 202 阅读 · 0 评论 -
vector空间增长问题
vector空间增长问题容量空间接口说明size()获取数据的个数capacity()获取容量大小empty()判断是否为空void resize(size_type n, value_type val = value_type())改变vector的size;void reserve(size_type n);改变vector放入capac...原创 2019-09-22 15:32:27 · 372 阅读 · 1 评论 -
vector迭代器失效问题(考点)
vector迭代器失效问题(insert、erase)我们用代码的形式呈现给大家:#include<iostream>#include<vector>using namespace std;int main(){ int a[] = { 1, 2, 3, 4 }; vector<int> v(a, a + sizeof(a) / sizeof(i...原创 2019-09-21 20:49:54 · 475 阅读 · 0 评论 -
list与vector的对比
list与vector的对比vector与list都是STL中非常重要的序列式容器,由于两个容器的底层结构不同,导致其特性以及应用场景不 同,其主要不同如下:原创 2019-09-22 17:25:09 · 256 阅读 · 0 评论 -
stack(后进先出)
stackstack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类...原创 2019-09-23 17:39:39 · 892 阅读 · 0 评论 -
用队列实现栈
class Mystack {public: queue<int> q; //压栈是一样的 void push(int x) { q.push(x); } //移除栈顶元素 int pop() { int size = q.size() - 1; for (int i = 0; i < size; i++) { int tmp = q....原创 2019-09-24 16:20:22 · 206 阅读 · 0 评论 -
逆波兰表达式求值(栈)
逆波兰表达式求值根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: [“2”, “1”, “+”, “3”, “*”]输出: 9解释: ((2 + 1) * 3) = 9...原创 2019-09-23 19:58:39 · 372 阅读 · 0 评论 -
栈的弹出压入序列
栈的压入、弹出序列题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)举例:入栈1,2,3,4,5出栈4,5,3,2,1...原创 2019-09-23 19:32:35 · 379 阅读 · 0 评论 -
1.this指针存在哪里?2.this指针可以为空吗?
1.this指针存在哪里?其实编译器在生成程序时加入了获取对象首地址的相关代码。并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同)。也就是成员函数的其它参数正常都是存放在栈中。而this指针参数则是存放在寄存器中。类的静态成员函数因为没有this指针这个参数,所以类的静态成员函数也就无法调用类的非静态成员变量。2.this指针可以为空吗?可以为空,当...原创 2019-09-19 15:19:40 · 430 阅读 · 1 评论 -
函数模板的实例化
函数模板的实例化用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例 化。1.隐式实例化:让编译器根据实参推演模板参数的实际类型template<class T>T Add(const T& left, const T& right){ return left + right;}int main(){ in...原创 2019-09-21 18:22:33 · 2147 阅读 · 3 评论 -
c++[模板进阶]
非类型模板参数1.非类型模板参数模板参数分类类型形参与非类型形参。类模板的特化类模板特化的应用之类型萃取模板的分离编译原创 2019-04-05 15:12:01 · 376 阅读 · 0 评论 -
继承相关笔试面试题
相关笔试面试题什么是菱形继承?菱形继承的问题是什么?什么是菱形虚拟继承?如何解决数据冗余和二义性?继承和组合的区别是什么?什么时候用组合?什么时候用继承?多继承中指针偏移的问题?1.两个子类继承同一个父类,而又有子类又分别继承这两个子类数据冗余和二义性2.虚拟继承可以解决菱形继承的二义性和数据冗余的问题。借助虚基表和虚基表指针实现,其中虚基表中存在当前对象相对于基类部分的偏...原创 2019-09-26 19:49:08 · 295 阅读 · 0 评论 -
复杂的菱形继承及菱形虚拟继承
复杂的菱形继承及菱形虚拟继承单继承:一个子类的只有直接父类时称这个继承关系为单继承多继承:一个子类有两个或两个以上直接父类称这种继承关系为多继承菱形继承:菱形继承是多继承的一种特殊情况菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题class Person{public: string _name;};class Student :pu...原创 2019-09-26 13:44:02 · 237 阅读 · 0 评论 -
继承的概念及其意义
继承的概念及其定义1.继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用我们举个栗子看一下:#include<iostream>#...原创 2019-09-25 15:45:44 · 5135 阅读 · 0 评论 -
复杂的菱形继承及菱形虚拟继承
一个子类只有一个直接父类时称这个继承关系为单继承原创 2019-03-22 21:49:45 · 239 阅读 · 0 评论 -
C++中的继承
继承的概念及其定义1.继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。#include<iostream>#include&l...原创 2019-03-22 21:11:07 · 227 阅读 · 0 评论 -
c++入门的命名空间和关键字
c++入门1.c++关键字2.命名空间2.1 命名空间的定义 //1. 普通的命名空间 namespace N1 // N1为命名空间的名称 { // 命名空间中的内容,既可以定义变量,也可以定义函数 int a; int Add(int left, int right) { return left + ri...原创 2019-01-14 16:57:36 · 559 阅读 · 0 评论 -
赋值运算符重载
赋值运算符重载1.运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。注意:不能通过连接其他符号来创建新的操作符:比如operator@重载操作符必须有一个类类型或者枚举类型的操作数用于内置类型的操作符...原创 2019-09-19 20:30:08 · 607 阅读 · 0 评论 -
“赋值运算符重载”
1.赋值运算符重载(1)运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字:关键字operator后面接需要重载的运算符符号函数原型:返回值类型operator操作符(参数列表)注意:a.不能通过连接其他符号来创建新的操作符:比如operator@b.重载...原创 2019-01-16 21:27:48 · 407 阅读 · 0 评论 -
拷贝构造函数
拷贝构造函数那在创建对象时,可否创建一个与一个对象一某一样的新对象呢?构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象 创建新对象时由编译器自动调用1.特征拷贝构造函数也是特殊的成员函数,其特征如下:拷贝构造函数是构造函数的一个重载形式拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用class Da...原创 2019-09-19 19:10:54 · 274 阅读 · 0 评论 -
构造函数、析构函数
构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员 都有 一个合适的初始值,并且在对象的生命周期内只调用一次。1.特性构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主 要任务并不是开空间创建对象,而是初始化对象。其特征如下:函数名与类名相同无返回值对象实例化时编译器自动调用对应的构造...原创 2019-09-19 15:43:48 · 352 阅读 · 0 评论 -
再谈构造函数
vfdbfbdf原创 2019-01-17 17:11:47 · 216 阅读 · 0 评论 -
“析构函数”与“拷贝构造函数”
析构函数1.概念:析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而 对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。2.特性:析构函数是特殊的成员函数。(1)析构函数名是在类名前加上字符~(2)无参无返回值(3)一个类有且只有一个析构函数。若未显示定义,系统会自动生成默认的析构函数。typedef int DataType; ...原创 2019-01-16 20:27:45 · 326 阅读 · 0 评论 -
C/C++动态内存管理的相关面试题合集
面试题1. malloc/free和new/delete的区别共同点:都是从堆上申请空间。并且需要用户手动释放不同点:malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以malloc申请空间时,需要手动计算空间的大小并传递,new只需要在其后边跟上空间的类型即可malloc的返回值是void*,在使用时必须强转,new不需...原创 2019-09-19 14:26:23 · 557 阅读 · 0 评论