![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++入门教程,C++基础教程
文章平均质量分 69
睿科知识云
中国航天科工信息系统项目管理高级工程师
取得法律职业资格证书
希望和大家一起学习一起进步
展开
-
C++移动和获取文件读写指针(seekp、seekg、tellg、tellp)
C++移动和获取文件读写指针(seekp、seekg、tellg、tellp)在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件读指针的位置;ofstream 类和 fstream 类有 seekp 成员函数,可以设置文件写指针的位置。所谓“位置”,就是指距离文件开头有多少个字节。文件开头的位置是 0。这两个函数的原型如下:ostream & seekp原创 2022-02-15 12:04:23 · 2181 阅读 · 0 评论 -
C++ getline():从文件中读取一行字符串
C++ getline():从文件中读取一行字符串前一节中,详细介绍了如何使用 getline() 方法从 cin 输入流缓冲区中读取一行字符串。在此基础上,getline() 方法还适用于读取指定文件中的一行数据,本节就给大家做详细的讲解。我们知道,getline() 方法定义在 istream 类中,而 fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。当文件流对象调用 getline()原创 2022-02-15 12:01:45 · 13655 阅读 · 3 评论 -
C++ get()和put()读写文件详解
C++ get()和put()读写文件详解在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用 get() 和 put() 成员方法实现。C++ ostream::put()成员方法通过前一节的学习,读者掌握了如何通过执行 cout.put() 方法向屏幕输出单个字符。我们知道,fstream 和 ofstream 类继承自 ostream 类,因此 fstream 和 ofstream 类对象都可以调用 put() 方法。当 fstream原创 2022-02-15 11:58:07 · 1871 阅读 · 0 评论 -
C++ read()和write()读写二进制文件(超级详细)
C++ read()和write()读写二进制文件(超级详细)通过前一节的学习,读者了解了以文本形式读写文件和以二进制形式读写文件的区别,并掌握了用重载的 >> 和 << 运算符实现以文本形式读写文件。在此基础上,本节继续讲解如何以二进制形式读写文件。不过介绍具体的实现方法前,先给读者介绍一下相比以文本形式读写文件,以二进制形式读写文件有哪些好处?举个例子,现在要做一个学籍管理程序,其中一个重要的工作就是记录学生的学号、姓名、年龄等信息。这意味着,我们需要用一个类来表示学生,如原创 2022-02-15 11:54:50 · 20689 阅读 · 1 评论 -
C++文本文件读写操作详解
C++文本文件读写操作详解前面章节中,已经给大家介绍了文件流对象如何调用 open() 方法打开文件,并且在读写(又称 I/O )文件操作结束后,应调用 close() 方法关闭先前打开的文件。那么,如何实现对文件内容的读写呢?接下来就对此问题做详细的讲解。在讲解具体读写文件的方法之前,读者首先要搞清楚的是,对文件的读/写操作又可以细分为 2 类,分别是以文本形式读写文件和以二进制形式读写文件。我们知道,文件中存储的数据并没有类型上的分别,统统都是字符。所谓以文本形式读/写文件,就是直白地将文件中原创 2022-02-15 11:50:56 · 4508 阅读 · 0 评论 -
C++ close()关闭文件方法详解
C++ close()关闭文件方法详解前一节中,详细介绍了文件流对象如何调用 open() 成员方法打开指定文件。相对应地,文件流对象还可以主动关闭先前打开的文件,即调用 close() 成员方法。我们知道,调用 open() 方法打开文件,是文件流对象和文件之间建立关联的过程。那么,调用 close() 方法关闭已打开的文件,就可以理解为是切断文件流对象和文件之间的关联。注意,close() 方法的功能仅是切断文件流与文件之间的关联,该文件流并会被销毁,其后续还可用于关联其它的文件。close()原创 2022-02-14 16:00:07 · 3599 阅读 · 0 评论 -
C++ open 打开文件(含打开模式一览表)
C++ open 打开文件(含打开模式一览表)在对文件进行读写操作之前,先要打开文件。打开文件有以下两个目的:通过指定文件名,建立起文件和文件流对象的关联,以后要对文件进行操作时,就可以通过与之关联的流对象来进行。指明文件的使用方式。使用方式有只读、只写、既读又写、在文件末尾添加数据、以文本方式使用、以二进制方式使用等多种。打开文件可以通过以下两种方式进行:调用流对象的 open 成员函数打开文件。定义文件流对象时,通过构造函数打开文件。使用 open 函数打开文件先看第一种文件打开方式。以原创 2022-02-14 15:57:45 · 9489 阅读 · 1 评论 -
C++文件类(文件流类)及用法详解
C++文件类(文件流类)及用法详解重定向后的 cin 和 cout 可分别用于读取文件中的数据和向文件中写入数据。除此之外,C++ 标准库中还专门提供了 3 个类用于实现文件操作,它们统称为文件流类,这 3 个类分别为:ifstream:专用于从文件中读取数据;ofstream:专用于向文件中写入数据;fstream:既可用于从文件中读取数据,又可用于向文件中写入数据。值得一提的是,这 3 个文件流类都位于 头文件中,因此在使用它们之前,程序中应先引入此头文件。这 3 个文件流类的继承关系原创 2022-02-14 15:47:04 · 794 阅读 · 0 评论 -
计算机文件到底是什么(通俗易懂)?
计算机文件到底是什么(通俗易懂)?内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了“文件”的概念。一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。成千上万个文件如果不加分类放在一起,用户使用起来显然非常不便,因此又引入了树形目录(目录也叫文件夹)的机制,可以把文件放在不同的文件夹中,文件夹中还可以嵌套文件夹,这就便于用户对文件进行管理和使用,正如 Windows原创 2022-02-14 15:37:20 · 861 阅读 · 0 评论 -
cin.getline():C++读入一行字符串(整行数据)
cin.getline():C++读入一行字符串(整行数据)getline() 是 istream 类的成员函数,它有如下两个重载版本:istream & getline(char* buf, int bufSize);istream & getline(char* buf, int bufSize, char delim);第一个版本从输入流中读取 bufSize-1 个字符到缓冲区 buf,或遇到\n为止(哪个条件先满足就按哪个执行)。函数会自动在 buf 中读入数据的结尾添加原创 2022-02-14 15:35:09 · 2413 阅读 · 0 评论 -
cin.get():C++读取单个字符
cin.get():C++读取单个字符get() 是 istream 类的成员函数,它有多种重载形式,不过本文只介绍最简单最常用的一种:int get();此函数从输入流中读入一个字符,返回值就是该字符的 ASCII 码。如果碰到输入的末尾,则返回值为 EOF。EOF 是 End of File 的缩写。istream 类中从输入流(包括文件)中读取数据的成员函数,在把输入数据都读取完后再进行读取,就会返回 EOF。EOF 是在 iostream 类中定义的一个整型常量,值为 -1。get()原创 2022-02-14 15:32:05 · 1129 阅读 · 0 评论 -
C++ cout格式化输出(超级详细)
C++ cout格式化输出(超级详细)在某些实际场景中,我们经常需要按照一定的格式输出数据,比如输出浮点数时保留 2 位小数,再比如以十六进制的形式输出整数,等等。对于学过 C 语言的读者应该知道,当使用 printf() 函数输出数据时,可以通过设定一些合理的格式控制符,来达到以指定格式输出数据的目的。例如 %.2f 表示输出浮点数时保留 2 位小数,%#X 表示以十六进制、带 0X 前缀的方式输出整数。C++ 通常使用 cout 输出数据,和 printf() 函数相比,cout 实现格式化输出数原创 2022-02-14 15:29:13 · 18372 阅读 · 0 评论 -
C++ cout.tellp()和cout.seekp()方法详解
C++ cout.tellp()和cout.seekp()方法详解通过前面章节的学习我们知道,无论是使用 cout 输出普通数据,用 cout.put() 输出指定字符,还是用 cout.write() 输出指定字符串,数据都会先放到输出流缓冲区,待缓冲区刷新,数据才会输出到指定位置(屏幕或者文件中)。值得一提的是,当数据暂存于输出流缓冲区中时,我们仍可以对其进行修改。ostream 类中提供有 tellp() 和 seekp() 成员方法,借助它们就可以修改位于输出流缓冲区中的数据。C++ tell原创 2022-02-14 15:21:09 · 986 阅读 · 0 评论 -
C++ cout.write():输出字符串
C++ cout.write():输出字符串前一节中,讲解了 ostream 类提供的 put() 成员方法的用法,其用于向输出流缓冲区中添加要输出的单个字符。而在某些场景中,我们还需要输出指定的字符串,这时可以使用 ostream 类提供的 write() 成员方法。write() 成员方法专用于向输出流缓冲区中添加指定的字符串,初学者可以简单的理解为输出指定的字符串。其语法格式如下:ostream&write(const char * s,streamsize n);其中,s 用于指定某个长度原创 2022-02-14 15:14:46 · 752 阅读 · 0 评论 -
C++ cout.put():输出单个字符
C++ cout.put():输出单个字符通过前面的学习我们知道,C++ 程序中一般用 ostream 类的 cout 输出流对象和 << 输出运算符实现输出,并且 cout 输出流在内存中有相应的缓冲区。但有时用户还有特殊的输出需求,例如只输出一个字符,这种情况下可以借助该类提供的 put() 成员方法实现。put() 方法专用于向输出流缓冲区中添加单个字符,其语法格式如下:ostream&put(char c);其中,参数 c 为要输出的字符。可以看到,该函数会返回一个 ostr原创 2022-02-14 15:09:39 · 1464 阅读 · 0 评论 -
C++输入流和输出流(超级详细)
C++输入流和输出流(超级详细)C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案:使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据;使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。要知道,C 语言的这套 I/O原创 2022-02-13 09:36:16 · 7697 阅读 · 0 评论 -
C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符)
C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符)隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。再者,C风格的强制类型转换统一使用( ),而( )在代码中随处可见,所以也不利于使用文本检索工具(例如 Windows 下的 Ctrl+F、Linux 下的原创 2022-02-13 09:30:31 · 710 阅读 · 0 评论 -
C++类型转换函数:将当前类的类型转换为其它类型
C++类型转换函数:将当前类的类型转换为其它类型转换构造函数能够将其它类型转换为当前类类型(例如将 double 类型转换为 Complex 类型),但是不能反过来将当前类类型转换为其它类型(例如将 Complex 类型转换为 double 类型)。C++ 提供了类型转换函数(Type conversion function)来解决这个问题。类型转换函数的作用就是将当前类类型转换为其它类型,它只能以成员函数的形式出现,也就是只能出现在类中。类型转换函数的语法格式为:operator type(){原创 2022-02-13 09:25:56 · 592 阅读 · 0 评论 -
C++转换构造函数:将其它类型转换为当前类的类型
C++转换构造函数:将其它类型转换为当前类的类型在 C/C++ 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。自动类型转换示例:int a = 6;a = 7.5 + a;编译器对 7.5 是作为 double 类型处理的,在求解表达式时,先将 a 转换为 double 类型,然后与 7.5 相加,得到和为 13.5。在向整型变量 a 赋值时,将 13.5 转换为整数 13,然后赋给 a。整个过程中,我们原创 2022-02-13 09:23:44 · 669 阅读 · 0 评论 -
C++重载=(赋值运算符)
C++重载=(赋值运算符)在前一节中,我们讲解了初始化和赋值的区别:在定义的同时进行赋值叫做初始化(Initialization),定义完成以后再赋值(不管在定义的时候有没有赋值)就叫做赋值(Assignment)。初始化只能有一次,赋值可以有多次。当以拷贝的方式初始化一个对象时,会调用拷贝构造函数;当给一个对象赋值时,会调用重载过的赋值运算符。即使我们没有显式的重载赋值运算符,编译器也会以默认地方式重载它。默认重载的赋值运算符功能很简单,就是将原有对象的所有成员变量一一赋值给新对象,这和默认拷贝构造原创 2022-02-13 09:19:41 · 5778 阅读 · 0 评论 -
C++深拷贝和浅拷贝(深复制和浅复制)完全攻略
C++深拷贝和浅拷贝(深复制和浅复制)完全攻略对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如:class Base{public: Base(): m_a(0), m_b(0){ } Base(int a, int b): m_a(a), m_b(b){ }private: int m_a; int m_b;};int main(){ int a = 10; int b = a; //拷贝 Base ob原创 2022-02-13 09:17:33 · 3049 阅读 · 0 评论 -
C++拷贝构造函数(复制构造函数)详解
C++拷贝构造函数(复制构造函数)详解拷贝和复制是一个意思,对应的英文单词都是copy。对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。在 C++ 中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对象创建出一个新的对象。从本质上讲,对象也是一份数据,因为它会占用内存原创 2022-02-13 09:14:56 · 2564 阅读 · 1 评论 -
C++ exception类:C++标准异常的基类
C++ exception类:C++标准异常的基类C++语言本身或者标准库抛出的异常都是 exception 的子类,称为标准异常(Standard Exception)。你可以通过下面的语句来捕获所有的标准异常:try{//可能抛出异常的语句 }catch(exception &e){//处理异常的语句 }之所以使用引用,是为了提高效率。如果不使用引用,就要经历一次对象拷贝(要调用拷贝构造函数)的过程。exception 类位于 头文件中,它被声明为:class excepti原创 2022-02-13 09:10:36 · 712 阅读 · 0 评论 -
C++异常类型以及多级catch匹配
C++异常类型以及多级catch匹配首先来回顾一下上节讲到的 try-catch 的用法:try{ // 可能抛出异常的语句}catch(exceptionType variable){ // 处理异常的语句}我们还遗留下一个问题,就是 catch 关键字后边的exceptionType variable,这节就来详细分析一下。exceptionType是异常类型,它指明了当前的 catch 可以处理什么类型的异常;variable是一个变量,用来接收异常信息。当程序抛出异常时原创 2022-02-13 09:00:22 · 866 阅读 · 0 评论 -
C++异常处理入门,C++ try catch入门
C++异常处理入门,C++ try catch入门开发程序是一项“烧脑”的工作,程序员不但要经过长期的知识学习和思维训练,还要做到一丝不苟,注意每一个细节和边界。即使这样,也不能防止程序出错。专家指出,长期作息不规律 + 用脑过度的危害很大,可能会诱发神经衰弱、失眠等疾病。我就是受害者之一,曾被失眠困扰了好几年,不但入睡困难,还容易早醒。程序员要注意劳逸结合,多去健身房,多跑步,多打球,多陪女朋友旅游等,千万不要熬夜,以为深夜写代码效率高,这样会透支年轻的身体。程序的错误大致可以分为三种,分别是语法错原创 2022-02-11 10:31:00 · 163 阅读 · 0 评论 -
大话C++模板编程的来龙去脉
大话C++模板编程的来龙去脉计算机编程语言种类繁多,目前能够查询到的有 600 多种,常用的不超过 20 种,TIOBE 每个月都会发布世界编程语言排行榜,统计前 50 名编程语言的市场份额以及它们的变动趋势。该榜单反映了编程语言的热门程度,程序员可以据此来检查自己的开发技能是否跟得上趋势,公司或机构也可以据此做出战略调整。这些编程语言根据不同的标准可以分为不同的种类,根据“在定义变量时是否需要显式地指明数据类型”可以分为强类型语言和弱类型语言。1) 强类型语言强类型语言在定义变量时需要显式地指明数原创 2022-02-11 10:21:18 · 219 阅读 · 0 评论 -
C++类模板5分钟入门教程
C++类模板5分钟入门教程C++ 除了支持函数模板,还支持类模板(Class Template)。函数模板中定义的类型参数可以用在函数声明和函数定义中,类模板中定义的类型参数可以用在类声明和类实现中。类模板的目的同样是将数据的类型参数化。声明类模板的语法为:template<typename 类型参数1 , typename 类型参数2 , …> class 类名{ //TODO:};类模板和函数模板都是以 template 开头(当然也可以使用 class,目前来讲它们没有原创 2022-02-11 10:18:43 · 170 阅读 · 0 评论 -
C++函数模板5分钟入门教程
C++函数模板5分钟入门教程在之前的章节中,为了交换不同类型的变量的值,我们通过函数重载定义了四个名字相同、参数列表不同的函数,如下所示://交换 int 变量的值void Swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}//交换 float 变量的值void Swap(float *a, float *b){ float temp = *a; *a = *b; *b = temp;原创 2022-02-11 10:15:48 · 119 阅读 · 0 评论 -
C++运算符重载注意事项以及汇总
C++运算符重载注意事项以及汇总在 C++ 中进行运算符重载时,有以下问题需要注意:重载后运算符的含义应该符合原有用法习惯。例如重载+运算符,完成的功能就应该类似于做加法,在重载的+运算符中做减法是不合适的。此外,重载应尽量保留运算符原有的特性。C++ 规定,运算符重载不改变运算符的优先级。以下运算符不能被重载:.、.*、::、? :、sizeof。重载运算符()、[]、->、或者赋值运算符=时,只能将它们重载为成员函数,不能重载为全局函数。运算符重载的实质是将运算符重载为一个函数,使用运原创 2022-02-11 10:03:19 · 533 阅读 · 0 评论 -
C++重载()(强制类型转换运算符)
C++重载()(强制类型转换运算符)在 C++ 中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。经过适当重载后,(类型名)对象这个对对象进行强制类型转换的表达式就等价于对象.operator 类型名(),即变成对运算符函数的调用。下面的程序对 double 类型强制转换运算符进行了重载。#include <iostream>using namespace std;class原创 2022-02-11 10:02:08 · 494 阅读 · 0 评论 -
C++重载new和delete运算符详解
C++重载new和delete运算符详解内存管理运算符 new、new[]、delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数。一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内存时才会重载。以成员函数的形式重载 new 运算符:void * className::operator new( size_t size ){ //TODO:}以全局函数的形式重载 new 运算符:void * operator new( size原创 2022-02-11 10:00:19 · 521 阅读 · 0 评论 -
C++重载++和--(自增和自减运算符)详解
C++重载++和–(自增和自减运算符)详解自增++和自减–都是一元运算符,它的前置形式和后置形式都可以被重载。请看下面的例子:#include <iostream>#include <iomanip>using namespace std;//秒表类class stopwatch{public: stopwatch(): m_min(0), m_sec(0){ }public: void setzero(){ m_min = 0; m_sec = 0;原创 2022-02-11 09:58:30 · 570 阅读 · 0 评论 -
C++重载[](下标运算符)详解
C++重载[](下标运算符)详解C++ 规定,下标运算符[ ]必须以成员函数的形式进行重载。该重载函数在类中的声明格式如下:返回值类型 & operator[ ] (参数);或者:const 返回值类型 & operator[ ] (参数) const;使用第一种声明方式,[ ]不仅可以访问元素,还可以修改元素。使用第二种声明方式,[ ]只能访问而不能修改元素。在实际开发中,我们应该同时提供以上两种形式,这样做是为了适应 const 对象,因为通过 const 对象只能调用原创 2022-02-11 09:56:49 · 9058 阅读 · 0 评论 -
C++重载>>和<<(输入和输出运算符)详解
C++重载>>和<<(输入和输出运算符)详解在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面的 comple原创 2022-02-11 09:54:08 · 7062 阅读 · 4 评论 -
C++重载数学运算符(实例演示)
C++重载数学运算符(实例演示)四则运算符(+、-、、/、+=、-=、=、/=)和关系运算符(>、<、<=、>=、==、!=)都是数学运算符,它们在实际开发中非常常见,被重载的几率也很高,并且有着相似的重载格式。本节以复数类 Complex 为例对它们进行重载,重在演示运算符重载的语法以及规范。复数能够进行完整的四则运算,但不能进行完整的关系运算:我们只能判断两个复数是否相等,但不能比较它们的大小,所以不能对 >、<、<=、>= 进行重载。下面是具体的代码原创 2022-02-10 12:24:22 · 548 阅读 · 0 评论 -
C++运算符重载时要遵循的规则
C++运算符重载时要遵循的规则运算符重载是通过函数重载实现的,概念上大家都很容易理解,这节我们来说一下运算符重载的注意事项。并不是所有的运算符都可以重载。能够重载的运算符包括:、+ - * / % ^ & | ~ ! = < > += -= = /= %= ^= &= |= << >> <<= >>= == != <= >= && ||原创 2022-02-10 12:22:53 · 472 阅读 · 0 评论 -
C++运算符重载基础教程
C++运算符重载基础教程所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。实际上,我们已经在不知不觉中使用了运算符重载。例如,+号可以对不同类型(int、float 等)的数据进行加法操作;<<既是位移运算符,又可以配合 cout 向控制台输出数据。C++ 本身已经对这些运算符进行了重载。C++ 也允许程序员原创 2022-02-10 12:20:34 · 165 阅读 · 0 评论 -
C++ typeid运算符:获取类型信息
C++ typeid运算符:获取类型信息typeid 运算符用来获取一个表达式的类型信息。类型信息对于编程语言非常重要,它描述了数据的各种属性:对于基本类型(int、float 等C++内置类型)的数据,类型信息所包含的内容比较简单,主要是指数据的类型。对于类类型的数据(也就是对象),类型信息是指对象所属的类、所包含的成员、所在的继承关系等。类型信息是创建数据的模板,数据占用多大内存、能进行什么样的操作、该如何操作等,这些都由它的类型信息决定。typeid 的操作对象既可以是表达式,也可以是数据类原创 2022-02-10 12:17:58 · 248 阅读 · 0 评论 -
C++纯虚函数和抽象类详解
C++纯虚函数和抽象类详解在C++中,可以将虚函数声明为纯虚函数,语法格式为:virtual 返回值类型 函数名 (函数参数) = 0;纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。原因很明显,纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空原创 2022-02-10 12:08:55 · 419 阅读 · 0 评论 -
C++虚函数注意事项以及构成多态的条件
C++虚函数注意事项以及构成多态的条件C++ 虚函数对于多态具有决定性的作用,有虚函数才能构成多态。上节我们已经介绍了虚函数的概念,这节我们来重点说一下虚函数的注意事项。只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。为了方便,你可以只将基类中的函数声明为虚函数,这样所有派生类中具有遮蔽关系的同名函数都将自动成为虚函数。当在基类中定义了虚函数时,如果派生类没有定义新的函数来遮蔽此函数,那么将使用基类的虚函数。只有派生类的虚函数覆盖基类的虚函数(函数原原创 2022-02-10 12:06:39 · 245 阅读 · 0 评论