![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 78
Strive for the best!
这个作者很懒,什么都没留下…
展开
-
23.C++关于main函数的说明,参数,main函数之前运行
参数C++规定标准main函数的返回类型为int型,所以我们最后要写return 0;表示程序正常退出。很多人写main函数都没有参数,就觉得它没有参数,其实不是的。main函数原型:int main(int argc,char* argv[]);//或int main(int argc,char** argv);看见其实main函数有两个参数,第一个参数表示传入数组的个数。至少为1.第二个参数表示传入的指针数组。数组中每个元素保存命令参数的字符串。这个数组argv[0]保存着函数名和路原创 2021-11-15 21:23:36 · 1266 阅读 · 0 评论 -
22.C++智能指针
设计思路C++ 智能指针思路类似于在语言(如 C#)中创建对象的过程:创建对象后让系统负责在正确的时间将其删除。智能指针主要用于管理堆上内存的分配,将普通指针封装成为一个栈,然后当栈生命周期结束后,会调用析构函数释放申请的内存。(注:所谓封装,举个例子:对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。可以通过make_shared函数或者通过构造函数传入普通指针。并可以通过get函数获得普通指针。)C++ 11中最常用的智能指针类型为shared_pt原创 2021-11-08 21:21:34 · 755 阅读 · 0 评论 -
21.C++多线程以及C++11多线程操作
多线程多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。多任务处理分为两种类型:基于进程和基于线程基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段并发执行假设您使用的是 Linux 操作系统,我们要使用 POSIX 编写多线程 C++ 程序。POSIX Threads 或 Pthreads 提供的 API 可在多种类 Unix POSIX 系统上可用,比如 FreeBSD、NetBSD、GNU/Linux、Mac OS X 和 Sola原创 2021-10-12 13:17:45 · 790 阅读 · 0 评论 -
20.C++——预处理器和信号处理
预处理主要指示编译器在编译之前完成预处理。预处理指令不是C++语句,所以#xxxx 之后不需要加 ; 结尾常见预处理包括**#include 、#define 、#if 、 #else 、 #line **define用于创建符号常量、通常称为宏。#define PI 3.14159参数宏#define MIN(a,b) (a<b ? a : b)条件编译#ifdef xxx xxxxx#endif也可以用#if 0来写注释:#if 0 注释内容#endif原创 2021-10-11 14:47:34 · 177 阅读 · 0 评论 -
19.C++命名空间(为什么C++程序在#include之后要写using namespace std) 和模板(参数化多态)
命名空间主要用来作为附加信息来区分不同库中相同名称的函数、类、变量等。本质上命名空间是用来限定范围的,比如说们找一个叫“张伟”的人,全中国可能有几千万。但是我们可以说,在xx省xx市xx楼找一个叫张伟的,这就很明确了。定义命名空间可以用关键字namespace来定义一个命名空间:namespace namespace_name { // 代码声明}调用命名空间我们可以用范围解析符调用某个命名空间中的函数或者变量:namespace_name::f(x)或者x下面的例子定义了两个命原创 2021-09-17 17:11:54 · 872 阅读 · 0 评论 -
18.C++动态内存,堆和栈,new & delete 与malloc/free
C++ 程序中的内存分为两个部分:栈:函数内部声明的变量占用栈的内存。堆:程序中未使用的内存,可用于动态分配内存。什么叫动态内存?比如我们现在需要一个空间,我们明确的知道我们需要什么类型的空间,比如char类型的数组,但是现在我却没有办法确定我需要多大的数组。这时候就需要用到动态内存。new 和 delete 运算符在C++中我们可以用new运算符分配堆的内存。如果当你不再需要这个内存,比如我们链表删除某一个节点,我们可以用delete运算符删除刚才new分配的空间。用法:new dat原创 2021-09-16 17:01:37 · 96 阅读 · 0 评论 -
17.C++异常处理
常用异常处理关键字异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。throw:出现问题,抛出异常。catch捕获异常。放在要处理问题的地方try: 放入要保护的代码块,后面通常接多个catch块。我们通常使用try …catch关键字来处理异常。其中:try放置可能抛出异常的代码。称为保护代码。实例:try{ // 保护代码}catch( ExceptionName e1 ){ // catch 块}catch(原创 2021-09-16 15:43:09 · 649 阅读 · 0 评论 -
16.C++文件和流
我们日常使用的cin/cout方法对应的是标准输入输出流,属于iostream标准库。当需要从文件读取和写入流时,就需要用到另一个库fstream,其定义三个数据类型:ofstream:用来创建文件并写入信息。ifstream:用来读取文件信息。fstream:同时具有上述两种功能,意味着可以创建文件写入信息,并读取。要在C++中进行文件处理头文件必须包含< iostream > 以及 < fstream >打开/关闭文件读取文件之前必须先打开,1、3中的ofstr原创 2021-09-16 15:15:18 · 87 阅读 · 1 评论 -
15.C++数据抽象与数据封装
数据抽象数据抽象主要只向外界提供接口和关键信息,但隐藏其后台的具体实现细节。我们数据抽象主要依靠C++的类来实现,而我们知道类中访问标签分为共有、私有和保护三种。公有标签定义的成员可以访问该程序的所有部分。而私有标签的成员却无法访问到使用类的代码。这样说可能优点抽象,我们来谈一下为什么这样抽象,或者数据抽象的好处类的内部会受到保护,不会因为用户某些错误导致对象状态出问题类可以应对更新需求。所以,我们一般只在类的私有部分定义数据成员,这样我们更改数据就很方便,比如我们某个数据更改会导致哪些影原创 2021-09-14 21:19:47 · 428 阅读 · 0 评论 -
14.C++ 多态——虚函数,多态的实现方式重载(静态多态),重写(动态多态)和重定义,一个函数能否成为虚函数
引入当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。先看一个示例:下面的实例中,基类 Shape 被派生为两个类,如下所示:#include <iostream> using namespace std;class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a; h原创 2021-09-13 18:29:50 · 1009 阅读 · 0 评论 -
13.c++重载
重载c++允许某个函数、运算符 指定多个定义或者不同参数。即他们的函数/运算符名一样,但是参数列表和具体实现不一样。函数的重载比较常见,这里我们看以下运算符的重载。运算符重载使用方法以两个对象作用为例:类的成员函数:Box operator运算符(const Box&);非成员函数:Box operator+(const Box&, const Box&);下面的实例使用成员函数演示了运算符重载的概念。在这里,对象作为参数进行传递,对象的属性使用 this 运原创 2021-09-02 11:01:18 · 122 阅读 · 1 评论 -
c++ accumulate函数拓展技巧
我们经常有这样一个需求,就是遍历一遍数组、vector挑选出符合条件的数进行操作。这里可以用到accumulate这个函数。前两个参数是定义序列的输入迭代器,第三个参数是和的初值;第三个参数的类型决定了返回值的类型。第二个版本的第 4 个参数是定义应用到总数和元素之间的二元函数对象。(即数组里的任意两个元素类型)这时,我们在必要时可以定义自己的加法运算。例如:std::vector<int> values {2, 0, 12, 3, 5, 0, 2, 7, 0, 8};int m原创 2021-05-09 17:26:30 · 264 阅读 · 0 评论 -
12.c++面向对象——类与对象,成员函数,继承,构造&析构,友元函数,this指针,类的静态成员
C++类的定义定义一个类,本质上是定义一个数据类型的蓝图。类定义是以关键字 class 开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。例如,我们使用关键字 class 定义 Box 数据类型,如下所示:class Box{ public: double length; // 盒子的长度 double breadth; // 盒子的宽度 double height; // 盒子的高度};关键字 pub原创 2021-04-16 21:15:33 · 222 阅读 · 0 评论 -
c++ 函数返回多个值简单写法
用tuple想返回几个就返回几个,然后用auto […]可以逐个解开。用法:auto f(){xxxxxx;return std::make_tuple(a,b,c);}auto [a,b,c]=f();#include <tuple>#include <iostream>#include <string>int main(){ auto f = [](){ // 函数f,返回了3个不同类型的值 return std::原创 2021-03-08 15:38:52 · 674 阅读 · 0 评论 -
C++ 关于i++和++i的性能与效率
相比于++a,a++需要消耗一部分开销来储存没加之前的值有的编译器优化的好,两者速度几乎一样但是在无差别只需要加一的情况下,写++a是一种好的习惯,因为原理上++a比a++快,其只需要自加,然后该返回的返回就行。...原创 2021-01-30 12:17:55 · 206 阅读 · 0 评论 -
c++ new(new开辟的空间在堆上面,而不在存放一般变量的栈上面,所以局部函数中new出来的新空间,在局部函数调用结束之后仍然能够使用,可以用来向主函数传递参数)
我们之前说过,c++是不支持在函数外返回函数内局部变量的地址的,除非其是static类型。我们来看以下程序:int *addition(int a ,int b){ int *sum=new int (a+b); return sum;}那这段代码有没有问题呢,按照之前的说法,似乎这是不允许的。但是,我们注意到,这里很关键的内容在于,这个*sum指针,是new出来的。new出来的有什么不一样么?有的;new主要用来告诉计算机开辟出一段新的空间,但是和一般的直接int不一样的一点是,n原创 2021-01-30 11:34:37 · 1573 阅读 · 1 评论 -
c++. vector 容器
一、什么是vector?向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。二、容器特性1.顺序序列顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。2.动态数组支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。3.能够感知内存分配器的(Alloc原创 2021-01-25 13:17:57 · 142 阅读 · 1 评论 -
11.C++引用,引用和指针的区别,把引用作为参数,把引用作为返回值(被引用的对象不能超出作用域。所以返回一个对局部变量的引用是不合法的,可以返回一个对静态变量的引用)
C++引用引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。引用和指针的区别引用很容易与指针混淆,它们之间有三个主要的不同:可以有空指针,但不能有空引用,引用必须连接到一块合法的内存。引用一旦被初始化为某对象,就不能被指向到另一个对象,而指针可以在任何时候指向到另一个对象。引用必须在创建时被初始化。指针可以在任何时间被初始化。创建引用试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存原创 2020-12-25 13:26:00 · 337 阅读 · 0 评论 -
10.C++指针,空指针(NULL和nullptr区别),指针的算术运算,指针和数组,指针数组,指向指针的指针(多级间接寻址),传递指针(数组)给函数,从函数返回指针
C++指针学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。1.什么是内存地址以及如何访问它正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:#include <iostream>using namespace原创 2020-12-25 13:07:47 · 486 阅读 · 0 评论 -
9.C++字符串(C 风格字符串,C++ string类类型)
C++ 提供了以下两种类型的字符串表示形式:C 风格字符串C++ string类类型C风格字符串字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};依据数组初始化规则,您可以把上面的语句写成以下语句:char greeting[]原创 2020-12-23 12:44:38 · 96 阅读 · 0 评论 -
8.C++数组,指向数组的指针,传递数组给函数,从函数返回数组(C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量)
C++数组C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。1.声明数组在 C++ 中要声明一个数组,需要原创 2020-12-18 18:17:17 · 620 阅读 · 0 评论 -
7.C++ 数学运算,随机数
C++ 数学运算C++ 内置了丰富的数学函数,可对各种数字进行运算。下表列出了 C++ 中一些有用的内置的数学函数。为了利用这些函数,需要引用数学头文件 。#include <cmath>下面是一个关于数学运算的简单实例:#include <iostream>#include <cmath>using namespace std;int main (){ // 数字定义 short s = 10; int i = -100原创 2020-12-16 15:36:23 · 213 阅读 · 0 评论 -
6.c++函数,指针和引用,传值调用,指针调用与引用调用
C++函数函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。C++ 标准库(stl)提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存原创 2020-12-15 15:59:13 · 2248 阅读 · 0 评论 -
5.C++循环与判断(c++11基于范围的for循环),条件运算符 ? :
循环C++ 编程语言提供了以下几种循环类型。while用法:while(条件){ 代码块;}for用法:for ( init; condition; increment ){ statement(s);}流程图:1.初始条件:init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。2.判断条件:接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控原创 2020-12-02 15:22:48 · 1219 阅读 · 0 评论 -
4.C++运算符
C++运算符运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C++ 内置了丰富的运算符,并提供了以下类型的运算符:算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符算数运算符假设变量 A 的值为 10,变量 B 的值为 20,则:...原创 2020-12-01 16:05:40 · 146 阅读 · 0 评论 -
3.C++存储类(static,extern,thread_local)
C++存储类存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。(auto和register省略)staticexternmutablethread_local(c++11版本开始有)1)static存储类第一篇里面有,觉得重要又搬过来。1.全局静态变量:定义:在全局变量前加上关键字static,全局变量就定义成一个全局静态变量.内存位置:静态存储区初始化:未经初始化的全局静态变量会被自动初始化为0(而自动对象的值是任意的)作用域原创 2020-11-28 16:15:48 · 2012 阅读 · 0 评论 -
2.C++基本数据类型、类型修饰符、变量和常量、#define宏和const关键字
基本数据类型七种基本的 C++ 数据类型:注:其实 wchar_t 是这样来的:typedef short int wchar_t;所以 wchar_t 实际上的空间是和 short int 一样。类型修饰符:signedunsignedshortlong一些基本类型可以使用一个或多个类型修饰符进行修饰char 1int 4float 4double 8有无signed不改变字节数,但是影响取值范围unsigned只能非负,signed可以负数。short把4变成2lon原创 2020-11-24 21:35:14 · 1120 阅读 · 0 评论 -
1.C++特性,基本语法,标识符,static关键字
C++基础原创 2020-11-22 16:19:43 · 213 阅读 · 0 评论