
C++
董哥的黑板报
90后程序员!
展开
-
C++附加---静态库(.lib)的创建与使用(VS编译器实现)
一、静态库的概念①概念:静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。②特点:静态库链接之后,静态库改变,对程序不再产生影响,移植方便浪费空间与资源二、VS编译器下静态库的创建方法:一个项目建议完成后,在属性中将配置类型改为静态库(.lib),并生成解决方案...原创 2018-10-26 17:19:48 · 3113 阅读 · 0 评论 -
C++附加---动态库(.dll)的创建与使用(VS编译器实现)
一、动态库的概念①概念:动态库链接时不复制,程序运行时由系统动态加载到内存,供程序调用。而且系统只加载一次,可以被多个程序共用。②特点:动态函数库在编译的时候并没有被编译进目标代码中,需要用到相应的功能,代码才会被调用到程序中,节约内存动态库的改变,程序也会跟着动态变化,升级更新比较方便二、VS编译器下动态库的创建提示:动态库被其它程序调用,需要动态库提供相应的接口提供接口的...原创 2018-10-26 20:42:54 · 1732 阅读 · 0 评论 -
C++:01---函数重载、缺省参数
一、函数重载1.概念:在同一作用域内,声明几个功能相同(或类似)的同名函数,实现功能类似但所处理数据类型不同的函数2.函数重载的条件函数名必须相同 函数的参数不同(参数个数不同或参数对应位置的数据类型不同) 作用域必须相同 函数重载与函数的返回值无关3.哪些情况不构成重载、构成重载①顶层const不构成重载,所以下面的两个函数不构成重载int add(int a,int...原创 2018-12-05 22:08:05 · 1085 阅读 · 0 评论 -
C++:02---引用类型(&)
引用一、概念:C++中的一种新的变量类型,作用是为变量取别名二、引用规则引用被创建时必须被初始化(即必须指向一个对象) 引用一旦被初始化,就不能再指向其他对象 引用的数据类型必须与被引用的数据类型相同 不能引用NULL,也不能引用常量int &a=NULL; //错误int &a=1; //错误三、引用特点引用是被引用对象的别名,对引用操...原创 2018-12-05 23:31:37 · 875 阅读 · 0 评论 -
C++:03---内联函数(inline)
内联函数(inline)1.概念:内联类似于宏定义,当程序执行到内联函数时,相当于复制了一份函数代码。牺牲代码空间,赢得了时间内联说明只是向编译器发出一个请求,编译器可以选择忽略这个请求2.关键字:inline声明时写了inline,定义时可省略。建议声明和定义都加上inlineinline int add(int a,int b){ return a+b;}...原创 2019-03-28 12:38:11 · 634 阅读 · 0 评论 -
C++:04---命名空间(namespace)
一、概念:①类似于仓库,空间内存储代码,需要用到时调用 ②也为防止名字冲突提供了更加可控的机制二、命名空间的定义定义的基本格式namespace 命名空间名{ //一系列声明与定义};三、命名空间的注意事项命名空间定义时最后的分号可有可无 只要出现在全局作用域中的声明都可置于命名空间内:类、变量定义(及其初始化)、函数声明(及其定义)、模板、其它命名空间.....原创 2019-03-28 12:41:32 · 748 阅读 · 0 评论 -
C++:05---类的封装(访问说明符:public、protected、private)
概念:该公开的公开,该私有的私有,用类进行模板化处理分类:public(公有):在类内外、派生类中都可被访问 protected(保护):希望与派生类共享但是不想被公共访问所使用的访问权限。在基类和派生类中(派生类的友元也可以访问)可以被访问,在类外无法访问 private(私有):只有在类内可被访问,类外和子类无法访问注意事项:成员不写访问属性时,类的默认访问属性为priva...原创 2019-03-28 12:43:45 · 701 阅读 · 0 评论 -
C++:06---构造函数、析构函数
一、构造函数概念(作用):用来在创建对象时,对对象进行初始化特点构造函数无返回值,函数名与类名相同,必须存在于public中 构造函数可以重载 不用来初始化static数据成员,因为static数据成员不属于类默认构造函数(合成的构造函数)如果没有在类中给出构造函数,编译器自动生成一个默认的构造函数(无参数、函数体为空) 当在类中手动给出构造函数时,默认的构...原创 2019-03-28 12:44:58 · 777 阅读 · 0 评论 -
C++:07---this指针
1.概念:this指针是成员函数的一个隐式参数,在类中本质上就是对象的指针(常量指针) 2.特点: 在成员函数中可通过this指针区别成员变量与形参变量 this可以显示调用 3.示例代码:class Cperson{private: int age; float height;public: void InitPerson(int age,floa...原创 2019-03-28 12:46:23 · 585 阅读 · 0 评论 -
C++:08---成员变量初始化方式
成员变量初始化有三种方式:在构造函数体内赋值初始化 在自定义的公有函数体中赋值初始化(一般用于成员变量的初始化) 在构造函数的成员初始化列表初始化一、构造函数体内初始化说明:在构造函数体内的初始化方式,本质是是为成员变量赋值,而不是真正意义上的初始化,这点要特别注意!(下面介绍成员初始化列表时会有演示案例对比说明)class Cperson{private: int ...原创 2019-03-28 12:48:14 · 1689 阅读 · 0 评论 -
C++:09---拷贝构造函数
一、概念使用一个已经存在的对象,去构造(初始化)另一个对象二、格式参数加上const&,因为拷贝构造函数在几种情况下都会被隐式地使用,因此拷贝构造函数不应该是explict的 const:防止函数内部修改值 &:防止无限循环拷贝 类名(类名 const& 参数名){ 函数体}三、拷贝构造函数的分类浅拷贝:成员变量无动态内存(指针等...原创 2019-03-28 12:50:06 · 1075 阅读 · 0 评论 -
C++:10---类静态成员(static)、类常量成员(const)
一、类静态成员(static)什么是静态变量、静态函数在介绍类静态成员之前,先介绍一下静态变量、静态函数静态局部变量:存在域(全局数据区),作用域(块作用域) 静态全局变量:存在域(全局数据区),作用域(整个文件) 静态函数:存在域(全局数据区),作用域(整个文件)static int a=10;//全局静态变量static void add();//静态函数int ma...原创 2019-03-28 12:52:28 · 1525 阅读 · 0 评论 -
C++:11---friend友元(友元函数、友元类)
一、友元(friend)1.概念:通过友元,打破了类的封装性,可以访问类内的所有成员2.分类:友元函数、友元类二、友元函数概念:友元函数是一个普通函数,不属于类,但需要在类内表明友元关系 友元函数可访问类内所有成员,但类不可以访问友元函数内部数据格式:友元函数可以在类内声明时,需要加上关键字friend 友元函数可以在类外声明,类外定义。需要加上关键字friend...原创 2019-03-28 12:53:33 · 1261 阅读 · 0 评论 -
C++:12---运算符重载(operator)
一、概念对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 重载的运算符是具有特殊名字的函数,该函数也有返回值、参数列表、函数体二、运算符重载的3种实现方式成员函数:私有、公有、保护都可以 友元函数:同上 全局函数:只能访问公有的三、运算符重载的规则以下运算符不支持重载:.(类属运算符),::(作用域运算符),sizeof,?:(三目运算符),#(预处理...原创 2019-03-28 12:54:20 · 1062 阅读 · 0 评论 -
C++:14---多级混合继承、虚基类详解
一、多级混合继承下面介绍菱形继承//菱形继承class A{public: int data;};class B:public A{public: int data;};class C:public A{public: int data;};class D:public B,public C{public: int data;...原创 2019-03-29 10:32:42 · 768 阅读 · 0 评论 -
C++:15---虚函数与多态
二、虚函数表1.概念:是一块连续的内存,所有虚函数的首地址都存放在虚函数表中,其大小为4字节2.注意只有类中有虚函数时,才有虚函数表 父子类之间的虚函数表是不同的地址,且虚函数表中的虚函数的首地址也不同class A{public: virtual void run1(){}; virtual void run2(){};};class A:public ...原创 2019-03-29 10:34:53 · 434 阅读 · 0 评论 -
C++:16---异常机制(throw、try、catch)
异常处理机制1.概念:异常处理是一种允许两个独立开发的程序组件在程序执行时遇到不正常的情况相互通信的工具 2.异常检测和异常处理的方式 throw表达式:程序遇到了错误或者无法处理的问题,使用throw引发异常 try、catch语句块:以关键字tyr开始,并以一个或多个catch子句结束。它们也被称为异常处理代码 一、throw1.概念:程序的异常检测部分使用throw表达式...原创 2019-03-29 10:38:26 · 2374 阅读 · 3 评论 -
C++:17---C++数据类型
一、一些特殊的类型char 字符 8位 wchar_t 宽字符 16位 char16_t Unicode字符 16位 char32_t Unicode字符 32位 二、前缀与后缀 前缀 u Unicode16字符 ...原创 2019-03-29 11:48:32 · 677 阅读 · 0 评论 -
C++:18---强制类型转换(static_cast、const_cast、dynamic_cast、reinterpret_cast)
cast-name可以是:static_cast、const_cast、dynamic_cast、reinterpret_cast一、static_cast二、const_cast三、reinterpret_cast原创 2019-04-10 17:13:36 · 1218 阅读 · 0 评论 -
C++:19---sizeof运算符
功能:以字节位单位,返回一个表达式或一个数据类型所占的字节数 返回值类型:是size_t类型 sizeof有无括号: sizeof不加括号,后面不可以直接跟数据类型 sizeof加括号,后面既可以跟表达式也可以跟数据类型 注意事项 对引用类型执行sizeof运算得到被引用对象所占空间的大小 对指针执行sizeof运算得到指针本身所占空间大小 对解引用指针执行sizeof运...原创 2019-04-10 17:13:40 · 507208 阅读 · 1 评论 -
C++:20---const关键字(附常量指针、指针常量、常量指针常量)
一、const变量的一些基本特点①const修饰的变量不能被修改const int a=10;a=20;//错误②因为const修饰的变量不能被修改,所以必须被初始化int a=10;const int b=a; //正确const int c=10; //正确③const修饰的变量可以赋值给其他值const int a=10;int b=a;//正确④可以有...原创 2019-06-13 12:55:44 · 1016 阅读 · 0 评论 -
C++:21---函数概述(附加:initializer_list、尾置返回类型、decltype声明函数返回类型)
一、一维数组传参当我们为函数传递一个数组时,实际上传递的是数组的首指针下面三个函数参数都可以用来传递一个一维数组void func1(int *arr);//既可以传递数组也可以传递变量void func2(int arr[]);//显式表示传递一个数组void func3(int arr[3]);//显式表示传递一个数组,数组维度为3.但是取决于实际调用int main(...原创 2019-06-14 13:36:10 · 1394 阅读 · 1 评论 -
C++:22---函数指针
一、格式指针名前*号,并且将*和指针名用括号括起来例如://指针名为pf,指向一个返回值为bool,参数为两个const string&的函数bool (*pf)(const string&, const string&);//这个不是函数指针,而是一个返回值为bool*的pf函数bool *pf(const string&, const st...原创 2019-06-15 14:47:05 · 839 阅读 · 0 评论 -
C++:23---函数模板(template)
一、模板的定义template<typename T> 以关键字template开头,后面跟一个模板参数列表,列表里面用逗号将多个模板参数隔开定义的注意事项模板的编译当编译器遇到一个模板定义时,并不生成代码。只有当实例化处模板的一个特定版本时,编译器才会生成代码 重点:通常,当我们调用一个函数/定义实例化一个类时,编译器只需掌握函数的声明/类的声明即可,因此可以把函数/...原创 2019-06-15 22:36:14 · 987 阅读 · 4 评论 -
C++:24---类模板(template)
一、类模板与模板类类模板:一个模板(是模板) 模板类:调用类模板生成的类对象(是类实体),也称为类模板的实例化类模板的定义:与函数模板的定义是一样的template <typename T>class Blob{public: Blob(); Blob(std::initializer_list<T> i);};模板类的使用:...原创 2019-06-16 15:59:41 · 1047 阅读 · 0 评论 -
C++:25---模板的其它用法(template)
一、使用typedef为模板类型取别名概念:与其他类型一样,我们可以定义一个typedef来引用实例化的类提示:由于模板不是一个类型,所以不能用typedef引用一个模板,在typedef时必须给出特定的类型typedef Blob<string> StrBlob; //正确 typedef Blob<T> StrBlob; //错误演示案例t...原创 2019-06-16 17:04:39 · 604 阅读 · 0 评论 -
C++:26---算术、关系、逻辑运算模板(functional头文件)
一、functional头文件包含的对象二、使用场景标准库定义了一组表示算术运算符、关系运算符、逻辑运算符的类,每个类分别定义了一个执行命名操作的调用运算符 这些类都被定义成模板的形式,我们可以为其制定具体的应用类型例如:plus类:定义了一个函数调用运算符用于对一对运算对象执行“+”操作 modulus类:定义了一个调用运算符执行二元的“%”操作 negate类:对数取...原创 2019-07-09 12:31:11 · 1079 阅读 · 0 评论 -
C++:27---function模板(functional头文件)
引入在介绍function之前,先介绍下面的知识有时,不同类型的对象可能共享同一种调用形式例如下面的三种类型,都共享同一种调用形式:int(int,int);int add(int i, int j) { return i + j; }auto mod = [](int i, int j) {return i * j; };struct divide{ int o...原创 2019-07-09 13:06:26 · 5165 阅读 · 0 评论 -
C++:28---类类型转换之类型转换运算符operator(explicit)
一、概念类类型转换运算符是类的一种特殊成员函数,它负责将一个类转换为其他类型类定义了类类型转换函数之后,就可以隐式地与指定的operator类型进行操作与类的隐式类型转换(转换构造函数)的不同:类的隐式类型转换:是将其他类型转换为类类型 类型转换运算符:将类类型转换为其他类型二、格式与注意事项类型转换函数的形式:type表示某种类型 类型转换运算符可以面向任意类...原创 2019-07-09 14:28:14 · 4714 阅读 · 0 评论 -
C++:29---类类型转换之隐式转换(转换构造函数、explicit、static_cast)
一、概念概念:如果一个类的构造函数只有一个参数,这个参数所指的类型所定义的变量/对象可以隐式转换为该类 隐式转换之时,就相当于对该对象执行了一次构造函数 转换构造函数:我们把上面这种构造函数称为“转换构造函数”与类型转换运算符operator的不同类型转换运算符operator是将类转换为其他类型 转换构造函数是将一个其他类型转换为类类型二、演示案例下面的构造函数中,...原创 2019-07-09 14:28:25 · 824 阅读 · 0 评论 -
C++:33---动态内存管理new、delete
相对于智能指针,这两个运算符管理内存非常容易出错一、new关键字new用来在内存中分配一块内存,new分配的对象是没有名称的,而是返回一个指向该对象的指针int *p1=new int(1); //pi指向一个动态分配的、初始化值为1的无名对象int *p2(new int(1)); //同上二、new的值初始化规则通用规则:如果类型名后无括号:内置类型或组合类型的...原创 2019-07-13 08:44:23 · 687 阅读 · 0 评论 -
C++:34---动态数组(new)
一、动态数组的定义数组的维度可以为常量、也可以为一个函数的返回值int size(){ return 3;}const int length = 3;int *p1 = new int[size()]{1,2,3};int *p2 = new int[length];int *p3 = new int[3];使用typedef为数组类型取别名typedef i...原创 2019-07-13 08:44:28 · 4045 阅读 · 0 评论 -
C++:35---动态内存allocator类
引言:在介绍allocator之前,先看一下下面的案例new表达式分配了50个string。但是我们可能没有使用到50个string。但是那些没有被使用到的string也被初始化了并且申请了内存空间,这样就造成了内存的浪费string *const p = new string[50];string s;string *q = p;while (cin >> s ...原创 2019-07-13 13:49:31 · 1779 阅读 · 0 评论 -
C++:36---聚合类
一、概念聚合类使得用户可以直接访问其成员,并且具有特殊的初始化语法二、聚合类的条件当类满足一下所有条件时,才是聚合类:所有成员都是public 没有定义任何构造函数 没有类内初始值 没有基类,也没有virtual函数struct Data { int ival; string s;};class Cperson{public: int i...原创 2019-07-13 14:35:00 · 1270 阅读 · 2 评论 -
C++:37---字面值常量类(constexpr构造函数)
constexpr函数:https://blog.youkuaiyun.com/qq_41453285/article/details/91946622一、字面值常量类简介数据成员都是字面值类型的聚合类叫做“字面值常量类”二、字面值常量类的条件如果一个类不是聚合类,并且符合下述要求,则是一个字面值常量类数据成员都必须是字面值类型 类必须至少含有一个constexpr构造函数 如果一个数据...原创 2019-07-13 14:50:35 · 2052 阅读 · 4 评论 -
C++:38---泛型算法之只读算法、写算法、重排元素算法(algorithm、numeric)
本文包括的算法有: 只读算法:find()、count()、accumulate()、equal() 写算法:fill()、fill_n()、back_inserter()、copy()、copy_backward()、replace()、replace_copy()、next_permutation()、prev_permutation() 重排元素算法:sort()、stabl...原创 2019-07-16 11:27:36 · 707 阅读 · 0 评论 -
C++:39---泛型算法之算法的定制操作(向算法传递函数、lambad表达式、参数绑定(bind()、placeholders命名空间、ref()、cref()))
前言何时会用到该函数 本文章与算法的调用函数和lambda有关:https://blog.youkuaiyun.com/qq_41453285/article/details/96005305一、bind函数二、绑定check_size的sz参数三、使用placeholders名字四、bind的参数五、用bind重排参数顺序六、绑定引用参数...原创 2019-07-16 14:15:41 · 895 阅读 · 0 评论 -
C++:40---泛型算法之算法结构(5类迭代器、算法形参模式、算法命名规范)
待续原创 2019-07-16 14:20:00 · 672 阅读 · 0 评论 -
C++:42---数学算法库math.h
一、介绍math.h头文件中声明了常用的一些数学运算,比如乘方,开方运算等等二、使用要求头文件#include <math.h> 命名空间:std三、注意事项 没有现成的cot三角函数,可以使用tan(PI/2-x)来实现 double atan2(double y,double x);取值范围在(PI,PI)之间;这是一个不太常见的函数,主要用来返回y/...原创 2019-12-09 12:51:21 · 1496 阅读 · 1 评论 -
C++:43---placement new(定位new)
一、什么是placement newplacement new就是在用户指定的内存位置上(这个内存是已经预先分配好的)构建新的对象,因此这个构建过程不需要额外分配内存,只需要调用对象的构造函数在该内存位置上构造对象即可 语法格式: address:placement new所指定的内存地址 ClassConstruct:对象的构造函数 Object * p = new (addr...原创 2019-12-15 16:41:22 · 9322 阅读 · 3 评论