自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 linux命令基础习惯

终端:一系列输入输出设备的总称shell:命令解释器当前系统下的shell:cat /etc/shells当前正在使用的shell:echo $SHELL移动到命令行首:crtl+a;删除到命令行首ctrl+u移动到命令行尾:crtl+e;删除到命令行尾ctrl+kbin:可执行文件目录dev:设备文件目录etc:用户相关的配置文件信息lib:库路径linux系统文件类型:普...

2020-02-26 10:27:50 89

转载 为什么C++编译器不能支持对模板的分离式编译

首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文件)文件格式,并且本身包含的就已经是二进制码,但是不一定能够执行,因为并不保证...

2019-12-27 11:37:39 99

原创 标准库特殊设施

一、tuple类型1、定义和初始化tuple类似pair,每个pair都恰好有两个成员,tuple可以有任意数量的成员;tuple<int, int, int> t; //值初始化tuple<size_t, size_t, size_t> t1(1,2,3); //初始值初始化auto t = make_tuple(1,2,3); //类似make_pair函数...

2019-12-23 20:10:43 112

原创 模板与泛型编程

一、定义模板1、函数模板 以关键字template开始后接<>括起来的,以逗号分隔的一个或多个模板参数列表,且该列表不能为空; 模板类型参数:可以看作类型说明符(内置类型或类类型),类型参数可以用来指定返回类型,函数的参数类型,以及在函数体内用于变量声明或类型转换; 类型参数前面必须加关键字 typename 或 class , 非类型参数:通过特定的类型名指定非类型...

2019-12-23 10:32:53 116

原创 面向对象的程序设计

一、OOP概述面向对象的程序设计(object-oriented programming)的核心思想是数据抽象、继承和动态绑定;继承:基类、派生类、虚函数 派生列表:首先是冒号,后面紧跟以逗号分隔的基类列表,每个基类前面可以有访问说明符; 派生类可以在重新定义的虚函数前面加 virtual,也可以不加; 派生类可以显示的注明使用哪个成员函数改写基类的虚函数,做法是在参数列表后加 ove...

2019-12-10 16:09:20 226

原创 重载运算与类型转换

一、输入输出运算符1、重载输出运算符 通常情况下,第一个形参是ostream的非const引用,第二个形参是const引用,返回 ostream &; 尽量减少格式化:主要负责打印内容,而非控制格式,且不应该打印换行符; 输入输出运算符必须是非成员函数,当然io运算符通常读取类的非公有成员,因此一般声明为友元; 2、重载输出运算符 通常情况下,第一个形参是运算符将要读取的流的...

2019-12-06 16:33:15 81

原创 拷贝控制

一、拷贝、赋值与销毁1、拷贝构造函数: 1、拷贝构造函数:第一个参数必须是自身类类型的引用(几乎总是const引用,不应该是explicit),而且任何额外的参数都有默认值 2、合成拷贝构造函数:即使有其他构造函数,编译器也会合成拷贝构造函数,编译器从给定对象中依次将每个非static成员拷贝到正在创建的对象中 3、第一个参数必须是自身类类型的引用的原因: 如果不是引用类型,为了调用拷...

2019-12-04 14:08:03 116

转载 什么是异常安全的代码

一直以来,我对“异常安全”这个概念都不是太理解,今天查阅了一些资料,终于弄清楚了它的意思。“异常安全”并不是说不能抛出异常,更不是说“非常安全的意思”,而是说即使在抛出异常的时候(如果有异常的话),程序回退的过程是干净的。“异常安全”分为三个级别:1.基本级别:可能发生异常,但是彼时代码保证做了任何必要的清理工作;2.事物级别:可能发生异常,但是彼时代码保证它对数据的任何修改都被回滚;3...

2019-11-27 14:50:57 689

原创 动态内存

一、智能指针:头文件:memory1、shared_ptr (1)、shared_ptr和unique_ptr都支持的操作 shared_ptr<T> sp; unique_ptr<T> up; //空智能指针 *p; p->mem; p.get(); //返回p中保存的指针,注意p被释放了,保存的指针也就不能用了 swap(p,q); ...

2019-11-26 15:30:28 122

原创 关联容器

一、关联容器的三个维度:1、或者是set,或者是map2、或者允许重复(multi),或者要求不重复3、或者按顺序保存,或者无序保存(unordered)综上三点:unordered_multi_set则表示允许重复,无序保存的集合;set则是不重复,有序保存的集合头文件:map unordered_map set unordered_set8中容器:map set multimap ...

2019-11-20 20:42:12 117

原创 泛型算法

一、只读算法1、find(b, e, val): b、e为首尾迭代器,val要查找的值,返回值为查找到元素位置的迭代器,没找到返回尾迭代器2、count(b, e, val): b、e为首尾迭代器,val要计数的值,返回值为val出现的次数3、accumulate(b, e, 0):头文件为#include < numeric >,序列中的元素必须与第三个擦书匹配,或能转换成...

2019-11-19 20:34:39 104

原创

一、const成员函数和非const成员函数const成员函数的this指针为:指向常量对象的常量指针,顾即可通过常量对象也可通过非常量对象调非const成员函数的this指针为:指向非常量对象的常量指针,顾只能通过非常量对象调二、重载操作运算符一般对返回对象的引用(*this)如果时const成员函数返回*this,则它的返回类型为常量引用三、与类相关的非成员函数:一般来说,非成...

2019-11-15 15:10:22 161

原创 异常处理

1、throw表达式:用于抛出一个异常,调用于try块内或者try块内的函数里2、try块:将可能发生异常的代码写入该块,并通过步骤1抛出异常3、catch块:捕捉2发生的异常try{ throw 1;}catch(int){}catch(…){}...

2019-11-13 22:24:07 99

原创 函数指针

1、把函数名作为一个值使用时,自动将其转换为函数指针;void ff(){}void (*pf)() = ff;//ff自动转换为函数指针2、函数指针也可以赋值为nullptr,表示没有指向任何函数;但如果想要指向某个函数,则函数类型也函数指针的类型必须严格匹配,也就是参数和返回值必须严格匹配void (*pf)() = nullptr;3、函数类型和函数指针类型typedef v...

2019-11-12 17:05:08 140

原创 对于函数调试有帮助宏

1、assert(arg):常用于检查不能发生的条件,arg如果为真则什么也不做,如果为假则输出信息且终止程序的执行;2、NDEBUG:定义该宏能避免运行时的开销,assert也不会做任何检查3、对于程序调试很有用的名字:__FILE__ __func__ __LINE__ __DATE__ __TIME__...

2019-11-12 16:09:47 87

原创 string的额外操作

1、构造string的其他方式1、用const char * 创建 string时: 字符数字不以空字符结尾,必须提供计数值,且计数值小于等于size: const char arr[] = {'a','b','c','d'}; string str(arr, size(arr)); 字符数字以空字符结尾,不必提供计数值,如果提供计数值则小于等于size: const char arr...

2019-11-11 22:43:53 87

原创 顺序容器的操作

1、 push_back(); 将一个元素的拷贝追加到容器的末尾(array、forward_list不支持该操作)2、 push_front(); 仅 list、forward_list、deque 支持该操作,同样将元素的拷贝添加到容器的头部3、insert();插入操作对于 vector、string、deque,来说可能很耗时,虽然vector、string不支持push_fro...

2019-11-08 20:07:00 105

原创 顺序容器的初始化和赋值

1、顺序容器的初始化:默认初始化; //array将进行默认初始化拷贝初始化; //容器和容器内的元素必须相同部分拷贝初始化;//不需要容器和容器内的元素相同,只要能转换成需要元素即可方式:vector a(b.begin(), b.begin()+n);列表初始化;指定大小初始化; //array不支持; 不提供初始值将进行值初始化2、赋值拷贝赋值;部分...

2019-11-07 22:25:38 201

原创 关于头文件的注意事项

1、const或constexpr 变量能在不同文件定义多次,而非const或constexpr变量在不同文件能被声明多次,却只能被定义一次,所以头文件能够包含:const或constexpr定义的变量; const int a = 1;非const或constexpr变量的声明; extern int a;函数的声明; ...

2019-11-07 11:28:24 244

原创 关于constexpr使用时的注意事项

1、与const不同,constexpr的初始值必须时常量表达式(值不会改变,并且在编译阶段就能知道计算结果的表达式);constexpr int a = 1;constexpr int b = a+1;constexpr int c = fun(); //fun()可能不是常量表达式2、因为常量表达式的值在编译阶段就必须知道,所以声明constexpr用到的类型为字面值类型(算术类型、...

2019-11-06 21:38:56 518

原创 关于decltype使用时的注意事项

1、decltype推导时不同于auto,不会忽略顶层const和引用;const int a = 1;decltype(a) aa = 1; //aa保留顶层const属性const int &y = a;decltype(y)yy = a; //yy类型为const int &2、推导时要想忽略掉顶层引用,做+0处理;int a = 1;int &y = ...

2019-11-06 20:33:09 160

原创 关于auto使用时的注意事项

1、用auto进行类型推导时(非引用)会忽略顶层const、保留底层const;const int a = 1;auto b = a; //b忽略顶层const属性auto p = &a; //p保留底层const属性2、用auto推导引用类型时,实际推导的是引用所绑定的对象;而被绑定的对象即使包含顶层const,也会被忽略掉;const int a = 1;const int...

2019-11-06 16:59:15 587

原创 关于const、指针和引用的3点联合用法:

第一点:int a = 1;int *p = &a;1:(1):const int &c_y_a = a; 等价于 int const &c_y_a = a;(2):int &const b = a; 等价于 int &b = a;说明:引用本身就不能改变所绑定的对象,顾(2)没有任何意义;const修饰&则表示引用不能改变所绑...

2019-11-05 15:36:00 95

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除