C++基础
文章平均质量分 63
C++语言基础专栏,专为初学者及寻求巩固基础知识的程序员设计。本专栏系统讲解C++语言的核心概念,包括数据类型、运算符、控制结构、函数、数组、指针、字符串处理等基础知识,同时深入解析面向对象编程思想,涵盖类与对象、继承、多态、封装等高级特性。通过实例分析与代码演练,帮助读者掌握C++编程技能,为进阶
棉猴
这个作者很懒,什么都没留下…
展开
-
C++中容器迭代器的基本使用方法3-3
1 迭代器与整形的加减运算C++中的容器迭代器加上或者减去一个整型值,仍然是一个迭代器。这个新的迭代器相对原来的迭代器向前或者向后移动了若干个位置。如果是加上一个整型值,则迭代器会向前移动,减去一个整型值,则迭代器会向后移动,该整型值即为移动的位置。如下代码为迭代器与整形加减运算的基本使用方法。vector<int> v1 = { 0,1,2,3,4,5 };vector<int>::iteratorit_begin = v1.begin();vector<.原创 2022-02-16 11:37:09 · 2277 阅读 · 0 评论 -
C++中容器迭代器的基本使用方法3-2
1 简介在C++中,用“*”表示解引用运算符。在《C++中容器迭代器的基本使用方法1》中提到,迭代器的ptr变量实际上就是一个指针,该指针指向了迭代器表示的元素。因此,在容器迭代器中使用解引用运算符,与在指针上使用解引用运算符类似,其的作用是返回该迭代器所指元素的引用。2 使用使用解引用运算符的代码如图1所示。图1 使用解引用运算符此时,*it_begin表示对迭代器it_begin进行解引用运算,其值是it_begin指向的元素,此时变量i的值是0。还可以通过解引用运算符改变容原创 2021-11-11 17:02:57 · 2973 阅读 · 1 评论 -
C++中容器迭代器的基本使用方法3-1
可以通过迭代器访问vector容器或者string中的元素。用vector<T>::iterator来表示迭代器。1 begin()函数和end()函数通过vector类的begin()和end()方法可以获取iterator。其中由begin()获取到的iterator叫做起始迭代器,由end()获取到的iterator叫做超出末端迭代器。起始迭代器指向vector保存的第一个数据,超出末端迭代器指向vector保存的最后一个数据的“下一个数据”。2 相关代码相关代码如图1所示原创 2021-11-02 16:32:15 · 594 阅读 · 0 评论 -
C++中vector的使用方法5
1 常量vector使用const关键字可以定义常量vector,此时vector中的元素都是常量元素。constvector<int> vec1 = { 1,2,3,4,5 };以上将vec1定义为常量vector,其元素均为常量元素。vec1[0]++;以上代码编译时报错,报错信息为“ error C3892: “vec1”: 不能给常量赋值”。2 常量迭代器2.1 常量vector的常量迭代器《C++中vector的使用方法1》中提到使用迭代器可以访问.原创 2021-05-11 12:19:13 · 1172 阅读 · 0 评论 -
C++中vector的使用方法4
1 使用索引访问vector中的对象1.1 索引值在合理范围之内可以使用索引访问vector中的对象,需要注意的是此时的索引变量的类型是相应的size_type。vector<int> vec1 = { 1,2,3,4,5 };vector<int>::size_typest = 2;cout <<vec1[st];其中,vec1是一个有5个int元素的vector,st是vector<int>::size_type类型的变量,用来表..原创 2021-04-30 09:34:11 · 1120 阅读 · 0 评论 -
C++中vector的使用方法3
1 判断vector是否是空通过成员函数empty()判断vector中的元素是否是空,返回值是bool类型,如果vector中没有元素,则返回值是true,否则是false。vector<int> vec1 = { 1,2,3,4,5 };boolisempty = vec1.empty();其中,vec1是整数类型的vector,包含5个元素,因此此时isempty的值是false。2 获取vector中元素的个数通过size()函数获取vector中元素的个数,返.原创 2021-04-17 11:48:18 · 4077 阅读 · 0 评论 -
C++中vector的使用方法2
在《C++中vector的使用方法1》中提到,迭代器作为for循环的控制表达式时,可以遍历vector中的所有元素。1 范围for语句除了上面提到的传统的for循环语句之外,C++11中还引入了一种更简单的for语句,叫做范围for语句。使用这种语句可以遍历vector内的所有元素,该语句的语法格式为for (declaration :expression){statement;}其中,declaration定义了一个变量,expression表示的是一个容器,比如vector...原创 2021-04-08 09:07:42 · 721 阅读 · 0 评论 -
C++中vector的使用方法1
vector表示对象的集合,其中所有对象的类型都相同。1 vector与数组的关系vector与数组的相同点在于都使用连续的存储空间来保存数据,这就意味着可以很快速地查找数组;不同点在于数组的大小确定之后就不能发生变化,而vector中保存数据的存储空间可以动态变化。2 所需头文件vector对应的头文件是vector,其在命名空间std中声明,因此在使用vector时,需要有如下代码:#include <vector>using std::vector;3 vect原创 2021-04-02 09:51:01 · 460 阅读 · 0 评论 -
C++中sstream类
C++中的sstream类用来操作string,可以向string中写入数据,也可以从string中读取数据。该类在sstream头文件中定义。该类可以分为istringstream和ostringstream,其中istreamstream用来从string中读取数据;而ostringstream用来向string中写入数据。1 istringstream1.1 定义istringstream类的对象可以使用两种方法定义istringstream类的对象istringstreamiss.原创 2021-03-29 12:28:47 · 1645 阅读 · 0 评论 -
C++中fstream流2-2
1 ifstream和ofstream默认访问权限在《C++中fstream流2-1》中提到,fstream流的构造函数的第二个参数表示访问文件的权限,默认权限是读(ios_base::in)和写(ios_base::out)。对于ifstream来说,其构造函数的默认访问权限是读;而对于ofstream来说,其默认构造函数的访问权限是写。2 ofstream的截断权限使用ofstream流向指定文件写入对象时,如果将流具有截断权限,则在写入内容之前,会清空文件中的原内容。截断权限用ios_ba原创 2021-03-20 11:30:28 · 771 阅读 · 0 评论 -
C++中的fstream流2-1
当要读写一个文件时,可以使用fstream流,该流可以对指定文件进行读写操作。fstream流在fstream头文件中定义,该头文件中还定义了另外两个类型ifstream和ofstream,其中ifstream用来对指定文件进行读操作,而ofstream对指定文件进行写操作。以上三个类的操作与iostream类的操作类似,可以使用<<和>>等IO运算符。fstream流、ifstream流和ofstream流的使用方法基本相同。1 定义文件流的对象在定义文件流的对象时,可以指原创 2021-03-05 11:51:24 · 264 阅读 · 0 评论 -
C++的输出缓冲区2-2
1 自动关联输入流cin与输出流cout通常情况下,当从输入流cin中读取数据之前,都会使用输出流cout显示一个提示信息,inti;cout <<"请输入一个整数:";cin >>i;在输入整数之前,在控制台中会显示提示信息。在“C++的缓冲区2-1”中提到,输出流cout是与缓冲区关联的,也就是说提示信息“请输入一个整数:”先被保存到与cout关联的缓冲区中,然后在被输出。因此,我们必须保证从输入流cin中读取数据之前就要能够输出流cout缓冲区中的数据被...原创 2021-03-03 09:56:36 · 347 阅读 · 6 评论 -
C++的输出流缓冲区2-1
C++中的输出流都与一个缓冲区关联,通过该输出流输出的数据,可能会直接从设备上输出,也可能先被保存到这个关联的缓冲区中,之后从设备上输出。1 输出流缓冲区的优势由于从设备上输出数据是一个很耗时的操作,因此将输出流与缓冲区关联,将多个要输出的数据先保存到缓冲区中,之后使用一次输出操作即可。也就是说,输出流的缓冲区机制将多个输出操作组合成单一的输出操作,节省了输出时间。2 刷新输出流缓冲区的方法当对输出流缓冲区进行刷新时,就可以将缓冲区的数据在设备上输出了。2.1 显式刷新缓冲区可以使用原创 2021-02-24 09:19:54 · 503 阅读 · 0 评论 -
C++中输入流istream状态管理3
在《C++中输入流istream状态管理2》中提到,rdstate()成员函数可以获取流当前的状态,即ios_base::iostate。1 ios_base::iostate的状态值ios_base::iostate对应的状态有ios_base::goodbit、ios_base::eofbit、ios_base::badbit和ios_base::failbit。ios_base::iostate是四个字节,即32位的变量,在xiosbase中定义。ios_base::goodbit、ios_b原创 2021-01-18 10:26:16 · 1002 阅读 · 1 评论 -
C++中输入流istream状态管理2
在《C++中输入流istream状态管理1》中提到,流有四个状态位,分别是badbit、eofbit、failbit和goodbit。这四个状态位表示流的当前状态,分别可以由good()、eof()、fail()和bad()等成员函数获取。通过rdstate()成员函数可以获取以上四个状态位的组合。1 作用rdstate()成员函数可以获取流当前的状态。该函数的返回值的类型是ios_base::iostate,是badbit、eofbit、failbit和goodbit四个状态位的组合,当对应的状态原创 2021-01-04 10:48:13 · 694 阅读 · 0 评论 -
C++中stringstream类4
在使用stringstream类时,不能对其进行拷贝或赋值。1.不能赋值或拷贝istringstreamiss1("1234");istringstreamiss2 = iss1;istringstreamiss3(iss1);此时,编译器的报错信息为 error C2280: 尝试引用已删除的函数。2.函数参数和返回值不能是stringstream类因为不能拷贝stringstream类,因此不能将函数参数或返回值设置为stringstream类。voidmyFun...原创 2020-12-30 10:33:35 · 397 阅读 · 0 评论 -
C++中stringstream类3
可以使用tellp()函数和tellg()函数获取输入输出流当前的位置。其中,tellp()中的p表示put,对应的是输出流的位置;tellg()中的g表示get,对应的输入流的位置。1 tellp()函数ostringstreamoss;streamposi =oss.tellp();其中,oss是输入字符串流ostringstream类的对象,通过该对象调用tellp()函数获取输出流的当前位置,该函数的返回值类型是streampos,表示流的位置。streampos中有一个_in...原创 2020-12-25 11:13:20 · 799 阅读 · 0 评论 -
C++中stringstream类2
在《C++中stringstream类1》中提到,输入字符串流和输出字符串流对应的类分别是istringstream和ostringstream。stringstream类是输出输出字符串流,既可以实现输出功能又可以实现输入功能。通过stringstream类可以实现C++中内嵌类型的相互转换。1 string与int的互相转换stringstreamsstr;inta;stringstr("100");sstr <<str;sstr >>a;在《C+...原创 2020-12-22 10:13:14 · 158 阅读 · 0 评论 -
C++中stringstream类1
C++中与控制台相关的输入输出流是iostream类、istream类和ostream类。cin和cout是istream类和ostream类的对象,分别向控制台读取和写入数据。除了对控制台进行IO操作外,还需要对字符串进行IO操作,这就需要另外的输入输出流类stringstream、istringstream和ostringstream。以上三种类型在头文件sstream中定义。1 字符串输入流类istringstream可以使用以下代码定义字符串输入流类的对象istringstreami.原创 2020-12-16 10:38:14 · 517 阅读 · 2 评论 -
C++中类的静态成员3-3
1 静态自身类型的成员变量可以声明为类类型在《C++中类的前向声明》中提到,在类中定义自身类型的成员变量时,由于类还没有定义完全,所以只能将该成员变量定义为自身类型的指针或引用。classMyClass{ MyClass*m_mc1; MyClass&m_mc2; staticMyClasss_mc;};其中,m_mc1的类型是MyClass类的指针;m_mc2的类型是MyClass类的引用。而对于静态成员s_mc来说,可以将其直接声明为MyClass类...原创 2020-12-14 10:44:27 · 384 阅读 · 0 评论 -
C++中类的静态成员3-2
在《C++中类的静态成员2-1》中提到,类的静态成员变量不能在类内部定义。当类的静态成员变量是constexpr时,可以在类中为其提供整数类型的类内初始值。1 constexpr的静态成员可以进行类内定义classmyClass{ public: staticconstexprinti = 2; inta[i];};其中,类myClass的静态成员变量i是constexpr,因此可以在类内部对其进行定义,而数组a是一个维度是i的int数组,编译器此时将i...原创 2020-12-12 09:59:43 · 259 阅读 · 0 评论 -
C++中类的静态成员3-1
C++类的普通成员变量与成员函数是与该类的对象有关,类的静态成员与对象无关,而与该类本身相关。1 静态成员的声明使用关键字static修饰的成员是类的静态成员。静态成员可以被声明成public或private,静态成员可以是常量、引用、指针、类类型和函数等。2 静态成员的定义2.1 静态函数的定义2.1.1 类外部定义静态函数时不能使用static可以在类的内部定义静态函数,也可以在类的外部定义静态函数。需要注意的是,static关键字只能在类内部出现,而在类外部定义静态函数时,不能原创 2020-12-11 10:52:57 · 276 阅读 · 4 评论 -
C++中字面值常量类
1 字面值类型C++中把一般都比较简单,值也显而易见、容易得到的类型称作“字面值类型”。例如,算术类型、引用和指针都属于字面值类型。2 字面值常量类2.1 聚合类与字面值常量类数据成员都是字面值类型的聚合类是字面值常量类。classmyClass{ public: inti; charch;};其中,myClass是字面值常量类。关于聚合类的相关内容,请参考《C++中的聚合类》。2.2 constexpr构造函数字面值常量类必须至少提供一个 c...原创 2020-12-09 10:57:29 · 941 阅读 · 0 评论 -
C++中strtol函数的使用方法
1 作用strtol()函数的作用是将字符串类型转换为相应的long类型。2 格式strtol()函数的格式为long strtol( const char *string, char **end_ptr, int base );其中,参数string是要转换的字符串,end_ptr是字符串的指针,该指针指向了参数string中没有被转换的部分,如果不需要该参数,可以将其设置为NULL;参数base表示转换的进制。如果转换成功,strtol()函数的返回值是转换后的long类型的值,如原创 2020-12-04 10:56:31 · 13753 阅读 · 0 评论 -
C++中constexpr函数
1 简介constexpr函数指的是在编译的时候就能得到其返回值的函数,也就是说编译器将constexpr函数直接转换成其返回值,因此,constexpr函数都是被隐式地定义为内联函数。使用constexpr关键字来修饰constexpr函数。2 使用方法有如下代码:constexprintmyFunc(){ return1;}constexprinti = myFunc() * 4;此时,编译器会将myFunc()函数用其返回值1来代替,在编译时就可知i的值是4。...原创 2020-12-02 10:27:16 · 14751 阅读 · 15 评论 -
C++中的聚合类
1 定义C++中的聚合类满足以下条件(1)所有成员都是public(2)没有定义任何构造函数(3)没有类内初始值(4)没有基类和虚函数。2 用途聚合类可以使得用户直接访问其成员。classMyClass{ public: intm_i; charm_ch;};其中,MyClass满足聚合类的条件,是一个聚合类。可以通过以下代码为MyClass创建对象。MyClassmc = { 1, 'a'};此时,mc.m_i的值是1,mc.m_ch的值是...原创 2020-11-27 15:30:41 · 1742 阅读 · 0 评论 -
C++中的转换构造函数2-2
C++的转换构造函数可以将构造函数参数类型隐式地转换为类类型。可以使用explicit关键字来禁止这种默认的类型转换。1 explicit关键字用explicit关键字修饰转换构造函数,MyClass类的代码如下所示classMyClass{ public: intm_i; public: explicitMyClass(inti) { m_i = i; }};此时,MyClass类的转换构造函数被定义为explicit。再...原创 2020-11-25 10:35:33 · 477 阅读 · 0 评论 -
C++中的转换构造函数2-1
1 定义C++中的转换构造函数指的是只包含一个实参的构造函数。可以通过该构造函数实现从构造函数参数类型向类类型的隐式转换。2 实例以下自定义类MyClass的代码classMyClass{ public: intm_i; public: MyClass(inti) { m_i = i; }};其中,MyClass的构造函数只有一个int类型的形参,此时可以通过该构造函数实现int类型向MyClass类型的隐式转换。...原创 2020-11-24 10:13:39 · 275 阅读 · 0 评论 -
C++中类的默认构造函数调用的时机
1 不指定类对象的初始值时当不使用任何初始值定义一个类的非静态变量时,会调用该类的默认构造函数。Aa;此时,会调用类A的默认构造函数。在《C++中类的合成默认构造函数2-1》https://blog.csdn.net/hou09tian/article/details/108072603中提到,如果类中没有显式地定义默认构造函数,则C++编译器会为其创造一个合成的默认构造函数,如果类中已经定义了其他格式的构造函数,此时C++编译器不会再为其合成默认构造函数。所以,如果此时类A的定义为c.原创 2020-11-17 11:06:28 · 3864 阅读 · 0 评论 -
C++中委托构造函数
在C++中,假设有如下定义的类classmyClass{public: inti; charch; doubled; myClass(inti= 0, charch= ' ', doubled= 0.0):i(i), ch(ch), d(d) { }};其中,自定义类myClass的构造函数中,每个参数都有默认值,该构造函数相当于默认构造函数。1 仅指定类中某个成员变量的值当想要为某一成员变量赋初值时,可以使用如下方法myClassmc...原创 2020-11-14 10:44:02 · 380 阅读 · 0 评论 -
C++构造函数初始化变量的顺序
在《C++中类的构造函数初始值列表》中提到,C++中类的构造函数初始值列表可以对类的成员进行初始化。1 构造函数的初始化列表只是说明各变量的初始值但是需要注意的是,构造函数的初始化列表只是说明各变量的初始值,并没有指定变量的初始化顺序。其中,myClass类构造函数的初始化列表只是说明了变量i的初始值是1,变量j的初始值是i的值。但是并不一定是先初始化i而后初始化j。classmyClass{public: intj; inti; myClass():i(1), j(...原创 2020-11-11 09:54:49 · 1546 阅读 · 0 评论 -
C++中类的构造函数初始值列表
1 通过构造函数初始值列表来初始化成员变量C++中类的构造函数初始值列表可以对类的成员进行初始化。classmyClass{ public: inti; myClass(): i(1) { }};其中,类myClass的构造函数中包含了初始值列表,对成员变量i进行初始化。2 通过构造函数的函数体来初始化成员变量除了通过构造函数初始值列表来初始化成员变量外,还可以通过构造函数的函数体来初始化成员变量。classmyClass{ public: i...原创 2020-11-10 11:01:38 · 901 阅读 · 5 评论 -
C++类成员函数中的名字查找
在C++类的成员函数中,名字查找是按照由内到外进行的。首先查找成员函数中的名字,之后再查找类中定义的名字,最后查找类外定义的名字。1 查找顺序自定义类MyClass代码如下inti = 1;classMyClass{ public: inti = 2; voidmyFunc() { inti = 3; intj =i; }};其中,在MyClass类的成员函数myFunc()中使用了变量i,而在myFunc()函数、My...原创 2020-10-24 11:40:16 · 1294 阅读 · 0 评论 -
C++中类中使用定义的类型别名
1 typedef定义类型别名1.1 使用方法在C++中,typedef关键字用来定义类型的别名。typedef intMYINT;此时,MYINT是int的别名,可以将MYINT作为数据类型来定义其他变量。MYINT myint;其中,myint的类型是MYINT 。1.2 注意事项不能使用typedef对类型别名MYINT进行重复定义。typedefintMYINT;typedefdoubleMYINT;此时,编译器报错,报错信息为“ erro...原创 2020-10-20 10:42:58 · 1763 阅读 · 0 评论 -
C++中类的名字查找
1 类的成员函数定义代码的名字查找C++中编译类代码时,首先编译类的所有声明,只有再编译类的成员函数的定义代码。也就是说,在类的成员函数的代码中,可以使用在其后声明的变量。classMyClass{ intgetValue() { returni; } inti;};在以上代码中,类MyClass的成员函数getValue()虽然定义在成员变量i之前,但是也可以使用该变量。2 类的成员函数声明代码的名字查找在编译成员函数声明的代码时,名字查找是从声明代码处...原创 2020-10-17 17:10:31 · 765 阅读 · 0 评论 -
C++中在类外部定义的成员函数
类的成员函数可以在类内部定义,也可以在类的外部定义。当定义在类的外部时,需要同时提供类名和函数名。1 类外部定义成员函数代码如下所示classMyClass{ voidmyFunc(); inti;};voidMyClass::myFunc() { i = 1;}此时类MyClass的成员函数myFunc()在MyClass类之外定义。虽然myFunc()函数看上去没有在类的作用域之内,但是由于提供了MyClass类,实际上这时myFunc()就已经在类的作用域之...原创 2020-10-14 10:22:21 · 14174 阅读 · 0 评论 -
C++中友元的使用4-4
定义友元函数的代码与声明友元的代码没有先后顺序,例如如下代码:classMyClass{ friendvoidf();};voidf() {}和voidf() {}classMyClass{friendvoidf();};以上两段代码等价。需要注意的是,如果在声明友元的类的内部使用该友元函数,必须要在类外部声明该函数,如果函数定义在类内部,此时也需要在类外部对该函数进行声明。classMyClass{ friendvoidf() {};...原创 2020-10-10 10:35:54 · 264 阅读 · 0 评论 -
C++中友元的使用方法(4-3)
在《C++中友元的使用4-1》中提到,可以将函数声明为类的友元,这个函数就可以访问该类的private成员。我们也可以将类B声明为类A的友元,这样,在类B中就可以访问类A的private成员了。1 将类声明为友元类A的定义如下所示classA{ private: inti{ 1 }; friendclassB;};在A的定义中,将类B声明为友元。类B的定义方式如下所示classB{ public: intgetValue() {...原创 2020-10-09 12:02:44 · 344 阅读 · 0 评论 -
C++中类的前向声明
在C++中可以只对类进行声明,而不对其进行定义,例如class MyClass;该声明会向程序引入名字MyClass并且指明MyClass是一种类类型。这种对类的声明叫做前向声明。1 使用前向声明1.1 声明指针或引用在声明了类之后,可以定义指向这种类的指针或引用。MyClass* pmc;MyClass& rmc = *pmc;此时,只是说明pmc是一个指针,该指针指向了MyClass,可以不必关心MyClass具体的结构,引用变量rmc的情况也是一样的。1.原创 2020-09-30 09:46:18 · 1423 阅读 · 0 评论 -
C++类的返回值是*this的成员函数
当C++类的成员函数其返回值是*this时,表示返回值是调用该成员函数的变量的引用。例如classA{public: A& func1() { return*this; }int i{0};}此时,类A的成员函数func1的返回值是*this,该成员函数的返回值类型是A&。1 返回值是左值func1()函数的返回值是类型A的引用,该返回值是左值。也就是说,此时返回的是调用该函数的对象本身,通过该返回值可以调用该对象的其他成员函数或者对其他成员变量...原创 2020-09-29 10:00:34 · 1780 阅读 · 0 评论