C++基础
文章平均质量分 55
《Essential C++》学习记录
Zoeygotit
今天加加油 明天技术流
展开
-
【C++】异常处理之throw、catch、try、局部资源管理、标准异常库
异常处理机制两个主要成分:1. 异常的鉴定与发出;2. 异常的处理方式。原创 2023-10-13 08:56:38 · 1243 阅读 · 0 评论 -
【C++】类模板(二)类模板、函数模板、常量表达式与默认参数值、模板参数设计策略、成员模板函数
将某种特定的命名规范强加于被当作参数的类身上:每个类都必须提供类模板中调用到的函数。在只写一份函数定义的情形下,支持任何类型。原创 2023-10-13 08:56:25 · 99 阅读 · 1 评论 -
【C++】类模板(一)被参数化的类型、类模板的定义、模板类型参数的处理
类型的相关信息可从模板定义中剥离,由用户使用时再指定。 template机制帮助我们把“与类型相关”和“独立于类型之外”的两部分分离开来;在一个类模板中,与类型相关的部分会被抽取出来,成为一个或多个参数:原创 2023-10-11 19:03:48 · 113 阅读 · 1 评论 -
【C++】面向对象编程(七)RTTI(运行时的鉴定机制):typeid、static_cast、dynamic_cast
Run-Time Type Identification,运行时鉴定机制。typeid运算符查询多态化的类指针/引用,来获得类指针/引用所指对象的实际类型;typeid运算符返回一个type_info对象,其中存储着与类型相关的种种信息。每一个派生类都对应着一个type_info对象,该对象的name()函数会返回一个const char*用于表示类名。dynamic_cast也是一个RTTI运算符,在运行时进行检验基类指针所指类对象是不是某派生类的类对象。原创 2023-10-10 21:03:29 · 230 阅读 · 0 评论 -
【C++】面向对象编程(六)在派生类中定义一个虚函数、虚函数的静态解析
在派生类中定义一个虚函数时:要么将基类中的虚函数覆盖掉:派生类提供新定义,所声明的函数原型必须完全符合基类所声明的函数原型(包括:参数列表、返回类型、常量性);要么原封不动继承基类中的虚函数;如果继承的是纯虚函数,则这个派生类也会被视为抽象类,无法为它定义任何对象。在派生类中,如果其基类的同名成员函数已声明为虚函数,则派生类的同名成员函数声明和定义前不用加virtual,编译器将自动根据两个同名函数的原型声明,决定某个函数是否会覆盖其基类中的同名函数。原创 2023-10-09 20:21:52 · 230 阅读 · 2 评论 -
【C++】面向对象编程(五)初始化、复制、析构
如果基类有了实际的数据成员,则我们必须给基类数据成员初始化:为基类提供构造函数(利用这个构造函数初始化基类所声明的所有数据成员)注意:抽象基类无法定义任何对象(因为抽象基类里纯虚函数没有函数定义)原创 2023-10-08 21:35:17 · 147 阅读 · 0 评论 -
【C++】面向对象编程(四)派生类
派生类必须为从基类继承而来的每个纯虚函数提供对应的实现;必须声明自己的成员;必须为从基类继承而来的每个纯虚函数提供对应的实现;派生类的同名成员函数虚函数不需要再在函数声明/定义前加上virtual;派生类的虚函数必须精确吻合基类中的函数原型;从基类继承而来的public成员和protected成员,都可被视为派生类自身拥有的成员;用类作用域运算符调用哪个类对象的某成员函数。原创 2023-10-07 21:21:02 · 167 阅读 · 0 评论 -
【C++】面向对象编程(三)定义一个“抽象基类”的三大步骤
1. 找出所有子类共通的操作行为;2. 找出哪些操作行为必须根据不同的派生类而有不同的实现方式;3. 找出每个操作行为的访问层级。原创 2023-10-06 20:53:43 · 209 阅读 · 1 评论 -
【C++】面向对象编程(二)面向对象的编程思维:virtual虚拟调用、继承、protected成员、派生类与基类
使用virtual关键字,以调用真正指向的对象的成员函数(虚拟调用);使用号和public实现派生类继承的标记,不必刻意区分“继承而来的成员”和“自身定义的成员",在其使用上无特别的不同之处;被声明为protected的所有成员都可以被派生类直接访问;除了派生类之外,都不得直接访问protected成员。当程序定义出一个派生对象,基类和派生类的构造函数都会被执行;原创 2023-10-05 22:37:31 · 814 阅读 · 0 评论 -
【C++】面向对象编程(一) 继承、多态、动态绑定
继承:让我们可以定义一整群互有关联的类,并共享通用的接口;多态:让我们可以用一种与类型无关的方式来操作类对象,通过抽象基类的指针或引用来操纵一整群互有关联的类的共同接口;动态绑定:在程序执行时依据抽象基类的指针或引用所指的是基类对象的类型才能决定。原创 2023-10-04 21:54:40 · 197 阅读 · 0 评论 -
【C++】class的设计与使用(十一)指向类成员函数的指针 VS 一般函数指针
皆需指定其返回类型和参数列表;目的均为方便调用;原创 2023-09-30 23:34:03 · 201 阅读 · 0 评论 -
【C++】class的设计与使用(十)重载iostream运算符
希望对某个类对象进行读写操作,直接cout原创 2023-09-30 23:09:13 · 654 阅读 · 0 评论 -
【C++】class的设计与使用(九)自定义函数对象(function object)
一种提供有函数调用运算符的类。当编译器遇到了一个函数调用,比如lt(ival);,lt可能是个函数名、函数指针、提供了函数调用运算符的的函数对象;如果lt是个类对象,那么编译器会在内部将此语句转换为lt.operator(ival);函数调用运算符可以接受任意个参数。使用举例:它可被用来支持矩阵(Matrix)这个类的多维度下标操作,因为语言所提供的下标运算符仅能接受一个参数。原创 2023-09-30 22:55:49 · 249 阅读 · 1 评论 -
【C++】class的设计与使用(八)复制构造函数、复制赋值运算符
只要类的设计者明确提供了复制赋值运算符的定义,这个复制赋值运算符就会取代默认的成员逐一复制操作行为。原创 2023-09-30 18:00:49 · 156 阅读 · 1 评论 -
【C++】class的设计与使用(七)友元函数、友元类(关键字friend)
任何class都可以将其他类或者函数指定为朋友(friend); friend具备了与类成员函数相同的访问权限,可以访问类的private member; 声明:只需要在函数原型前加上关键字friend; 这份声明可以出现在class定义的任意位置上,不受private和public的影响; 想要将数个重载函数声明为某个类的friend,所有的重载函数前都要加friend;原创 2023-09-30 17:36:16 · 186 阅读 · 1 评论 -
【C++】class的设计与使用(六)运算符重载、嵌套类型(typedef)
运算符重载的规则:1. 不可以引入新的运算符:除了. .* :: ?:四个运算符,其他的运算符皆可被重载;2. 运算符的操作数个数不能变:二元运算符需要两个操作数,一元运算符需要一个操作数;3. 运算符优先级不可改变;4. 运算符函数的参数列表中,必须至少有一个参数为class类型:我们没法给比如指针这种非类类型重载运算符,也不能给它引进新运算符。原创 2023-09-29 00:22:43 · 193 阅读 · 1 评论 -
【C++】class的设计与使用(五)静态类成员
1. 静态成员函数的操作与任何对象都没有关联,所以可以很方便的用一般自定义函数的方式来调用,但必须加类作用域运算符;2. “静态成员函数”可以在“与任何对象都无关联”的情形下被调用;3. 成员函数只有在“不访问任何非静态成员”的条件下才能被声明为static,声明方式是添加关键字static;4. 当我们在class主体外部进行成员函数的定义的时候,如果声明加了static,定义时就不用再加static了。原创 2023-09-27 21:17:55 · 465 阅读 · 0 评论 -
【C++】class的设计与使用(四)this指针
this作用域是在类内部,只能在成员函数中使用;this在成员函数的开始前构造,在成员函数的结束后清除;编译器在编译的时候也会自动加上this,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。原创 2023-09-26 21:15:22 · 144 阅读 · 0 评论 -
【C++】class的设计与使用(三)mutable(可变)和const(不变)
const修饰符紧接在函数参数列表之后(告诉编译器:这个成员函数不会更改类对象的内容);编译器会检查每个声明为const的成员函数,检看看他们是否真的没有改变类对象的内容,如果改变,就会产生编译错误;在class主体以外定义的成员函数,如果它是一个const成员函数,那就必须同时在声明与定义中指定const:然而返回一个非const引用,引用(“指向”)标注着const的成员函数的函数体内的对象也会产生问题:将标const的成员函数的函数体内的对象开放了出去,允许程序在其他地方加以修改:解原创 2023-09-25 22:03:31 · 435 阅读 · 0 评论 -
【C++】class的设计与使用(二)构造函数和析构函数
1. 编译器会在每次类里的数据成员被定义出来的时候调用适当的函数加以处理,去初始化类对象里的数据成员,这种我们提供的一个或者多个特别的初始化函数就叫做构造函数;2. 构造函数的名称必须和类的名称相同;3. 语法规定:构造函数没有返回类型,所以构造函数的函数体没有return语句,构造函数也不返回任何值,它可以被重载。原创 2023-09-24 20:35:51 · 117 阅读 · 0 评论 -
【C++】class的设计与使用(一)实现一个class
inline函数和class定义都放在对应的.h文件中;非inline函数应该放在和class同名的.cpp文件中。原创 2023-09-23 22:07:33 · 200 阅读 · 0 评论 -
【C++】泛型算法(八)流迭代器iostream Iterator的使用:从文件中读取与写入
常用的情况是从文件中读取,写到文件中去:将istream_iterator绑定至ifstream object,将ostream_iterator绑定至ofstream object即可。原创 2023-09-22 21:52:08 · 296 阅读 · 1 评论 -
【C++】泛型算法(七)插入型迭代器Iterator Inserter
iterator inserter运用“插入操作”来让复制不用再规定固定大小的目标容器了。原创 2023-09-22 21:51:56 · 179 阅读 · 0 评论 -
【C++】泛型算法(六)Map和Set的使用
map,key起到索引的作用。Set由一群key组合而成,如果想知道某值是否存在于某个集合内,可以用set。原创 2023-09-21 21:32:03 · 292 阅读 · 1 评论 -
【C++】泛型算法(五)泛型算法的使用与设计
将最初的函数转化为泛型函数的呈现效果:转化后的函数和元素类型无关、和比较操作无关、和容器类型无关,即可从消除函数和元素类型、容器类型、比较操作之间的关联入手,传入指针、进行元素类型和操作参数化等。原创 2023-09-20 22:50:02 · 173 阅读 · 0 评论 -
【C++】泛型算法(四)使用顺序性容器
顺序性容器用来维护一组有序、类型相同的元素。主要是:vector和list。原创 2023-09-18 22:53:17 · 105 阅读 · 0 评论 -
【C++】泛型算法(三)所有容器的共通操作
begin():返回一个iterator,指向容器的第一个元素;end():返回一个iterator,指向容器的最后一个元素的下一位置;(通常我们在容器身上进行的迭代操作始于begin(),终于end();)原创 2023-09-17 11:45:27 · 59 阅读 · 0 评论 -
【C++】泛型算法(二)泛型指针Iterator(迭代器)
其定义应该提供:迭代对象(某个容器)的类型,用来决定如何访问下一个元素;iterator所指的元素类型,决定iterator提领操作的返回值;原创 2023-09-17 11:24:11 · 317 阅读 · 0 评论 -
【C++】泛型算法(一)指针的算术运算
泛型算法即通过function template技术,达到“与操作对象的类型互相独立”的目的。原创 2023-09-15 18:06:15 · 93 阅读 · 0 评论 -
【C++】函数的设计与使用(五)设定头文件
函数的定义只能有一个,但是可以有许多份声明。在file scope内定义的对象,如果可能被多个文件访问,就得被声明于头文件之中;在程序中没有声明某个对象,就无法访问该对象。//加了关键字extern的对象,即把定义对象变为声明对象。原创 2023-09-14 20:45:00 · 214 阅读 · 0 评论 -
【C++】函数的设计与使用(四)函数指针
函数指针必须指明其所指函数的返回类型及参数列表;函数指针的定义必须将 * 放在某个位置,表示这份定义所表现的是一个指针;还需要赋予一个名称。原创 2023-09-13 21:56:44 · 38 阅读 · 0 评论 -
【C++】函数的设计与使用(三)重载函数、模板函数
1. 如果函数具备多种实现方式,我们可以将它重载成为承载函数;2. 如果我们希望让程序代码得到主体不变,仅仅改变其中用到的数据类型,可以通过fuction template达到目的;3. 模板函数也可以是重载函数。原创 2023-09-12 22:38:37 · 122 阅读 · 0 评论 -
【C++】函数的设计与使用(二)提供默认参数值、使用局部静态对象、inline函数
为了更高的可见性,我们决定将默认值放在函数声明处而非定义处,声明会被放到头文件,使用该函数时会包含该头文件,定义被放到程序代码文件,该文件只被编译一次,使用时将该函数链接到程序来。原创 2023-09-11 20:19:04 · 39 阅读 · 0 评论 -
【C++】函数的设计与使用(一)编写函数、调用函数
函数声明是不必提供函数体,但必须指明返回类型、函数名,以及参数列表,即所谓的函数原型。函数定义则包括函数原型及函数体。、函数调用过程中的值传递方式:传址(by reference) 和传值(by value)。原创 2023-09-10 23:05:22 · 199 阅读 · 1 评论 -
【C++】C++编程基础(五)文件的读写
要对文件进行读取和写入操作,必须要定义一个对象原创 2023-09-09 23:10:54 · 58 阅读 · 1 评论 -
【C++】C++编程基础(四)指针、伪随机数生成器
指针:增加程序弹性的同时,也增加了操作复杂度。原创 2023-09-08 19:47:33 · 99 阅读 · 1 评论 -
【C++】C++编程基础(三)Array和Vector
C++允许用其内置的array(数组)类型或标准库提供的vector类来定义容器;array和vector,均可通过指定容器中的位置,通过下标运算符([ ])索引该位置上的元素。原创 2023-09-07 21:48:59 · 67 阅读 · 0 评论 -
【C++】C++编程基础(二)运算符、表达式、条件语句和循环语句
可添加小括号实现希望的运算优先级。原创 2023-09-06 21:45:26 · 37 阅读 · 1 评论 -
【C++】C++编程基础(一)基本组成、类和对象、示例解析
每一个C++程序都是从main函数开始执行的,未定义mian()函数将无法执行。两步:每个对象都属于某个特定的数据类型;每一个内置数据类型都有一个关键字用于指定该类型:原创 2023-09-05 23:19:04 · 40 阅读 · 2 评论