C++学习笔记
文章平均质量分 65
Leanne.T. N.
懒得写
展开
-
C++语言学习记录-33:容器与迭代器
容器C++提供了一些自然、通用的容器,这些容器能够容纳用户定义的类型,并提供各种操作,而不需要强制用户定义的类型具有某种结构。例如向量、链表、队列都属于容器。这些容器提供的操作不依赖容器包含的类型迭代器迭代器是一种检查容器内的元素并遍历元素的数据类型,标准库为每一种标准容器定义了一种迭代器类型,迭代器类型提供了比下标操作更通用化的方法:所有标注库容器都定义了相应的迭代器类型。迭代器主要分为五类:输入迭代器输出迭代器前向迭代器双向迭代器随机存取迭代器顺序容器向量向量属于顺序容器,用原创 2021-02-26 21:45:14 · 211 阅读 · 0 评论 -
C++语言学习记录-33:类型的识别与转换
类型识别类型识别指的是只有一个指向基类的指针或引用时,确定一个对象的准确类型。运行时类型识别机制提供了很大的灵活性,但是需要付出一定的效率。在大多数情况下,派生类的特殊性可通过在基类中定义虚函数加以体现,运行时类型检查只是一种辅助性手段运行时的类型识别C++是一种静态类型语言,其数据类型是在编译的时候就确定的,运行过程中不会发生更改,然而由于面向对象的多态性的要求,C++中的指针或引用本身的类型,可能与它实际代表、指向或引用的类型不一致,往往需要将一个多态指针转换为其实际指向对象的类型,这就需要在运原创 2021-02-25 16:12:58 · 165 阅读 · 0 评论 -
C++语言学习记录-32:模板
模板的作用C++中,模板的作用就是实现代码的重用,通过将某种数据类型定义为参数,然后将不同的数据类型按照实参形式传送而实现代码重用比如如下的程序int min(int x, int y){return (x<y)? x:y;} float min(float x, float y) {return (x<y)? x:y;} double min(double x, double y) {return (x<y)?x:y;}在以上的例子中,同样的功能和标识符的函数,原创 2021-02-23 23:10:51 · 159 阅读 · 0 评论 -
C++语言学习记录-31:异常处理
异常处理是一种错误处理机制,提高了C++程序的安全性,在团队开发过程中,可以通过异常处理机制降低产生错误的可能性,从而提高程序的可靠性。异常处理机制C++中异常往往使用类进行实现,以栈满或空的异常为例class popOnEmtpy{/*内部为检测栈空的程序*/};class pushOnFull{/*内部为检测栈满的程序*/};template<typename T> void Stack<T>::Push(const T&data){ if(IsFull()原创 2021-02-22 17:31:31 · 160 阅读 · 0 评论 -
C++语言学习记录:文件相关的几个问题补充
get() 和getline()cin.getline()和cin.get()都是对输入进行行的读取,即一次读取一整行而不是单个字符,但是二者仍然有一定区别cin.get()每次读取一整行并把由enter生成的换行符留在输入队列中,而cin.getline()每次会读取一整行,但是会将enter生成的换行符抛弃缓存同步的实现对文件流进行操作时,他们与一个streambuf类型的缓存联系在一起,而这个缓存实际上是一块内存空间,作为流和物理文件的媒介例如一个输出流中,每一次一个成员函数put被调用(即原创 2021-02-09 15:57:29 · 93 阅读 · 0 评论 -
C++语言学习记录-30:使用ifstream中的几个成员函数
get()函数get函数的作用是读取该类的对象的一个字符并且将该值作为调用函数的返回值。调用get函数时,get函数会自动向后读取下一个字符,直到遇到文件结束符,则返回EOF作为函数的结束#include<iostream>using namespace std;#include<string>#include<fstream>int main(){ ifstream infile; char value; infile.open("a.txt");原创 2021-02-08 16:46:33 · 801 阅读 · 0 评论 -
C++语言学习记录-29:文件处理
C++中文件的基本概念C++中,文件可以被看做是一个连续的字符串集合,这个字符串集合没有大小。C++中,字符串是以流的形式存在的,因此,文件也可以看做是一个流的集合,被称为流式文件,增加了文件处理的灵活性。C++对文件的操作可以概括为以下几个步骤:1.建立文件流对象2.打开或建立文件3.进行读写操作4.关闭文件对于文件进行I/O操作的流类主要有fstream(输入输出文件流)ifstream(输入文件流)ofstream(输出文件流),这三个类都包含在头文件fstream中。若ifstrea原创 2021-02-08 15:28:38 · 136 阅读 · 0 评论 -
C++语言学习记录-28:静态成员
静态成员使用静态成员的目的是为了实现数据之间的共享,使用全局变量可以实现数据共享,但是全局变量具有其局限性,因此主要通过使用类的静态成员进行数据的共享。静态数据成员在类中的静态成员可以实现多个该类的对象之间的数据共享,在实现共享的同时还保证了数据的安全性,不会被外部成员访问.因此,一个类的静态成员是所有该类的对象的成员,而不是具体某一对象独有的成员。使用静态成员函数的另一个好处是节约内存空间,对于同一个类的多个对象来说,静态数据成员是所有类的对象所共有的,储存在固定的内存空间中,供所有类的对象共同使原创 2021-01-25 20:46:50 · 194 阅读 · 0 评论 -
C++语言学习记录-27:虚函数和抽象类
虚函数在函数定义之前加上关键字virtual的函数被称为虚函数。虚函数是实现多态性的手段之一,也就是虽然它有一样的声明,但是具体下到不同的类当中,实现的方法又有所差别下面通过一个实例来理解虚函数#include<iostream>using namespace std;class base{public: virtual void vfunc() { cout << "This is base's vfunc" << endl; }};cla原创 2021-01-18 16:02:18 · 273 阅读 · 0 评论 -
C++语言学习记录补充:二维数组和二级指针之间的关系
利用指针访问二维数组数组名本身就具有指针的性质,因此我们在前面就知道实际上可以使用数组名当做地址使用,比如以下代码:int a[100];cout<<*(a+1);实际上,本程序会输出数组第二位即1号位置上的数值,星号是一个指针运算符,用于将地址转换为相对应的值。这样的性质也可以在二维数组甚至是多维数组中使用,比如:#include<iostream>#include<cstring>using namespace std;int main(){原创 2021-01-09 16:01:34 · 148 阅读 · 0 评论 -
C++语言学习记录-26:继承与派生
类的继承类是C++面向对象编程的一个重要的组成部分,在之前也做过一些介绍。类的继承问题将带我们更好地、更深入地认识类这一概念。子类继承父类的一些属性,这样就可以在不同的类型有相似的共同点时减小编程量,也因此在开发中十分重要。C++语言中,一个派生类可以从一个基类里面派生,也可以从多个基类当中派生,从一个基类中派生的过程被称为单继承,从多个基类中派生的继承被称为多继承。单继承的定义格式:class Dev: public Base;多继承的定义格式:class C: public A, pub原创 2021-01-08 22:40:19 · 170 阅读 · 0 评论 -
C++语言学习记录-25:链表简介
链表是代替数组的一个好用的工具原创 2020-12-29 19:07:06 · 114 阅读 · 0 评论 -
C++语言学习记录-24:this指针
成员变量和成员函数分开存储在一个类当中,成员变量和成员函数是分开存储的,而每一个非静态成员函数的调用实际上只会生成一个函数实例,即多个类型的对象会共用一套函数代码this指针上面的那“一块代码”是如何区分自己是被哪一块函数调用的?这里C++引入了this指针来解决这一问题。this指针将指向被调用的成员函数所属的对象。还是那一个经典的解释:当你走进了一间房子,但是这间房子的陈设和别的房子的是一模一样的,你对房子的陈设做了改变,那么你能知道你是对那一间房子做了改变吗?这样的问题也发生在函数上。看下面原创 2020-12-22 20:31:13 · 117 阅读 · 0 评论 -
C++语言学习记录-23:初始化列表
比方说要在一个类内对多个变量进行初始化操作class Example{public: Example(int a, int b, int c) { m_A = a; m_B = b; m_C = c; } int m_A; int m_B; int m_C;};void test01(){ Example e(10, 20, 30); cout<<e.m_A<<e.m_B<<e.m_C<<endl;}这样的效率就会原创 2020-11-22 13:17:11 · 105 阅读 · 0 评论 -
C++语言学习记录-22:深拷贝与浅拷贝
浅拷贝:单纯的赋值拷贝操作一般来说,编译器自带的复制构造函数都为浅拷贝函数,由于只是执行一个值传递指令,因此两个或多个对象最终指向的是同一个内存空间,从而在释放内存时带来错误深拷贝:在堆区重新申请空间进行拷贝操作使用new关键字重新再堆区开辟新的内存拷贝变量并储存在新的空间,因此会有两个地址案例:#include<iostream>using namespace std;class Person{public: Person(){ cout<<"Person 默原创 2020-11-18 22:18:28 · 130 阅读 · 0 评论 -
C++语言学习记录补充:构造函数调用规则
在默认情况下,系统会为一个函数提供这三种构造函数:默认构造函数、有参构造函数和复制构造函数,但是在一些情况下将不再提供其他函数,比如:当用户自定义有参构造函数时,编译器不再提供默认构造函数;当用户自定义拷贝构造函数时,编译器将不再提供构造函数。因此在实践过程中如果不书写了拷贝构造函数,但是仍需调用其他构造函数时需要自行设置...原创 2020-11-18 21:21:55 · 87 阅读 · 0 评论 -
C++语言学习记录补充:复制构造函数的使用时机
复制构造函数(即拷贝构造函数)一般会在三种情况下调用(以下案例的制作前提都默认为已经创建了一个可以被访问的属性完整的类)使用一个已经创建完毕的对象去初始化一个新对象void example01(){ Example e1(20); Example e2(e1);}值传递的方式给函数参数传值void func(Example e){...}void example(){ Example e; func(e);}以值方式返回局部对象Example func{原创 2020-11-16 23:15:03 · 118 阅读 · 1 评论 -
C++语言学习记录-21:封装
对前面提到的类再进行深入分析原创 2020-11-12 17:38:51 · 98 阅读 · 0 评论 -
C++语言学习记录-20:函数的默认参数
在写函数的过程中,如果预先给好了几个参数,那么在使用函数的时候会更方便一点。比如:#include<iostream>using namespace std;int func(int a, int b =20, int c = 30){ return a+b+c;} int main(){ cout<<func(10)<<endl; return 0;}这样也可以输出60。而下面的函数调用如果写成func(10,30)就会得到结果70,说明函数原创 2020-11-11 16:37:44 · 97 阅读 · 0 评论 -
C++语言学习记录补充:引用的几种特殊用法
引用作函数的左值&常量引用原创 2020-11-09 23:33:20 · 120 阅读 · 0 评论 -
C++语言学习记录-19:内存的分区模型
内存分区模型C++在执行时,将内存从大方向上划分为四个区域,在这些不同区域中存放的数据,会被赋予不同的生命周期,以便我们灵活编程。1.代码区:由操作系统管理,用于存放函数体的二进制代码2.全局区:用于存放全局变量和静态变量以及常量3.栈区:由编译器自动分配、释放,存放函数的参数值和局部变量等4.堆区:由程序员分配释放,或在程序结束后由操作系统回收未执行程序之前在程序编译之后且程序执行之前,会生成一个exe的可执行程序,未执行该程序前有两个区域。代码区代码区用于存放CPU执行的机器指令,它原创 2020-11-04 19:52:52 · 770 阅读 · 0 评论 -
C++补充:char类型
这是一个自己之前并不很了解的东西原创 2020-11-03 21:38:14 · 214 阅读 · 1 评论 -
C++语言学习记录-18:结构体
结构体是一种保存不同类型变量的数据类型,在较多数据的处理场景中比较使用原创 2020-10-29 00:04:48 · 122 阅读 · 0 评论 -
C++语言学习记录-17:指针与函数
利用指针实现函数的地址传递之前在函数部分中,如果使用简单的值传递(如程序cpp1),就会发生虽然函数内部的形参值发生改变,但是显示出来的实参值并没有发生变化。因此,需要使用指针进行地址传递,就可以实现实参的交换(如程序cpp2)//cpp1#include<iostream>using namespace std;void swap(int a, int b){ int temp; temp = a; a = b; b = temp;}//cpp2#include&l原创 2020-10-21 19:44:24 · 106 阅读 · 0 评论 -
C++语言学习记录-16:指针与数组间的联系
指针运算一般来讲,指针的算术运算是和数组的使用相联系的,只有在使用数组时,才会得到连续分布的可操作内存空间。下面介绍指针运算的基本原理。指针是一种数据类型,与其他数据类型一样,指针变量也可以参与部分运算,包括算术运算、关系运算和赋值运算。指针可以和整数进行加减运算,但是它所代表的含义比较特殊。比如说指针p,当加上一个整数n时,p+n指的是p当前所指的位置后方第n个地址。同理,p-n指前方第n个地址。p++指当前位置下一个数据的地址,p–指的是前一个数据的地址。*(p1+n1)表示p1当前所指的数后n原创 2020-10-21 17:36:46 · 248 阅读 · 0 评论 -
C++语言学习记录-15:数组
数组的概念数组是用来储存和处理大量同类型数据的数据结构。数组是具有一定顺序关系的若干对象的集合体,组成数组的对象被称为该数组的元素。数组可以由除void类型以外的任意类型构成,它可以将一群相同类型的数据批量储存处理。数组的声明及使用比如要声明一个称为“first”的int类型数组,其中可以放置10个元素,声明方式如下:int first[10];这是一个一维数组。称为second的double类型二维数组声明方式如下:double second[5][3];这里面的元素个数为15,可以看原创 2020-10-17 16:26:51 · 283 阅读 · 1 评论 -
C++语言学习记录-14:指针
指针的概念C++的学习过程中,最难的一个部分就是摸清指针的概念。指针是一个变量,但是它储存的是对应的值的地址,而不是值本身。一般可以见到的如int型、char型的变量,其对应的值都是一个数值,或某串有意义的字符。指针所对的数值代表的是一段地址,代表的是它所指向的数据在内存中的放置位置,“指向了”一个变量。因此,指针也是一种数据类型,具有指针类型的变量被称为指针变量。提取地址的运算符假设man是一个变量,利用&man就代表它的地址。下面是C++ primer plus中的一段代码,在这里对它原创 2020-10-14 23:12:50 · 170 阅读 · 0 评论 -
C++语言学习记录-13:构造函数和析构函数
构造函数是什么想象你刚买了一套房子,在装修之前,必然是什么都没有的毛坯房,运气不好的话里面还会有一些奇怪的东西。这个时候,就需要将房子装修,之后方可入住。程序也是一样的,在对内存初始化之前,你的函数里面的参数可能包含了很多垃圾数据,要对垃圾数据进行清理,才能让后面的函数运行顺利,这一个过程就叫做构造函数。和类名相同的无返回函数就是它的初始化函数(构造函数),编译器保证在创建一个对象之后、允许你使用它之前,它必定会在这个对象对应的内存上执行构造函数,按你的要求把对象装修好。如果你不写,那么它默认给你个毛原创 2020-10-09 19:59:08 · 150 阅读 · 0 评论 -
C++语言学习记录-12拓展程序:一个时钟的程序
再利用一个实例来加深对类的印象。#include<iostream>using namespace std;class Clock{ public: void setTime(int newH = 0, int newM = 0, int newS = 0); void showTime() private: int hour, min, sec; }; void Clock::setTime(int newH, newM, newS){ //在作用域内定义函数,::为原创 2020-09-07 12:32:44 · 274 阅读 · 0 评论 -
C++语言学习记录-12:类和对象
对象C++被称作面向对象的语言,那么一个很重要的问题就是什么是对象。对象(object),就是指一个物品或一件事物。同时,这个事物有自己的属性和操作特点。一个圆可以被看作对象,那么它所含的属性就有半径、坐标、面积,可以进行的操作就有改变它的位置;把一本书看作一个对象,那么它的属性就是质量、页数、字符数、长宽高等等,可以进行的操作就是打开书或合上书。其实,所有的编程语言都有面向对象编程的特点,只是C++的语法特点使得对对象的编程更加的容易。类类,就是将一个对象的所有属性和操作方法总结起来并封装的原创 2020-09-04 19:28:28 · 109 阅读 · 0 评论 -
C++语言学习记录-8拓展:斐波那契数列的计算
斐波那契数列在生活中有很多的运用,在计算诸如兔子的繁殖数、茎叶的排布规律上有重要的作用。要想求解斐波那契数列在第n项的值,就需要不断进行数列的递归调用,以此计算斐波那契数列,其表达式为:f(x)=f(x−1)+f(x−2)f(x)=f(x-1)+f(x-2)f(x)=f(x−1)+f(x−2)用代码来实现求解会方便得多。#include<iostream>using namespace std;int fib(int n){ if (n < 3){ return (1);原创 2020-09-02 22:46:57 · 185 阅读 · 0 评论 -
C++语言学习记录-11:函数重载
函数重载介绍函数重载就是将在同一作用域内,语义、功能相似具有相同函数名字,不同参数列表(参数的个数,顺序和类型不同)的函数称为函数重载,其存在的目的是便于记忆,以防后续调用函数时出错。函数重载实例以计算整型或浮点型绝对值的函数为例#include<iostream>using namespace std;int abs(int x){ return x<0? -x : x;}double abs(double x){ return x<0? -x : x;}原创 2020-08-31 17:26:41 · 175 阅读 · 0 评论 -
C++语言学习记录-10:内联函数
内联函数功能介绍内联函数指的是一种在调用函数时提高运行效率的一种机制。在编译器编译的时候,用函数体里面的语句去替换函数调用表达式,不需要参数调用及返回,以省去调用时和转子函数并返回时所用的资源和开销。内联函数的声明内联函数的声明需要使用inline关键字,具体语法以计算圆面积的程序进行演示:#include<iostream>using namespace std;const double pi = 3.1415inline double square(double radius原创 2020-08-30 00:34:12 · 148 阅读 · 0 评论 -
C++语言学习记录-9:引用
引用是C++中的一种特有的语法,用以优化C中只能使用指针的缺点,同时也是有自己语言特性的一个语法。如果不使用引用,在这里的程序就无法正常实现它的功能。#include<iostream>using namespace std;void swap(int a, int b) //定义一个swap函数实现数据的交换{ int t = a; //定义参数t,a的值赋给t a = b; //b的值赋给a b = t; //t的值再次赋给b,使b等于原来的a}int main(){原创 2020-08-28 16:04:19 · 124 阅读 · 0 评论 -
C++语言学习记录-8:函数的递归调用
函数的递归调用将以计算一个数的阶乘为例。#include<iostream>using namespace std;unsigned func(unsigned n){ unsigned f; if (n ==0) f = 1; else f = func(n -1)*n; return f;}int main(){ unsigned n; cout<<"type in your aim number"<<endl; cin<&l原创 2020-08-27 09:45:09 · 193 阅读 · 0 评论 -
C++语言学习记录-7:函数的嵌套式调用
在记录6中记录下了如何定义并调用一个函数,而函数之间其实是可以嵌套调用的,即一个函数的功能需要借助另外一个函数才能实现。这一过程就被称为函数的嵌套调用。下面以一个平方数求和的算法为例:#include<iostream>using namespace std;int fun1(int m){ return m * m;}int fun2(int x, int y){ return fun1(x) + fun1(y);}int main(){ int a,b; c原创 2020-08-26 21:18:30 · 471 阅读 · 0 评论 -
C++语言学习记录-6:函数的定义和调用
C++中有很多内置函数,但是仍然有一些功能需要我们自己写函数并在后续的程序中使用。下面以一个计算乘方运算的程序为例。#include<iostream>using namespace std;double power(double x, int n){ double val =1.0; while(n--) val *= x; return val;}int main(){ double a; a = power(4,12); cout<<a; retu原创 2020-08-21 12:18:48 · 191 阅读 · 0 评论 -
C++语言学习记录-5:使用循环语句
while语句while语句是最简单的一种循环语句,用于对变量在条件表达式条件范围内时进行循环操作,比如计算1~100的和,如果使用数学公式,有时候需要判断公式是否使用,而利用计算机计算速度快的特点,就可以用累加的方式计算。#include<iostream>using namespace std;int main(){ int i = 1,sum = 0; while(i <=100) { sum += i; i++; }cout<<sum<原创 2020-08-19 16:59:51 · 211 阅读 · 0 评论 -
C++语言学习记录-4:使用if...else语句和switch语句
if语句if语句是较为简单的判断语句,主要用于对程序中每一个if后的条件表达式进行判断,判断条件表达式为真之后运行if后的程序,为假则不运行。if(x>y){ cout<<"x>y"<<endl;}if(x<y){ cout<<"x<y"<<endl;}if(x=y){ cout<<"x=y"<<endl;这是一个比较简易的xy值大小比较的程序,但是也可以形象的说明if语句的执行过程。原创 2020-08-19 12:08:44 · 638 阅读 · 0 评论 -
C++语言学习记录-3:利用sizeof判断不同类型的长度
不同的类型长度在C++语言中,不同的字符类型会有不同的长度,如short类型,long类型和long long类型,当然还有一些如double类型和int类型的长度会与系统本身的实现相关,为了知道不同类型所占的字节数,就有利用sizeof()计算对该类型的内存分配大小。sizeof()的基本用法sizeof()用以计算该类型的内存分配大小,简单的代码实现如下:#include<iostream>using namespace std;int main(){ cout<<原创 2020-08-17 13:40:03 · 486 阅读 · 0 评论