
基础
c++基础知识
Crystal_Coding
这个作者很懒,什么都没留下…
展开
-
函数指针和指针函数
函数指针(指向函数的指针)函数指针本质上是一个指针,这个指针指向一个函数,指针保存的是函数的地址(即函数名)int fun(int x, int y){ return x + y;}int (*p)(int, int);//最左面的int表示函数的返回类型,最右面括号里面的两个int表示函数的参数类型p = fun;指针函数指针函数本质上是一个函数,这个函数的返回值是一个指针int * fun(int x, int y)参考链接:https://blog.youkuaiyun.com/luoy原创 2020-09-13 19:50:39 · 262 阅读 · 0 评论 -
C++ STL
写在前面容器的分类:序列式(元素可排序):array,vector,heap,priority-queue,list,deque,stack,queue关系型:RB-tree(非公开),set, map, multiset,multimap,hashtable,hash_set,hash_map,hash_multiset,hash_multimap1.1 vectorvevtor是...原创 2020-09-03 20:24:34 · 130 阅读 · 0 评论 -
C++读取连续数据,以回车结束
参考:点击链接#include<bits/stdc++.h>using namespace std;int main(){ int a; vector<int> nums; while(cin >> a){ nums.push_back(a); char c = cin.get(); if(c == '\n') break; } return 0;}转载 2020-08-24 10:39:15 · 840 阅读 · 0 评论 -
深拷贝和浅拷贝
文章目录写在前面区别:总结:写在前面类中默认的拷贝构造函数都是浅拷贝,对于数据成员中没有指针的情况下,浅拷贝是ok的;但是数据成员中有指针时,如果采用浅拷贝,则两类中的两个指针将指向同一个地址,当对对象进行析构时,会对指针所指向的空间释放两次,导致指针悬挂(指针指向无效的地址空间),所以必须采用深拷贝区别:深拷贝:会在堆内存中另外申请空间来存储数据,从而解决了指针悬挂问题浅拷贝:数据成员的简单赋值总结:在对对象进行拷贝时,当对象中包含其他资源的引用,如果需要拷贝这个对象所引用的对象,就是深原创 2020-06-27 15:53:19 · 378 阅读 · 0 评论 -
Effective C++第七章模板与泛型编程 条款41-条款48
文章目录条款41.了解隐式接口与编译期多态条款42.了解typename 的双重意义条款43.学习处理模板化基类内的名称条款44.将与参数无关的代码抽离templates条款41.了解隐式接口与编译期多态面向对象的三大特性之一多态是指的运行期多态,在程序运行期间确定对象调用哪一个虚函数。编译期多态是对于模板参数而言,通过模板具现化和函数重载解析实现,以不同的模板参数具现化导致调用不同的函数。像我们在类中定义的成员函数都是显示接口,而对于模板参数而言,接口是隐式的,以有效的表达式为基础。总结:类原创 2020-05-28 17:26:48 · 234 阅读 · 0 评论 -
Effective C++ 第六章 继承与面向对象设计 条款32-条款40
文章目录条款32.确定你的public继承塑模出is-a关系条款33.避免遮掩继承而来的名称条款34.区分接口继承和实现继承条款32.确定你的public继承塑模出is-a关系public继承:意味着 is - a 。适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived class对象也都是base class对象。条款33.避免遮掩继承而来的名称派生类内的名称会遮掩基类中的名称,为了防止基类的名称被遮掩,可以使用using声明式或原创 2020-05-24 16:41:46 · 269 阅读 · 0 评论 -
Effective C++第五章 实现 条款26-条款31
文章目录条款26.尽可能延后变量定义式出现的时间条款27.尽量少做转型动作条款28.避免返回handles(引用、指针、迭代器)指向对象内部成分条款26.尽可能延后变量定义式出现的时间不到迫不得已时,不定义变量。上述代码的问题:如果上述函数体内部抛出了异常,那么定义的字符串变量没有任何的作用,白白消耗构造和析构的时间改进版本:注意定义变量的位置,以及在定义变量的同时进行初始化(以避免默认构造函数的调用,具体见:条款4)条款27.尽量少做转型动作旧式转型:新式转型:总结:尽量原创 2020-05-19 18:12:42 · 437 阅读 · 0 评论 -
Effective C++ 设计与声明 条款18 -条款25
文章目录条款18.让接口容易被使用不易被误用条款19.设计class犹如设计type条款18.让接口容易被使用不易被误用阻止接口被误用的方法:建立新的类型、限制新类型上的操作、束缚对象的值(在自己定义的类型的方法尽量和内置的类型保持一致)以及消除客户资源管理的责任(不要指望客户释放动态申请的资源空间,将该资源管理的责任交给对象处理“条款13”)对于上述日期类,在定义该类的对象时,很容易出现传入的参数不合理,例如:解决方法1:定义新类型解决方法2:限制新类型上的操作:shared_原创 2020-05-15 17:14:17 · 313 阅读 · 0 评论 -
Effective C++ 第三章 资源管理 条款13-17
文章目录条款13.以对象管理资源条款14.在资源管理类中小心copying行为条款15.在资源管理类中提供对原始资源的访问条款13.以对象管理资源条款13主要涉及到资源泄露的问题,以对象管理资源是说:“资源取得的时机便是初始化时机”(Resource Acquisition Is Initialization; RAII),析构函数自动调用机制确保资源被释放。也就是说在获得一笔资源后在同一语句内让它初始化某个管理对象,该管理对象运用析构函数确保资源被释放。分析以上程序的问题:如果在省略号的部分原创 2020-05-11 16:27:12 · 254 阅读 · 0 评论 -
Effective C++ 构造/析构/赋值 条款5-12
文章目录条款5.了解C++默默编写并调用了哪些函数条款6.若不想使用编译器自动生成的函数,就要明确的拒绝条款7.为多态基类声明virtual析构函数条款8.别让异常逃离析构函数(避免异常传播)条款5.了解C++默默编写并调用了哪些函数当定义一个类时,编译器会为该类默认生成默认(default)构造函数、拷贝(copy)构造函数、析构函数以及赋值(copy assignment)函数但是如果...原创 2020-05-08 16:37:33 · 206 阅读 · 0 评论 -
C++派生类构造函数和析构函数的调用顺序
派生类构造函数的调用顺序:基类的构造函数(如果有多个基类,按照基类的声明顺序来构造,声明顺序也就是class C:冒号后面这个顺序);该派生类的成员变量的声明顺序;该派生类自身的构造函数派生类析构的顺序:其实就是构造的逆序。#include <bits/stdc++.h>using namespace std;class B1 { public: B1(int...原创 2020-05-08 15:07:17 · 934 阅读 · 0 评论 -
Effective C++ 条款01~04
文章目录条款1:视c++为一个语言联邦条款2:尽量以const,enum,inline替换#define条款1:视c++为一个语言联邦CObject-Oriented C++ :类Template C++ :C++的泛型编程STL说明:对于内置类型而言,值传递(pass-by-value)比引用(pass-by-reference)传递高效;但是对于自定义的类型,由于构造函数和析构...原创 2020-05-06 17:39:24 · 277 阅读 · 0 评论 -
STL中的sort()算法原理
文章目录写在前面sort()算法总结写在前面Q:什么容器适合sort()算法?A:vector, deque关系型容器的底层采用红黑树,具有自动排序的功能,不需用sort()算法序列式容器中的stack,queue,priority_queue都有特别的出入口,不允许对元素进行排序;list的迭代器属于BidirectionIterator(双向迭代器),而sort算法的迭代器属于Ra...原创 2020-05-04 17:34:14 · 1041 阅读 · 0 评论 -
STL面试总结
文章目录1.STL六大组件2.空间配置器1.STL六大组件容器:各种数据结构,从实现的角度来看,STL容器是一种class template空间配置器:负责动态空间的配置和管理迭代器:在23个设计模式中,有一种是迭代器模式(提供一种方法,使之能够依序访问某个容器所含的各个元素,而无需暴露该容器的内部表述方式);STL的设计中,将数据容器和算法分开,彼此独立设计,通过迭代器(容...原创 2020-04-30 17:31:49 · 748 阅读 · 0 评论 -
C++ 定义类 class 和 struct 关键字
文章目录写在前面区别写在前面struct、class关键字都可以定义类区别struct、class关键字默认访问权限不一样struct中成员默认是publicclass中成员默认是private...原创 2020-04-21 15:51:55 · 939 阅读 · 0 评论 -
C++ 多继承
写在前面在腾讯面试时,面试官问:C++里面子类可以继承多个父类吗?(可以)子类如果继承多个父类需要注意什么问题?(有点不知从何答起)父类A,父类B,子类C继承父类A和父类B,父类A和父类B中有都有函数fun,在子类C中如何处理?多继承多继承是指从多个直接基类中产生派生类,多继承的派生类继承了所有父类的成员。多继承容易出现的问题: 命名冲突(成员变量名、成员函数名)类A派生出类...原创 2020-04-15 16:35:05 · 861 阅读 · 0 评论 -
C++11新特性
auto关键字根据表达式的值的类型来推断变量的类型auto在一条语句中可以声明多个变量,但是变量的类型必须是一致的,就好像double后面可以声明、定义多个double类型的变量,其后的变量都是double类型当引用作为auto对象的初值时,auto会忽略掉引用,而直接推断出引用对象的类型auto会忽略掉顶层const,而保留底层const如果需要推断出顶层const,需要明确指出将...原创 2020-04-14 10:40:31 · 290 阅读 · 2 评论 -
c++函数指针
文章目录函数指针用类型别名来定义函数指针函数的返回类型:指向函数的指针函数指针指向函数的指针,指针指向的是函数而不是对象,所指向的函数的类型由函数的返回类型和参数列表共同确定,与函数名无关。定义: 用指针替换函数名即可bool lengthCompare(const string &str1, const string &str2);//定义指向参数列表的类型为两个常量字...原创 2020-04-13 11:28:02 · 113 阅读 · 0 评论 -
c++ 类型别名 typedef using
文章目录类型别名typedef关键字 定义类型别名别名声明(using) 定义类型别名特别注意类型别名某种类型的同义词,使用类型别名可以使复杂的类型名变得简单易使用。说明:一般情况下,理解类型别名所定义的对象的类型时,可以将类型别名直接替换成它原有的类型,但是在定义指针的类型别名时,特别是用该类型别名定义常量时,不能按照替换为原有类型的方式来理解对象的类型定义类型别名的方法:关键字:...原创 2020-04-13 10:39:57 · 345 阅读 · 0 评论 -
C++中常用的设计模式
写在前面工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式工厂模式简单工厂模式用一个工厂类来根据输入的条件实例化不同的类,然后根据类中相应的虚函数得到不同的结果。(工厂来生产产品,产品的生产过程全部保存在工厂中,想生产产品时,只需调用工厂类以及了解生产产品的材料(基类)就行)优点:新添加类时,不会影响之前创建的类,需要修改下工厂类缺点:客户端必须要知道基类和工厂类,耦合性差...原创 2020-04-12 16:01:13 · 2295 阅读 · 0 评论 -
C++右值引用
写在前面对象的移动和拷贝对于那些对象拷贝到另一个对象中后,就销毁的对象,采用移动的方式,会大幅度提升程序的性能。标准库容器、string、shared_ptr既支持 移动 也支持 拷贝,IO类、unique_ptr仅支持移动,不支持拷贝右值引用就是为了支持移动操作而产生的右值引用右值引用:必须绑定到右值的引用,将常规的引用称为左值引用左值引用:不能绑定到要求转换的表达式、字...原创 2020-04-08 14:34:21 · 183 阅读 · 0 评论 -
C++四种类型的转换方式
写在前面参考:链接static_castconst_castreinterpret_castdynamic_caststatic_cast用于内置类型的转换,以及有继承关系的类之间的转换。说明:基类和派生类之间进行转换时向上转换:派生类向基类进行转换向下转换:基类向派生类进行转换#include<bits/stdc++.h>using namespac...原创 2020-04-04 10:47:04 · 292 阅读 · 0 评论 -
C++ 虚函数 从入门到精通
写在前面在面向对象的程序设计中为什么会出现虚函数这个说法呢?万物究其本源:1.面向对象的三大特征:封装:类继承多态:动态绑定,当使用基类的引用(或者指针)对象调用一个虚函数时,将发生动态绑定,会根据对象本身的类型调用对应的函数2.虚函数是在继承这一特征上出现的继承指的是基类和派生类的层次关系,派生类可以直接或间接的继承基类。基类:定义在层次关系中,所有类共同拥有的数据成员...原创 2020-04-03 18:03:08 · 268 阅读 · 0 评论 -
C++ 基类与派生类 的详细说明
基类:派生类:1.派生类到基类的类型转换可以把派生类的对象当成基类的对象使用可以将基类的指针或者引用绑定到派生类对象的基类部分(派生类到基类的类型转换)2.派生类的构造函数派生类的构造函数:每个类控制自己的成员初始化的过程,在这里派生类中的构造函数调用了基类的构造函数3.静态成员的继承静态成员的继承:如果基类中定义了静态成员,则在整个继承体系中只存在该成员的唯一定...原创 2020-04-02 15:28:36 · 2034 阅读 · 0 评论 -
c++中 public protected private
参考:链接转载 2020-04-02 14:38:20 · 148 阅读 · 0 评论 -
c++ =default
=default 的作用在类中定义默认的构造函数,=default可以和声明一起出现在类的内部(默认构造函数是内联的),也可以作为定义出现在函数的外部(不是内联的)内联函数内联函数的作用:避免了在函数调用时一系列的保存寄存器、拷贝实参等的操作,避免了函数调用的开销,提高了程序的执行效率,而是在调用点上内联的展开,函数定义:将函数定义成内联函数形式:在返回值前加上inline关键字...原创 2020-04-02 11:35:06 · 2373 阅读 · 0 评论 -
c++内联函数
内联函数内联函数的作用:避免了在函数调用时一系列的保存寄存器、拷贝实参等的操作,避免了函数调用的开销,提高了程序的执行效率,而是在调用点上内联的展开,函数定义:将函数定义成内联函数形式:在返回值前加上inline关键字...原创 2020-04-02 11:33:04 · 112 阅读 · 0 评论 -
C++ static, const, static const 关键字的区别和练习
cosnt关键字:参考链接static关键字:参考链接static const 关键字和static , const的区别说明:static const 修饰的变量和 const static修饰的变量是一样的,不区分static 和 const 的先后顺序1.所修饰变量的保存区域static 所修饰的变量与类本身有关系与类的对象没有惯量,保存在静态区,程序在编译时就进行初始化,编译...原创 2020-04-01 15:35:00 · 1047 阅读 · 1 评论 -
C++const关键字
写在前面在程序中,我们想定义一个变量,但同时想在程序执行的过程中,使用到该变量的地方不希望改变该变量的值,那么我们可以将变量定义成:const int a = 10;//常量int i = a;//正确,并没有改变该变量的值const int b = i;//正确说明:在定义常量时,必须对其初始化。常量和普通变量唯一的区别就在于:只能在const类型的变量上执行不改变其内容的操作。c...原创 2020-04-01 10:35:35 · 213 阅读 · 0 评论 -
C++智能指针
写在前面C++中的对象生命周期生命周期:程序执行时,对象存在的一段时间全局对象:生命周期从程序开始启动时分配,在程序执行结束是销毁局部自动对象:生命周期从进入其所在的程序块时开始,在离开程序块时销毁。(自动对象:只存在于块执行期间的对象)局部static对象:生命周期从第一次使用前进行分配,在程序结束时销毁,该局部静态的生命周期贯穿于函数执行结束后的一段时间。说明:如果局部静态对象定...原创 2020-03-30 15:06:38 · 326 阅读 · 0 评论 -
C++ static关键字
用处局部静态变量:将局部变量定义成局部静态变量的目的是:让该变量的生存周期能够保存到程序块执行结束后的一段时间比较经典的一个例子是:在函数fun中定义了一个静态局部变量,只有在第一次调用时初始化,之后再进行调用时,使用之前的结果,并不进行初始化#include<bits/stdc++.h>using namespace std;int fun(){ stati...原创 2020-03-28 17:35:37 · 167 阅读 · 0 评论 -
IO流
通过IO流来实现文件的读写1.输出流原创 2020-01-14 16:56:43 · 109 阅读 · 0 评论 -
泛型程序设计,STL标准模板库
泛型程序:将程序从特定的数据结构中抽象出来,可扩展性非常好迭代器,适配器1.泛型程序设计概念:具有一定功能的数据类型模型:符合一个概念的数据类型2.STL标准模板库(Standard Template Library)3.迭代器:迭代容器中的元素4.容器逆向迭代器:rbegin():将容器的尾作为头逆向来用,指向的是容器的尾,遍历...原创 2020-01-12 21:32:16 · 290 阅读 · 0 评论 -
类模板
模板:函数模板、类模板,将数据类型抽象出来,使之能够处理不同的数据类型的数据1.模板如果对于该类型的数据不能进行相应的运算,比如,自定义的日期类型,有定义好的两数相加的sum模板函数,但是日期类型不支持加法运算。那么如果想对日期类型的数据调用sum函数进行加法运算,需要先在日期类里面进行重载加法运算,再来调用该函数进行处理。类模板3.线性群体直接访问线性群体:数...原创 2020-01-11 17:30:12 · 142 阅读 · 0 评论 -
多态性
1.运算符重载两种情况:将运算符重载为类的成员函数、非成员函数单目运算符的重载:前置++返回的是一个左值(引用),后置++返回的是一个右值(一个副本)。后置++用括号中传一个参数来标识,但是在主函数调用的时候,并不给该函数传参运算符重载为非成员函数:上述将输出运算符“<<”重载为级联的输出,输出完相应的结果后又将传来的参数out返回...原创 2020-01-09 11:23:46 · 191 阅读 · 0 评论 -
C++进阶——类的继承
继承与派生继承的目的:尽可能的重用原有的类,实现设计与代码的重用派生的目的:原有的类不能满足要求,需要对原有的类进行改造单继承:有一个原有的基类派生类的成员:吸收原有基类的成员、改造基类的成员、新增类的成员2.继承方式公有继承、私有继承、保护继承实例:公有继承实例:私有继承3.基类与派生类之间的类型转换上述main中三个fun调用都是调...原创 2020-01-08 10:14:43 · 232 阅读 · 0 评论 -
C++进阶笔记——指针、数组、动态内存分配、深层复制、构造复制、字符串
1.指针数组与二维数组的区别:指针数组不是按行进行存放的,二维数组是按行存放的,二维数组存放完第一行紧接着存放第二行,但是指针数组的每一行存放的时候并不是连续的,如下图所示:指针数组与二维数组的定义:int num1[]={1,2,3};int num2[]={4,5,6,7};int num3[]={8,9,10,2,3};//定义长度为3的指针数组,数组的元素是一维数组首元素的地...原创 2020-01-07 15:28:56 · 1007 阅读 · 0 评论