
C++
文章平均质量分 76
C++基础
clw_18
都挺好
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++基础知识大全
秋招基本尘埃落定了,打算总结一下C++学习路线的相关知识,今天是第一篇:C++基础知识总结。面向对象的三大特性:1、封装:把客观事物抽象为类,包含自己的属性和方法。2、继承:使用现有类的所有功能,在无需重新编写原有类的情况下对类的功能进行拓展。被继承的类成为父类或基类,继承的类成为子类或派生类。3、多态:一种形式,多种状态,分为静态多态和动态多态。静态多态指编译时多态,如函数重载、模板;动态多态指运行时多态,特指virtual虚函数机制形成的多态。类的访问权限:private、protected原创 2021-10-31 16:48:41 · 13681 阅读 · 6 评论 -
C++后端开发学习路线及推荐学习时间
先说一下实习面试的结果吧,本人申请岗位为C++后端开发,通过面试的公司有CVTE、搜狐、字节跳动,然后腾讯明天三面,准备去字节了(不要问我为啥去字节,钱多福利好)。原创 2021-04-11 20:35:00 · 26163 阅读 · 32 评论 -
vs2013无法启动程序,因为计算机中丢失SpaACISd.dll。尝试重新安装该程序以解决此问题
vs2013运行项目出现以下问题开始时以为就是动态链接库找不到的原因,就在项目属性的链接器中更改附加库目录,但是发现不管怎样就是无法解决。搜索了各种方法,最后的解决办法如下:将相应的动态链接库文件放置到指定的目录下,若为64位系统,则32位的DLL文件放在“C:\Windows\SysWOW64”,64位的DLL文件放在“C:\Windows\System32”。vs2013真是一个令人头疼的软件,经常各种运行bug能让你搞一天!...原创 2021-05-10 17:19:51 · 1534 阅读 · 1 评论 -
C++面试易错知识点总结(持续更新中)
1、虚函数指针、虚函数表存放位置同一个类只有一个虚函数表,类的所有对象共享该类的虚函数表。每个对象内部都有一个指向该类虚函数表的指针vptr,每个vptr的存放地址与该对象的所在位置相同,但指向同一虚函数表vtable。windows系统中,虚函数表存放在可执行文件的常量段中,http://blog.youkuaiyun.com/vicness/article/details/3962767;linux系统中,虚函数表存放在可执行文件的只读数据段中(rodata),https://blog.youkuaiyun.com/w原创 2021-01-18 20:14:40 · 776 阅读 · 1 评论 -
struct结构体内存对齐解析
为什么要内存对齐虽然所有的变量最后都会保存到特定的地址内存中去,但是相应的内存空间必须满足内存对齐的要求,主要基于存在以下两个原因:硬件平台原因: 并不是所有的平台都能够访问任意地址上的任意数据,某些硬件平台只能够访问对齐的地址,否则就会出现硬件异常错误。性能原因: 如果数据存放在未对齐的内存空间中,则处理器在访问变量时要做两次次内存访问,而对齐的内存访问只需要一次。上述两个原因,第一个原因从字面意思上就能够理解,那第二个原因是什么意思呢?假定现在有一个 32 位微处理器,那这个处理器访问内存都是按转载 2020-12-14 12:57:50 · 1491 阅读 · 0 评论 -
sizeof与strlen的区别
strlen的源码为:_Check_return_ size_t __cdecl strlen(_In_z_ const char * _Str);sizeof与strlen的区别1、sizeof计算的是分配的内存空间实际占用的字节数; strlen计算的是内存空间中字符的个数(不包括"\0")。 2、sizeof是运算符,参数可以是指针、数组、类型、对象和函数; strlen是函数,参数必须是字符型指针(char*)。 3、sizeof是在编译时计算,故参数为数组名时计算的是整个数组原创 2020-12-13 23:29:17 · 235 阅读 · 0 评论 -
智能指针原理剖析(一):auto_ptr、unique_ptr
通过常规指针管理动态内存的难点及缺点:(1)忘记释放动态内存: 使用new/malloc分配动态内存时,需要使用delete/free手动释放内存,但程序员容易忘记释放内存,从而产生内存泄露;(2)动态内存释放时机不对: 在尚有指针引用内存的情况下,程序员释放了内存,从而产生空悬指针。典型的案例就是:假设在多线程编程中,线程A、B中分别有指针p1、p2指向对象object,若某个时刻线程A通过p1将object销毁了(释放了object占有的内存),那么线程B中的p2引用object就会产生内存错误。原创 2020-12-13 13:58:16 · 781 阅读 · 0 评论 -
C++中用open读取含文字注释的实验数据
有一个实验数据文件,需要读取前三行数据,实验数据格式如下:C++代码:#include<iostream>#include<fstream>#include<vector>#include<string>using namespace std;vector<vector<double>> vMeasure_;//打开文件数据void openfile(string filename, vSuper& v1原创 2020-12-04 15:03:26 · 301 阅读 · 0 评论 -
浅谈深拷贝与浅拷贝
浅拷贝:利用类提供的默认拷贝构造函数,将一个对象的成员所在内存的数据复制给另一个对象的成员。对于简单的类来说,使用浅拷贝就可以满足正常需求了,但是当类中有指向动态内存的指针时,浅拷贝的使用很容易造成内存错误,就需要显式定义拷贝构造函数。浅拷贝错误案例一起看一个浅拷贝的案例:#include<iostream>using namespace std;#include<memory>class Base{public: Base(int A, int B) {原创 2020-11-28 21:31:58 · 323 阅读 · 0 评论 -
总结:不同继承模式下,派生类及派生类对象对基类成员的访问权限
类中的成员可以分为三种类型,分别为public成员、protected成员、public成员。类中可以直接访问自己类的public、protected、private成员,但类对象只能访问自己类的public成员。public继承派生类可以访问基类的public、protected成员,不可以访问基类的private成员;派生类对象可以访问基类的public成员,不可以访问基类的protected、private成员。protected继承派生类可以访问基类的public、protected成员,原创 2020-11-28 17:05:50 · 5421 阅读 · 0 评论 -
c++是否应避免使用普通指针,而使用智能指针(包括shared,unique,weak)?
转自:详解 C++ 11 中的智能指针先说结论,是的,你应该尽量使用这些智能指针。C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念。这里不置贬褒,手动分配内存与手动释放内存有利也有弊,自动分配内存和自动释放内存亦如此,这是两种不同的设计哲学。有人认为,内存如此重要的东西怎么能放心交给用户去管理呢?而另外一些人则认为,内存如此重要的东西怎么能放心交给系统去管理呢?在 C/C++ 语言中,内存泄露转载 2020-11-27 11:11:37 · 1414 阅读 · 0 评论 -
智能指针原理剖析(二):shared_ptr、weak_ptr
通过常规指针管理动态内存的难点及缺点:(1)忘记释放动态内存: 使用new/malloc分配动态内存时,需要使用delete/free手动释放内存,但程序员容易忘记释放内存,从而产生内存泄露;(2)动态内存释放时机不对: 在尚有指针引用内存的情况下,程序员释放了内存,从而产生空悬指针。典型的案例就是:假设在多线程编程中,线程A、B中分别有指针p1、p2指向对象object,若某个时刻线程A通过p1将object销毁了(释放了object占有的内存),那么线程B中的p2引用object就会产生内存错误。原创 2020-11-24 20:56:31 · 2317 阅读 · 0 评论 -
面试题:什么是右值引用?右值引用与左值引用的区别
上一篇博客剖析了引用的底层实现原理,文中所述的“引用”默认表示为左值引用。一、左值与左值引用什么是左值引用呢?左值引用,就是绑定到左值的引用,通过&来获得左值引用。那么,什么是左值呢?左值,就是在内存有确定存储地址、有变量名,表达式结束依然存在的值。左值可以分为两类:非常量左值和常量左值;同理,右值也可以分为两类:非常量右值和常量左值。左值引用举例说明:int a=10; //非常量左值(有确定存储地址,也有变量名)const int a1=10;原创 2020-11-20 23:12:37 · 14499 阅读 · 11 评论 -
底层剖析引用实现原理(引用是占有内存空间的)
正如《C++ primer》中所述,“引用即别名,它并非对象,相反地,它只是一个已经存在的对象所起的另外一个名字。”刚学习C++的时候,觉得引用就是一个别名,并不会占有内存。剖析了引用的底层实现原理之后,才发现这是错误的,引用也是会占有内存的,且底层是通过指针来实现的。一、底层剖析引用实现原理以下是一段对引用和源变量取地址的代码,一起看一下#include<iostream>using namespace std;int main(){ int a = 10; int &原创 2020-11-20 16:35:39 · 3182 阅读 · 4 评论 -
有继承关系时,基类的析构函数是否要定义为虚函数?(这一篇就够了)
析构函数是类中一个重要的函数,用于释放类对象使用的资源,并销毁对象的非static数据成员。**当类对象被销毁时,会自动调用其析构函数,销毁对象的所有非静态的数据成员,从而避免内存泄露。**对于C++初学者,当有继承关系时,由于析构函数掌握不够,容易在销毁对象时造成内存泄露。以下从销毁对象时发生内存泄露的情况、解决内存泄露的两种方法及原理来帮助读者掌握析构函数。首先,写一个Child类继承Base类:#include<iostream>using namespace std;class原创 2020-11-19 19:39:02 · 1162 阅读 · 0 评论 -
从C++运算符重载到类模板(以复数类为例)
这几天在用C++写一个本专业相关的项目时,涉及到的频域信号是复数(s=a+bi),不是C++内置的数据类型,无法直接调用运算符进行计算,于是就自己写了一个复数类来实现了复数运算的相关功能。虽然C++标准库std中已经实现了complex类,包含头文件(#include < complex >)就可以直接调用,但是小编觉得复数类是学习C++运算符重载一个很好的案例,因为会涉及加、减、乘、除、相等、赋值等这些常见的运算符重载。接下来我们一起来学习一下运算符重载。一、运算符重载概念引入像上图的传原创 2020-11-12 18:26:46 · 1193 阅读 · 0 评论 -
从内存角度剖析虚函数实现多态的原理
刚开始学习C++虚函数的时候,只知道虚函数就是用来构成动态多态的,以及如何使用虚函数。但是我发现当碰到稍微复杂的多态问题的时候,就很难以理解其实现原理,导致使用出错,比如:一个派生类继承基类,生成对象有两种方式:调用基类生成对象、调用派生类生成对象,调用完毕后释放对象,哪种方式必须要用虚函数实现基类和派生类的析构函数,如果不用会出现什么问题?(这个问题后面我会单独写一个博客再解释)。而《C++ Primer》中更多的是对虚函数使用的讲解,查阅有关虚函数的博客也仅仅是在结论层次对虚函数、纯虚函数进行分析和比较原创 2020-11-04 22:43:04 · 1097 阅读 · 0 评论 -
面试题:vector迭代器什么时候会失效?
在vector中,我们经常会使用迭代器iterator对vector中的元素进行索引,也经常需要将迭代器作为参数传递到vector的成员函数中,迭代器使用非常方便,但使用不当也会给我们带来巨大的麻烦,下面就深入分析vector迭代器失效的场景。一、 push_back导致迭代器失效vector在push_back的时候当容量不足时会触发扩容,导致整个vector重新申请内存,并且将原有的数据复制到新的内存中,并将原有内存释放,这自然是会导致迭代器失效的,因为迭代器所指的内存都已经被释放。举例如下:#转载 2020-10-24 20:44:29 · 5344 阅读 · 2 评论 -
面试题:new与malloc动态分配内存的区别与联系
一、malloc与new介绍malloc:C语言提供的库函数,用于在堆区中申请一块指定大小的内存,并返回指向内存首地址的无类型指针;new:C++语言提供的运算符,由编译器在自由存储区自动分配对象应占的内存,并返回指向内存首地址的对象类型指针;二、联系 1、二者均是动态分配内存的方法,由程序员自动开辟和释放内存,需要malloc/free、new/delete成对使用; 2、new是以malloc函数为底层来实现的;三、区别 1、malloc是C语言定义的库函数,而new是C++定义的运算原创 2020-09-29 16:43:17 · 1028 阅读 · 1 评论 -
浅谈C++容器(一):三种序列容器vector、list、deque的区别
在C++实际开发过程中,经常需要实现数据的添加、修改、插入、读取等功能,若程序员自己编写一个数据结构来实现,不仅会增加代码的工作量,还会出现许多需要解决的问题。而容器是一种封装了数据结构的类,可实现各种功能,帮助程序员更好地开发。常用的标准容器可分为两大类,序列容器和关联容器。本文先浅谈序列容器的分类、特点及使用情况,希望帮助开发者选择最合适的容器。一、分类序列容器可分为三种,vector向量容器、list列表容器、deque双端队列容器,如下:vector向量容器:可看作一个动态数组,连续存储结原创 2020-09-17 20:33:05 · 1510 阅读 · 0 评论 -
从内存角度理解函数值传递与地址传递的区别
**新人博客小编一枚,希望与大家多多交流C++的学习心得,欢迎大家批评指教、共同进步!对C++初学者来说,对于值传递和地址传递的使用都停留在“用而不懂”的状态,以至于在实际应用经常会发生各种错误,今天我从内存的角度分析一下,希望帮助初学者从根本来理解两者之间的区别,这样才能在学习C++的道路上取得更大地提升。一、基本概念形参:函数定义中的参数;实参:实际传入函数中的参数;值传递:以变量、常量等为函数参数,将实参的值复制一份到函数的形参中,函数中参数的修改对实参不会产生影响;地址传递:以指针为函原创 2020-09-05 18:48:41 · 2439 阅读 · 2 评论 -
面试题:什么是野指针?产生野指针的原因?
一、什么是野指针野指针是指向位置随机的、不正确的指针,系统无法对其进行操作;二、野指针的危害野指针指向的位置是随机的, 危害也是随机的,不一定会产生错误。若程序产生错误,一般为内存泄露导致程序中断。严重的情况,若野指针指向的位置存放一个病毒,对其解引用后就会导致电脑中毒。三、野指针产生的原因1、创建指针时没有对指针进行初始化,导致指针指向一个随机的位置;2、释放指针指向的内存后没有置空,从而指向垃圾内存;3、在超越变量作用域下使用指针,如:在栈内存被释放之后,指向栈内存的指针会指向垃圾内存;原创 2020-09-29 21:25:55 · 8535 阅读 · 0 评论