c++
文章平均质量分 51
scut_yp
积极乐观,热爱生活
展开
-
clang-tidy使用总结
clang-tidy使用总结clang-tidy静态扫描c++代码一:如何在centos7上安装clang-tidy二:如何使用clang-tidyclang-tidy静态扫描c++代码这篇文章主要讲了以下几点:1,如何在centos7上安装clang-tidy2,如何使用clang-tidy3,如何将clang-tidy结合blade对整个项目进行静态扫描一:如何在centos7上安...原创 2019-08-23 16:03:56 · 14690 阅读 · 0 评论 -
c++之纯虚函数
我们通过在函数体的位置(即在声明语句的分号之前)书写=0就可以将一个虚函数说明为纯虚函数。其中=0只能出现在类内部的虚函数声明语句处。class A{ virtual int f() = 0; //声明为纯虚函数};注意,我们可以为纯虚函数提供定义,不过函数体必须定义在类的外部。也就是说,我们不能在类的内部为一个=0的函数提供函数体。定义纯虚函数可以清晰的告诉用户当...原创 2019-04-12 14:58:25 · 263 阅读 · 0 评论 -
c++11特性之constexpr
更多c++后台开发知识点,请参考我的博客:https://blog.csdn.net/ypshowm常量表达式是指值不会改变且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。在一个复杂的系统中,很难分辨一个初始值到底是不是常量表达式,因此c++11规定:允许将变量声明为constexpr类型,以由编译器来验证变量的值是否...原创 2019-04-09 11:04:35 · 1023 阅读 · 0 评论 -
c++11特性之Lambda表达式
更多c++后台开发相关知识,可以看我的博客:https://blog.csdn.net/ypshowm一个lambda表达式表示一个可调用的代码单元。与函数一样,也具有一个返回类型,一个参数列表,和有一个函数实体。表达式如下:[capture list] (params list) mutable exception-> return type { function body ...原创 2019-04-09 10:32:54 · 130 阅读 · 0 评论 -
c++11之final关键字
有时候我们会定义这样一种类:我们不希望其他类继承它,或者不想考虑它是否适合作为一个基类,为了实现这样一个目的,c++11提供了一种防止继承发生的方法,即在类名后面跟一个关键字final。另外,我们也可以在成员函数的后面加final。如果我们把某个函数定义成final了,则之后任何尝试覆盖该函数的操作都将引发错误。struct A{ virtual void f1(int) c...原创 2019-04-12 12:45:02 · 482 阅读 · 0 评论 -
c++之virtual关键字
在c++中,基类必须将它的两种成员函数区分开来,(1)一种是基类希望其派生类进行覆盖(override)的函数。这种函数,基类通常将其定义为虚函数(加virtual)。当我们使用基类的指针或者引用调用虚函数时,该调用将被动态绑定。(2)另外一种是基类希望派生类直接继承而不需要改变的函数。基类通过在其成员函数的声明语句之前加关键字virtual使得该函数执行动态绑定。任何...原创 2019-04-12 12:43:09 · 2530 阅读 · 0 评论 -
c++11之override关键字
派生类如果定义了一个函数与基类中虚函数的名字相同但是形参列表不同,仍然是合法的行为。编译器将认为新定义的这个函数与基类中原有的所有函数都是相互独立的。这时,派生类的 函数没有覆盖掉基类中的版本。就实际编程习惯而言,这种声明往往意味着发生了错误,因为我们可能原本希望派生类生覆盖掉基类中的虚函数,但是一不小心把形参列表弄错了。要想调试并发现这样的错误非常困难。因此c++11指出可以用overrid...原创 2019-04-12 12:27:18 · 2959 阅读 · 0 评论 -
c++11之std::move函数
C++11在运行期有所增强,通过增加核心的右值引用机制来改善临时对象导致的效率低下的问题。C++临时对象引入了多余的构造、析构及其内部资源的申请释放函数调用,导致程序运行时性能受损,这一点被广为诟病。C++标准委员会在C++11中引入了右值引用这个核心语言机制,来提升运行期性能过std::move,可以避免不必要的拷贝操作。std::move是为性能而生。std::move是将对象的状...原创 2019-04-12 11:49:15 · 15884 阅读 · 1 评论 -
c++中的内敛函数以及虚函数
在C++中,inline关键字和virtual关键字分别用来定义c++中的内联函数和虚函数,他们在各自的场合都有其各自的应用,下面将简单介绍他们各自的功能,然后在说明为什么一个函数不能同时是虚函数和内联函数(inline)内联函数(inline) 内联函数的目的是为了减少函数调用时间。它是把内联函数的函数体在编译器预处理的时候替换到函数调用处,这样代码运行到这里时候就不需要...转载 2019-04-08 22:38:14 · 546 阅读 · 0 评论 -
c++ extern关键字的作用
利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下。一、引用同一个文件中的变量#include<stdio.h>int func();int main(){ func(); //1 printf("%d",num); //2 return 0;}int num = 3...转载 2019-04-12 15:07:17 · 3601 阅读 · 1 评论 -
c++语言的特点
C++语言是在C语言的基础上发展而来,同时它又支持面向对象的程序设计,它主要具有以下特点:1.继承自C语言的优点:语言简洁、紧凑,使用方便、灵活;拥有丰富的运算符;生成的目标代码质量高,程序执行效率高;可移植性好等。2.对C语言进行的改进:编译器更加严格,引入引用的概念,引入const常量和内联函数,取代宏定义等。3 .同时支持面向过程和面向对象的方法:在C++环境下既可以进行面向对象...原创 2019-04-12 15:21:35 · 26216 阅读 · 0 评论 -
c语言将文件内容写到内存
char* ContentOfFile(char* file_name){ FILE* file = fopen(file_name, "rb"); if (!file) { printf("打开文件失败\n"); return NULL; } //将文件指针移动到文件末尾 if (fseek(file, 0, SEEK_END) != 0) { ...原创 2019-06-03 15:12:17 · 3249 阅读 · 2 评论 -
详解UML类图
1. 类类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务。一个类可以有多种职责,设计得好的类一般只有一种职责。在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。类的属性即类的数据职责,类的操作即类的行为职责。设计类是面向对象设计中最重要的组成部...转载 2019-05-06 22:15:52 · 1150 阅读 · 1 评论 -
c++从源文件到可执行文件的步骤详解
编译与链接有四个过程:(1)预处理(2)编译(3)汇编(4)链接(1)预处理源文件和头文件被预处理成一个.i文件、(-E表示只进行预处理)g++ -E hello.cpp -o hello.i-E:意味着只执行到预编译,直接输出预编译结果。预处理过程主要处理那些源文件中的以“#”开始的预编译指令。包括#include,#define, #if,等...原创 2019-04-18 11:27:05 · 6517 阅读 · 2 评论 -
STL之hash_table的底层实现
转载自:http://www.cnblogs.com/JackyTecblog/archive/2012/08/12/2634764.htmlHashtable在C++的STL里占据着比较重要的一席之地。其中的hash_set、hash_map、hash_multiset、hash_multimap四个关联容器都是以hashtable为底层实现方法(技巧)。应该说,上述的四个关联式容器提...转载 2019-04-17 10:25:06 · 726 阅读 · 1 评论 -
c/c++中二维数据的动态创建与释放
给数组动态分配内存或者初始化,是因为我们不知道要分配多少个数1,c语言中动态的分配二维数组使用malloc()、free()函数进行动态分配,这两个函数包含于stdlib.h或malloc.h中假如要申请一个3行5列的二维数组内存#include <stdlib.h>int main(){ // 为二维数组分配3行 int **a = (in...转载 2019-04-20 19:10:13 · 665 阅读 · 0 评论 -
c++运行时类型识别RTTI(typeid运算符与dynamic_cast)
运行时类型识别由两个运算符实现(1)typeid运算符,用于返回表达式的类型。(2)dynamic_cast运算符,用于将基类的指针或引用安全地转换成派生类的指针或引用。这两个操作的适用情况:我们想适用基类对象的指针或引用执行某个派生类操作并且该操作不是虚函数。一:dynamic_cast运算符dynamic_cast运算符的使用情况如下dynamic_cast&l...原创 2019-04-14 22:19:37 · 276 阅读 · 0 评论 -
定位new表达式
默认情况下,如果new不能分配说需要的内存空间,它会抛出一个类型为bad_alloc的异常。我们可以改变使用new的方式来阻止它抛出异常://如果分配失败,new返回一个空指针int* p1 = new int; //如果分配失败,new抛出std::bad_allocint* p2 = new (nothrow) int; //如果分配失败,new返回一个空指针。我们...原创 2019-04-12 19:09:15 · 434 阅读 · 0 评论 -
重载new和delete
new的操作:(1)调用operator new函数获取内存空间(2)在分配的内存空间中调用构造函数构造对象delete操作:(1)调用析构函数销毁对象(2)调用operator delete函数释放对象所占的空间。其实operator new和operator delete的底层实现是调用了malloc和free。这两个函数定义在<cstdlib>头文件中。...原创 2019-04-12 18:43:21 · 158 阅读 · 0 评论 -
c++拷贝构造函数(为什么要用const,参数为什么用引用)
先从一个小测试开始#include<iostream>using namespace std; class CExample{private: int m_nTest; public: CExample(int x) : m_nTest(x) //带参数构造函数 { cout << "constructor with argumen...转载 2019-04-12 16:59:15 · 9777 阅读 · 11 评论 -
c++中的内联函数与虚函数,以及哪些函数不能为内联函数,
简介在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支...原创 2019-04-08 21:55:31 · 3574 阅读 · 0 评论 -
用c语言实现函数重载
一.什么是函数重载?函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数、类型、顺序)的函数,这组函数被称为重载函数。重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。二、为什么要用函数重载在我们之前学习的C中,我们对一个功能函数要实现不同类型的调用时,就必须得取不同的名称...原创 2019-04-08 17:32:10 · 25021 阅读 · 2 评论 -
c++中const的作用
const关键字的作用(1)作用:1)欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了;2)对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;3)在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值;4)对于类的成员函数,有时候必须指定...原创 2019-04-04 17:30:13 · 52897 阅读 · 10 评论 -
extern c的作用
extern c就是告诉编译器,下面包含的代码需要 调用c编译器。extern主要就是针对全局变量以及函数的。而在c++中有函数重载,会将函数的名字进行解释。而c语言中没有函数重载,因为为了混用c++和c语言,故须对当前代码用什么编译器要做出解释。下面这篇博客很详细的解释了上面的问题:https://www.cnblogs.com/carsonzhu/p/5272271.html...原创 2019-04-04 17:28:53 · 123 阅读 · 0 评论 -
c++实现strcpy函数
char* strcpy(char* dest, constchar* src) // 实现src到dest的复制{ if((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性 { returnNULL; } char*strdest = dest; //保存目标字符串的首地址 while((*des...原创 2019-04-04 16:44:51 · 586 阅读 · 0 评论 -
c++面试知识点详细总结
以下是面试中问到过的c++知识点一些总结,除了背诵基本知识点,更重要的多去深入理解里面的原理,不然面试官转个弯深究一下,可能就有点懵了。。。。。。。。祝大家都拿到心仪的offer。文章会持续更新(有些是自己的理解,如有错误,欢迎指正批评) ——————scut/yp一:c++static关键字的作用以下是一般人都会背了的吧:c/c++共有 1):修饰全局变...原创 2019-03-30 22:24:54 · 851 阅读 · 0 评论 -
c和c++的不同
(1)在c++中可以通过域操作符"::"来直接操作全局变量,但c中不支持这个操作符原创 2018-11-12 22:42:31 · 96 阅读 · 0 评论 -
数据结构之查找
一:查找的基本概念(1)查找表: 由同一类型的数据元素构成的集合1)静态查找表:只做查找操作的查找表1)查询某个“特定数据”元素是否在查找表中。2)检索某个特定的数据元素和各种属性;2)动态查找表:在查找过程中同事插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。1)查找时插入元素2)查找时删除元素(2)关键字: 数据元素中某个数据项的值。 1)主关键字...原创 2018-10-30 21:54:04 · 548 阅读 · 1 评论 -
类
1.类的声明: class Screen; 这种叫前向声明。。。对于类型来说,在声明之后,定义之前,它是个不完全类型。 不完全类型的使用场景: (1)可以定义指向这种类型的指针或应用; (2)可以声明(但不能定义)以不完全类型作为参数或者返回类型的函数。 ...原创 2018-10-27 20:19:33 · 247 阅读 · 0 评论 -
c++后台
https://blog.csdn.net/peopleqinlei https://www.cnblogs.com/jeakeven/category/700128.html1.c++面试问题总结:(1)空类的大小,仅含有虚函数类的大小(2)析构函数声明为虚函数的作用(3)C++多态的实现方式,虚函数的底层实现细节(4)引用和指针的区别(++)(5)继承类调用构造函数顺序和析构函...原创 2018-10-30 11:18:52 · 912 阅读 · 0 评论 -
c++ 构造函数知识点
(1)构造函数名字与类名相同,没有返回类型。不能被声明成const。合成的默认构造函数只有编译器发现类内不包含任何构造函数的情况下才会帮我们生成。若定义了其他构造函数,要想有默认的够赞函数,则必须显式的写出来。在参数列表后面加default 如:Sales() = default;内置类型在类内执行默认初始化时,他们的值是未定义的。(除了string和vector。只有这两个...原创 2018-10-26 21:24:32 · 235 阅读 · 0 评论 -
c++:类的成员函数
(1)成员函数的声明必须在类内,定义可以在类内或者类外。定义在类内部的函数隐式的为inline函数 非成员函数的声明和定义都必须在类外。(2)this指针this指针是成员函数额外的隐式参数,this是一个常量指针,不允许改变this中保存的地址。(默认情况下this的类型是指向类类型非常量版本的常量指针。)将this声明成指向常量的常量指针的办法: ...原创 2018-10-26 20:54:31 · 248 阅读 · 0 评论 -
c++中static的作用
c++static关键字的作用以下是一般人都会背了的吧:c/c++共有 1):修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。 2):修饰局部变量时,表明该变量的值不会因为函数终止而丢失。 3):修饰函数时,表明该函数只在同一...原创 2019-04-04 17:31:15 · 68182 阅读 · 14 评论 -
c++编写String类
class String{public: String(const char* str = nullptr); //普通构造函数 String(const String& other); //拷贝构造函数 ~String(void); //析构函数 String& operator = (const String& other...原创 2019-04-04 19:27:26 · 725 阅读 · 0 评论 -
函数调用的底层原理
转自:https://blog.csdn.net/z_ryan/article/details/81029195另外:https://www.cnblogs.com/ysocean/p/7625917.html 这文章也讲的必将详细在编程中,相信每个人对函数都不陌生,那么你真正理解函数的调用过程吗?当一个c函数被调用时,一个栈帧(stack frame)是如何被建立,又如何被消除的。本...转载 2019-04-07 20:31:15 · 2680 阅读 · 0 评论 -
c/c++中printf函数的底层实现
研究printf的实现,首先来看看printf函数的函数体!int printf(const char *fmt, ...) { int i; char buf[256]; va_list arg = (va_list)((char*)(&fmt) + 4); i = vsprintf(buf, fmt, arg); write(...转载 2019-04-07 19:43:43 · 13101 阅读 · 1 评论 -
c++内存对齐
一、内存对齐的原因大部分的参考资料都是如是说的:1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 现代计算机中内存空间都是按照b...原创 2019-04-07 17:37:05 · 361 阅读 · 0 评论 -
c/c++中malloc的底层实现原理
首先看一张堆的图。在已经映射的内存空间结尾有一个break指针,这个指针下面是映射好的内存,可以访问,上面则是未映射的访问,不能访问。可以通过系统调用sbrk(位移量)能一定brk指针的位置,同时返回brk指针的位置,达到申请内存的目。brk(void *addr)系统调用可以直接将brk设置为某个地址,成功返回0,不成功返回-1。而rlimit则是限制进程堆内存容量的指针。在操作系统...原创 2019-04-07 17:21:06 · 4879 阅读 · 0 评论 -
c++中堆和栈的区别
详细的可以看下这篇博客:https://www.cnblogs.com/yechanglv/p/6941993.html一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。。2、堆区(heap)—一般由程序员分配释放, 需要程序员手动释放。3、全局区(静态区)(static)—,全局变量和静态变量的存...原创 2019-04-07 16:43:23 · 654 阅读 · 0 评论 -
c++构造函数列表初始化
列表初始化初始化列表和构造函数初始化(赋值)的方式对于内置类型的成员(如int等)来说,其实没有什么区别,其性能和结果往往一样。但是,对于非内置类型的成员(类类型)来说,是有区别的。初始化和赋值对内置类型的成员没有什么大的区别。对非内置类型成员变量,为了避免两次构造(一次默认构造函数,一次赋值运算),推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数:1.成员类型...原创 2019-04-07 16:23:34 · 329 阅读 · 0 评论