
C++
侧重c++与c的不同
Dαīsч
这个作者很懒,真的什么都没留下…………
展开
-
c++文件流、string流
一、文件输入输出1、除了继承自iostream类型的行为之外,fstream中定义的类型还增加了一些新的成员来管理与流关联的文件fstream fstrm(s);//创建一个fstream并打开名为s的文件,其中s可以是string也可以是C风格字符串指针fstream fstrm(s, mode); //和前一个构造函数类似,但按指定模式打开文件fstrm.open(s); //打开名为s的文件,并将文件与fstrm绑定fstrm.close();原创 2022-05-12 21:21:42 · 636 阅读 · 0 评论 -
c++IO库
一、IO类概述1、标准库定义了四个IO对象。(1)、我们可以用一个名为cin的istream类型的对象来处理输入,这个对象也叫标准输入(2)、可以用ostream类型的对象cout,称作标准输出(3)、另外两个ostream对象:cerr输出警告和错误消息,clog输出程序运行时的一般信息2、IO库类型和头文件iostream从流中读写 fstream从文件读写 sstream从string中读写 istream ifstream istringstrea原创 2022-05-12 19:59:06 · 381 阅读 · 0 评论 -
c++访问控制和类作用域
一、访问控制1、每个类分别控制着自己成员的初始化过程,也控制着其成员对于派生类来说是否可以访问2、派生类的成员和友元(函数、类等)只能通过派生类对象来访问基类的受保护成员,派生类对于一个基类对象中的受保护成员没有任何访问权限3、类对继承而来的成员的访问权限受两个因素影响:基类中该成员的访问说明符;派生列表中的访问说明符派生访问说明符对于派生类的成员(及友元)能否访问直接基类的成员没有影响,对基类成员的访问权限只与基类中的访问说明符有关派生访问说明符的目的是控制其派生类用户(包括派生类的派原创 2022-05-06 19:54:50 · 810 阅读 · 0 评论 -
c++虚函数和抽象基类
一、虚函数1、只有在使用基类的引用或指针时,调用一个虚成员才会执行动态绑定2、由于直到运行才确定调用哪个版本的虚函数,故所有的虚函数都必须有定义,不论是否被用到3、一旦某个函数被声明为虚函数,则在所有的派生类中,它都是虚函数4、如果想要在派生类覆盖继承而来的虚函数,则它的函数名、形参类型必须与基类函数完全一致;对于返回类型,对于除了非指针和引用的返回类型,也应一致,如果是指针或引用类型,则规则无效,如:D由B派生而来,则基类的虚函数可以返回B*,而派生类对应函数可以返回D*,不过要求D到B的原创 2022-05-06 18:25:41 · 348 阅读 · 0 评论 -
c++定义基类和派生类
一、定义基类1、c++中,基类需要将它的两种成员函数区分开来:一种是希望派生类进行覆盖的函数,另一种是希望派生类直接继承而不要改变的函数。对于前者,基类通常将其定义为虚函数,当我们使用指针或者引用调用虚函数时,该调用将被动态绑定,根据对象类型选择执行版本2、基类通过在其成员函数的声明语句(不得用于类外部的函数定义)前加上virtual使得该函数执行动态绑定3、任何构造函数出外的非静态函数都可以是虚函数4、如果在基类中把一个函数声明称虚函数,那么该函数在派生类中隐式地也是虚函数5、成员原创 2022-05-05 20:15:06 · 4888 阅读 · 0 评论 -
c++面向对象程序设计概述
1、面向对象程序设计(OOP)的核心思想是数据抽象、继承和动态绑定通过数据抽象,可以将类的接口和实现分离;使用继承,可以定义相似的类型并其相似关系建模原创 2022-05-05 18:36:59 · 798 阅读 · 0 评论 -
c++重载中的类型转换
1、通过定义类型转换运算符,可以实现类类型的类型转换。转换构造函数和类型转换运算符共同定义了类类型转换,又称类型转换2、构造函数可以实现其他类型向本类的转化,类型转换运算符可以实现本类向其它类型的转化3、类型转换运算符是类的一种特殊成员函数,负责将一个类类型的值转换成其他类型,形式如下其中,type可以是除void外的任何类型,只要该类型能作为函数的返回类型(返回的类型要与type一致);没有显式的返回类型,没有形参,而且必须定义为类的成员函数由于不应改变待转换对象的内容,因此被定义为con原创 2022-05-01 13:16:54 · 1484 阅读 · 0 评论 -
c++重载运算符
一、重载输出运算符<<1、通常情况下,输出运算符的第一个形参是非常量的ostream对象的引用,是非常量是因为:向流写入会改变其状态,是引用是因为:我们无法直接复制一个ostream对象第二个形参一般来说是一个常量的引用,该常量是我们想要打印的类型2、为了与其他输出运算符保持一致,operator<<一般要返回它的ostream形参(的引用)class Node{private: int num; string name;public: friend o原创 2022-04-30 21:32:03 · 3610 阅读 · 1 评论 -
c++重载运算基础
1、重载的运算符是具有特殊名字的函数:他们的名字是由关键字operator和其后要定义的运算符号共同组成的,和其他函数一样,重载运算符也包含返回类型、参数列表、以及函数体2、对于非成员重载运算符函数,参数数量与运算符作用的运算对象数量一致,如一元运算符有一个参数,二元运算符有两个参数对于是成员函数的运算符函数,它的第一个(左侧)运算对象绑定到隐式的this指针上,此时的成员运算符函数中参数数量少一个3、对于既可是一元运算符也可是二元运算符的,我们可以根据参数数量来推断使用哪种运算符4、除了重原创 2022-04-30 14:36:47 · 865 阅读 · 0 评论 -
c++拷贝、赋值与销毁
一、概述当我们定义一个类时,我们显式或隐式地指定在此类型进行对象拷贝、移动、赋值和销毁操作一个类通过定义五种特殊的成员函数来控制这些操作,包括:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符、析构函数,这些操作称为拷贝控制函数二、拷贝构造函数1、如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数class Node{public: int num; string name;public: Node(const N原创 2022-04-30 11:08:02 · 598 阅读 · 0 评论 -
c++泛型算法
一、概述标准库并未给每个容器都定义成员函数来实现一些操作,而是定义了一组泛型算法,他们实现了一些经典算法的接口术语: beg和end 元素范围的迭代器 beg2和end2 beg2表示第二个序列开始位置迭代器,end2表示第二个序列末尾迭代器(如果有的话)。如没有end2则假定系列2至少与beg和end表示的范围一样大。beg和beg2类型不必匹配,但必须保证两个序列中的元素可以执行特性操作或调用给定的可调用对象 des 表示目的序列的迭代器。对于给定输入原创 2022-04-28 20:45:58 · 1185 阅读 · 0 评论 -
c++无序容器
1、新标准定义了四个无序关联容器,有序容器是用比较运算符来组织元素的,而无序容器是使用一个哈希函数和关键字类型的==运算符,在关键字元素没有明显的序关系的情况下,无序容器是非常有用的,在某些应用中,维护序代价非常高昂2、除了哈希管理操作之外,无序容器提供了与有序容器相同的操作3、无序容器在储存上组织为一组桶,每个桶保存零个或多个元素,无序容器用一个哈希函数将元素映射到桶中。为了访问一个元素,容器首先计算元素的哈希值,它指出应该搜索那个桶,容器将具有一个特定哈希值的所有元素保存在相同的桶中4、理想原创 2022-04-26 19:55:13 · 1031 阅读 · 0 评论 -
c++关联容器操作
一、关联容器迭代器当解引用一个关联容器迭代器时,会得到一个类型为容器的value_type的值的引用对于set而言,虽然set类型同时定义了iterator和const_iterator类型,但都只允许访问set中的元素对于map而言,会得到一个pair类型,first是关键字,second是值二、添加元素1、insert和emplace操作//c是关联容器c.insert(v) //v是value_type类型的对象c.emplace(args)原创 2022-04-26 19:03:05 · 911 阅读 · 0 评论 -
c++关联容器概述
一、关联容器关联容器支持高效的关键字查找和访问,两个主要的关联容器类型是map和set标准库提供以下8个关联容器:按关键字有序保存元素 map 关联数组:保存关键字-值对 set 关键字即值,只保存关键字的容器 multimap 关键字可重复出现的map multiset 关键字可重复出现的set 无序集合 unordered_map 用哈希函数组织的map unordered_set 用哈希函数组织的set u原创 2022-04-25 20:26:50 · 1207 阅读 · 0 评论 -
c++容器适配器
一、容器适配器除了顺序容器外,标准库还定义了三个顺序容器适配器:stack,queue,priority_queue容器、迭代器和函数都有适配器。本质上,适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样,因此三个容器适配器都有自己的默认容器类型stack和queue是基于deque实现的,priority_queue是基于vector实现的二、定义适配器种类 默认顺序容器 可用顺序容器 说明 stack deque vector、list、d原创 2022-04-24 19:12:33 · 3098 阅读 · 0 评论 -
c++string的特殊操作
一、构造函数string ss;char chs[100];string s1(chs, n); //s是chss指向的数组中前n个字符的拷贝,该数组至少含有n个字符,chs是const char* string s2(ss, pos2); //s是ss从下标pos2开始的字符的拷贝,应使pos2 <= s.size()string s3(ss, pos2, len2);//s是ss从下标pos2开始len2个字符的拷贝,最多只能拷贝ss.size() - pos2个字符二、提原创 2022-04-24 18:36:25 · 388 阅读 · 0 评论 -
c++vector(string)对象的存储
一、vector对象是如何增长的为了支持快速随机访问,vector将元素连续存储,同时容器的大小是可变的,那么在我们向容器中添加元素时,如果没有空间容纳新元素,那么容器只能分配新的内存空间来保存新旧元素,那么这样的性能将会非常低为了减少空间重新分配的策略,不得不获取新的内存空间时,vector的实现通常会分配比新的空间需求更大的内存空间,容器预留这些空间作为备用在这样的基础上,vector仍然是连续的,只不过是在vector的尾部有一部分的预留空间,因此在vector中间插入元素的时间复杂度仍旧原创 2022-04-24 17:22:50 · 2683 阅读 · 0 评论 -
c++try语句块和异常处理
异常处理包括:1、throw表达式:异常检测部分使用throw表达式来表示它遇到了无法处理的问题,我们说,throw引发了异常2、try语句块:异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句结束,try语句块中的代码抛出的异常通常会被某个catch子句处理、3、异常类:用于throw表达式和相关的catch子句之间传递异常的具体信息一、throw表达式1、throw表达式包含关键字throw和紧随其后的一个表达式,表达式的类型就是抛出的原创 2022-04-14 19:07:58 · 5807 阅读 · 0 评论 -
c++顺序容器操作(其他)
一、特殊的forward_list操作1.由于添加或删除一个元素时,该元素的之前的元素的后继会发生改变,但是单向链表无法轻易获取前驱来改变其链接,所以需要特殊的操作2.forward_list的添加、删除操作要输入前一个元素作为参数,例如想要删除a4,需要输入a3的迭代器。因此forward_list有其独有的首前迭代器before_begin3.forward_list对应的操作分别为insert_after、emplace_after、erase_after操作,如果输入的迭代器是尾后迭代器原创 2022-03-15 20:02:15 · 1335 阅读 · 0 评论 -
c++顺序容器访问、删除元素
一、访问元素1.可以使用所有顺序容器都有的front和唯独forward_list没有的back来直接获得的首元素和尾元素的引用(begin和end解引用间接获得),其中back就是最后一个元素(end是最后一个元素的下一个位置)vector<int>a = { 4,5,9 };auto num1 = *a.begin(), num2 = a.front();...原创 2022-03-15 18:59:16 · 1314 阅读 · 0 评论 -
c++顺序容器添加元素
1.使用push_back除了array和forward_list外,每个顺序容器都支持push_back,意为在尾部添加元素2.使用push_frontlist、forward_list和deque支持push_front,也就是插入到容器头部3.特定位置添加元素forward_list中提供了特殊版本的insert成员,下面介绍的是其他容器:第一个参数是迭代器,第二个是插入元素vector<int>a = { 4,5,9 };a.insert(a.begin(),原创 2022-03-15 18:01:27 · 1895 阅读 · 0 评论 -
c++容器操作
本文将介绍c++中所有容器共同的部分1.类型别名:(1).iterator表示此容器的迭代器类型(2).const_iterator可以读元素但是不能修改元素的迭代器类型(3).size_type无符号整数类型,足够储存这种容器类型最大可能的容器大小(4).difference_type带符号整型数,足够保存两个迭代器之间的距离(5).value_type元素类型(6).reference元素的左值类型,与value_type&含义相同(7).const_refere原创 2022-03-11 20:05:07 · 944 阅读 · 0 评论 -
c++顺序容器
1.一个容器就是一些特定类型的对象,顺序容器为程序员提供了控制元素储存和访问顺序的能力,这种顺序依赖于元素加入容器的位置,与无序关联容器相对2.顺序容器提供了快速顺序访问元素的能力,但是也有性能折中:添加或删除元素;非顺序访问容器中元素3.vector和string将元素保存在连续的内存空间中,因此通过下标计算地址是非常快速的,但是在中间位置添加或删除元素会非常耗时(插入或删除后需要移动其后的所有元素来保持连续)4.list和forward_list分别是双向链表和链表,分别支持双向访问和单向访原创 2022-03-11 19:00:46 · 681 阅读 · 0 评论 -
c++类的静态成员
1.声明类的静态成员,在成员声明之前加上static关键字,使成员与类关联在一起,而不是对象2.类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据;类似的,静态成员函数,也不与任何对象绑定在一起,不包含this指针3.使用:(1).可以使用作用域运算符直接访问静态成员struct node{ static int a;};int node::a = 1;void solve(){ int n = node::a;}(2).虽然静态成员不属于类的某个原创 2022-03-11 18:29:12 · 559 阅读 · 0 评论 -
c++构造函数进阶
一、构造函数初始化列表1.构造函数初始化列表还有一种写法,前面一种写法是定义后初始化,后面一种是定义后再赋值,因此我们选择前者struct date{ date(const string& ss, int price) :x(price), s(ss) {} date(const string& ss, int price) { x = price; s = ss; } int x = 520; string s;};2.对于const类型和引用类型,定原创 2022-03-08 21:16:40 · 264 阅读 · 0 评论 -
c++类的作用域
一、作用域1.每个类都有自己的作用域,在作用域之外,普通的数据和函数成员只能由对象、引用或者指针使用成员访问运算符来访问2.一个类就是一个作用域,因此类外定义的成员函数必须同时提供类名和函数名,在类外部成员的名字被隐藏,遇到类名之后定义的剩余部分就在类的作用域之内了3.函数的返回类型通常出现在函数名之前,因此返回类型中使用的名字都位于类的作用域之外,这时返回类型必须指明它是哪个类的成员class node{public: typedef string::size_type str;原创 2022-03-08 19:21:04 · 1774 阅读 · 0 评论 -
c++类的其他特性
一、类成员1.定义类型的成员必须先定义后使用,而且只会能在类内使用class screen{public: typedef string::size_type pos;private: pos a = 0; pos b = 0; string contents;};2.定义在类内部的成员函数是自动inline的,而类外部不是。我们可以显式地在前面加上inline作为声明的一部分3.和非成员函数一样,成员函数也可以重载,使用方法和之前相同4.类中成员函数是不可以改变类中数原创 2022-03-07 21:13:43 · 297 阅读 · 0 评论 -
c++类的访问控制和封装
一、封装性1.在此之前,我们为类定义了接口,但并没有任何强制用户使用这些接口,我们的类还没有封装。也就是说,用户可以直接到达对象的内部来控制它的具体细节。在c++中,我们使用访问说明符来加强类的封装性:(1).定义在public说明符之后的成员在整个程序内可被访问,public成员定义类的接口,(2).定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private部分封装了(隐藏)类的实现细节struct node{public: int c原创 2022-03-07 16:32:17 · 436 阅读 · 0 评论 -
c++定义抽象数据类型(其它)
一、构造函数1.每个类都定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数称为构造函数,只要类的对象被创建,就会执行构造函数2.构造函数没有返回类型;构造函数不能被声明成const的,当我们创建类的一个const对象时,直到构造函数完成初始化过程,对象才能真正获取const性质3.类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数,这个函数无需任何实参。编译器创建的构造函数又称为合成的默认构造函数,规则如下:如果存在类内的初始值,用原创 2022-03-06 20:48:59 · 687 阅读 · 0 评论 -
c++定义抽象数据类型(成员函数)
一、成员函数1.成员函数的声明必须在类内,但是定义可以在类外string cmb(string s1,string s2){ return s1 + s2;}struct date{ int x, y; int xx() { return x; } string cmb(string s1, string s2);};2.在上述类中,xx函数返回x的值是通过名为this的额外的隐式参数来实现的,将返回调用函数的对象下的x成员,具体过程如下:编译器把item的地址传给x原创 2022-03-06 19:31:34 · 710 阅读 · 0 评论 -
c++函数匹配、函数指针
一、函数匹配1.当几个重载函数的形参数量相同以及某些形参类型可以由其他类型转化的来,就需要函数匹配了二、函数指针1.把函数名作为一个值来使用,会被自动转为指针,在使用函数指针时无需解引用指针使用如下:int fx(int a){ return 666;}int (*pfx)(int a) = fx;//int (*pfx)(int a) = &fx; 等价int pp = pfx(1);2.函数指针形参3.返回指向函数的指针...原创 2022-03-05 21:14:46 · 242 阅读 · 0 评论 -
c++函数特殊操作
一、默认实参1.调用含有默认实参的函数时,可以省略函数实参(为默认值),使用如下void fx(int a, int degree = 37, char ch = '?')fx(1);fx(1,4,'#');2.只能省略后面的形参,因此常把常用的默认实参放在参数列表的后面3.函数声明:可以在声明处指定默认形参,但若已指定默认形参,则不可在声明处修改void fx(int a, int degree = 37, char ch = '?');void fx(int a, int原创 2022-03-05 20:43:43 · 116 阅读 · 0 评论 -
c++函数重载
1.如果同一个作用域内有几个函数名字相同但是形参列表不同,我们称之为重载函数,系统也是根据接受的形参类型来判断调用哪个函数void print(int a){ printf("%d", a);}void print(string s){ cout << s;}void solve(){ string ss="sad"; int aa = 1; print(aa); print(ss);}2.两种错误运用:形参类型相同,返回类型不同,编译错误;声明函数时原创 2022-03-04 21:20:05 · 357 阅读 · 0 评论 -
c++函数返回类型和return语句
一、无返回值函数1.return有两种形式:如果想中途退出可以写return语句(类似break);return后也可以跟表达式,不过必须是另一个返回void的函数二、有返回值函数1.返回一个值的方式和初始化一个变量的方式完全一样:返回的值用于初始化调用点的一个临时量,该临时量就是函数调用的结果2.和函数参数一样,如果函数返回引用,则该引用仅是他所引对象的一个别名,使用const xxx的引用不会真正拷贝对象const string& shortString(const str原创 2022-03-01 12:51:12 · 2910 阅读 · 0 评论 -
c++函数参数传递
一、传值参数1.指针形参和其他非引用类型一样,执行指针拷贝时,拷贝的是指针的值,拷贝之后,两个指针是不同的指针。由于指针可以使我们间接访问它所指向的对象,所以可以通过指针修改值void fx(int* a){ if (*a == 0) *a = 1;}二、传引用参数1.通过使用引用形参,允许函数改变一个或多个实参的值,形式如下void fx(int& a){ if (a == 0) a = 1;}//作用同上2.拷贝大的类类型对象或容器对象比较低效甚至原创 2022-02-28 20:15:22 · 846 阅读 · 0 评论 -
c++语句(跳转语句goto)
一、简单语句、条件语句、迭代语句二、跳转语句1.goto语句,不建议使用,除非是跳出多重循环,使用方法如下: for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (j == n - 2) goto bre; } }bre: return 0;三、try语句块和异常处理1.异常处理包括异常检测和异常处理这两部分协作,异常处理部分包括:throw表达式、try语句块、异常类...原创 2022-02-25 22:22:17 · 2124 阅读 · 0 评论 -
c++类型转换
一、隐式转换1.算术转换2.数组转换成指针:当数组被用作decltype的参数,或者作为取地址符、sizeof等运算符的运算对象时,不会转换3.指针的转换:0或者nullptr能转化成任意指针类型;指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*4.转成布尔类型:在if()、while()中条件自动转化成布尔类型5.转换成常量:允许指向非常量的指针转化成指向相应的常量类型的指针,引用也是这样6.类类型定义的转换:字符串字面值转化成striing原创 2022-02-24 20:27:47 · 242 阅读 · 0 评论 -
c++位运算符、sizeof运算符、逗号运算符
1.位运算对象如果是“小整形”,它的值会被自动提升成较大的整数类型2.运算对象可以带符号,但是其符号位如何处理是一种未定义行为,所以建议位运算用于处理无符号类型原创 2022-02-23 14:26:33 · 233 阅读 · 0 评论 -
c++成员访问运算符、条件运算符
一、成员访问运算符1.包括点运算符(.)和箭头运算符(->)2.解引用运算符优先级低于点运算符,故 *p.size() 不同于 (*p).size()3.箭头运算符作用于一个指针类型的运算对象,结果是一个左值。点运算符成员所属对象是左值那么结果是左值,成员所属对象是右值那么结果是右值二、条件运算符1.条件运算符优先级非常低,如果长表达式中嵌套需要加括号cout << ((grade < 60) ? "fail" : "pass");cout <<原创 2022-02-21 20:50:28 · 1122 阅读 · 0 评论 -
c++赋值运算符、递增和递减运算符
1.c++11中允许使用花括号括起来的初始化列表作为赋值语句的右侧运算对象。vector<int>a;a = { 1,2 };a = { 5,4 };2.赋值运算符包括复合赋值运算符的优先级都很低while ((c = getchar()) != '\n')a += 4 + 6;...原创 2022-02-21 20:18:16 · 554 阅读 · 0 评论