- 博客(38)
- 收藏
- 关注
原创 计算机概述
人们要让计算机做的工作可能是很复杂的,因而指挥计算机的程序也可能是庞大而复杂的,而且可能要经常对程序进行修改与完善。这些说明和资料(称之为文档)在计算机执行过程中可能是不需要的,但对于人们的阅读、修改、维护、交流这些程序是必不可少的。硬件系统也称为裸机。没有软件系统的计算机是无法工作的,计算机的功能不仅取决于硬件系统,而且在更大成是由安装的软件系统所决定的、计算机系统中硬件系统和软件系统互相依赖,不可分割。虽然计算机的发展速度是惊人的,但就其的结构原理来说,目前绝大对数计算机仍建立在存储程序概念的基础上。
2024-07-26 23:05:30
510
原创 C++文件流
如果程序没有用close()主动关闭文件,则在文件流对象退出其作用域时,被自动调用的析构函数会关闭该对象所联系的文件。ios_base::app 为添加数据而打开,从文件尾部开始写。可以通过构造函数或open函数的第二个参数,确定文件的打开模式。ios_base::ate 打开文件后定位于文件尾。注意在用字符串常量表示一个文件名时,文件路径的\必须表示为转义字符'\\'。参考《全国计算机等级考试二级教程——C++语言程序设计》
2024-07-25 23:51:49
280
原创 C++流的概念
当系统执行cout<<x操作时,首先根据x的类型调用相应的插入运算符重载函数,把x的值传送给对应的形参,接着执行函数体,把x的值输出到显示屏幕上,在当前屏幕光标位置显示,然后返回ostream流,以便继续使用插入运算符输出下一个表达式的值。当系统执行cin>>x操作时,将根据实参x的类型调用相应的提取运算符重载函数,把x的引用传送给对应的形参,接着从键盘的输入缓冲区中读取一个值并赋给x后,返回istream流,以便继续使用提取运算符为下一个变量输入数据。其中stew用来设置输出宽度。
2024-07-25 22:47:27
347
原创 C++类模板
类模板就是一系列相关类的模板或样板,这些类的成员组成相同,成员函数的代码形式相同,所不同的只是所针对的类型(成员的类型以及成员函数的参数和返回值的类型)不同。与一般的类声明的不同之处在于,这里的<类声明>要用<模板形参表>中声明的虚拟类型表来修饰它的某些成员,使模板类独立于任何具体的数据类型。在定义对象的过程中,编译系统会自动地根据需要生成相应的类定义,这种依据类模板生成类定义的过程中称为类模板的实例化。<返回类型><类名><<模板形参表>>::<函数名>(<函数形参表>)<函数体>
2024-07-25 13:03:44
261
原创 C++函数模板
在调用一个函数模板时,编译系统需要足够的信息来辨别每个虚拟类型参数所对应的实际类型,可以从不同的渠道获得这样的信息:从模板实参表中的<>或模板实参表中的(),模板实参的信息优先于函数实参的信息。如果从后者获得的信息已经能够判定其中部分或全部虚拟类型参数所对应的实际参数,而且它们又正好是参数表中最后的若干参数,则模板实参表中的几个参数可以省略。而用<类型修饰>声明的参数则称为常规参数,在形式上与普通的函数参数声明相同。其中的<模板参数表>由一个或多个<模板形参>组成,各<模板形参>之间用逗号隔开。
2024-07-24 23:37:40
254
原创 C++运算符函数与运算符重载
运算符重载是针对C++中原有运算符进行的,不能通过重载创建出新的运算符。由于很多符号是一元运算符和二元运算符公用的(如*既用于间接访问也可以用于两数相乘),为了避免混淆,不得为重载的运算符函数设置默认值,因此在调用时也就不得省略实参。C++把重载的运算符视为特殊的函数,称为运算符函数。与一般重载函数一样,编程系统能够依据使用运算符的不同环境,即参数(操作符)的数量或类型的差异,区分同一运算符的不同含义。除了new的delete这两个较为特殊的运算符外,任何运算符在作为成员函数重载时不得设置为静态成员函数。
2024-07-24 13:06:42
398
原创 C++虚函数与多态性
多态调用是指借助于指向基类的指针或引用的调用。在C++中,一个基类指针(或引用)可以指向它的派生类对象,而且通过这样的指针(或引用)调用虚函数时,调用的是该指针(或引用)实际所指向的对象所在类的那个重写版本。如果一个抽象类的派生类没有重写来自其基类的某个纯虚函数,则该函数在派生类中仍是纯虚函数,这就使得该函数也为抽象类。调用实函数时,通过基类指针(或引用)所调用的也只能是基类的函数版本,无法直接调用到派生类中的改写函数,也就是说尽管调用的语法形式可能是相同的,但对实函数的任何形式的调用都是非多态的。
2024-07-23 23:24:46
306
原创 C++多继承与虚继承
为初始化基类子对象,派生类的构造函数要调用基类的构造函数。对于基类的对象中只有一个虚基类子对象,所以,在建立一个派生类的对象时,为保证虚基类子对象只被初始化一次,这个虚基类构造函数必须只被调用一次。但只有用于建立对象的最派生类的构造函数才能调用虚基类的构造函数,此时最派生类的所有基类中列出的对虚基类的构造函数的调用在执行过程中都被忽略,从而保证对虚基类子对象只初始化一次。产生二义性问题的另外一中情况时当派生类从多个基类派生,而这些基类又有一个共同的基类,当共同的基类中说明的成员进行访问时,可能出现二义性。
2024-07-22 00:04:23
963
原创 C++派生类的构造函数和析构函数
(2)初始化列表中基类名和成员名的排序是任意的,但对它们的调用必须遵循以下顺序,即先调用基类的构造函数,再对新定义成员进行初始化(其中包括了对成员对象构造函数的调用),最后执行派生类构造函数体。因此,派生类的构造函数必须要以合适的初值作为参数,调用基类的构造函数用以初始化基类的数据成员,并对新增的数据成员进行初始化。派生类有多个基类时,处于同一层次的各个基类的构造函数的调用顺序取决于定义派生类时声明的顺序(自左向右),而与在派生类构造函数的初始化列表中给出的顺序无关。可以省略派生类构造函数的初始化列表。
2024-07-21 11:16:35
1013
原创 C++派生类对基类成员的访问
(2)派生类中的成员不能访问基类中的私有成员,可以访问基类中的公有成员和保护成员。此时派生类对基类中各成员的访问能力与继承方式无关,但继承方式将影响基类成员在派生类中的访问控制属性,基类中公有成员和保护成员在派生类中的访问控制属性将随着继承方式而改变:①派生类从基类私有继承时,基类的公有成员保护成员在派生类中仍是公有成员;派生类继承了基类的全部数据成员和除了构造、析构函数之外的全部成员函数,但是这些成员在派生类中的访问属性在派生类的过程中是可以调整的,继承方式控制了基类中具有的不同访问属性。
2024-07-18 23:40:09
690
原创 C++继承与派生
其中,从基类继承下来的全部成员构造成派生类的基类部分,这部分的私有成员是派生类不能直接访问的,公有成员和保护成员则是派生类可以直接访问的,但是它们在派生类中的访问属性将随着派生类对基类的继承方式而改变。任何一个类都可以派生出一个新类,派生类也可以再派生出新类,因此基类和派生类是相对而言的,一个基类可以是另一个基类的派生类,从而形成了复杂的继承结构,出现了类的层次。基类抽取了它的派生类的公共特征,而派生类通过增加信息将抽象的基类变为某种有用的类型,派生类是基类定义的延续。(2)派生类是基类的组合。
2024-07-18 22:05:13
255
原创 C++成员对象
在对成员对象初始化时,根据初始化列表的特点可知:类中有多个成员对象时,要按照定义成员对象的顺序建立各个子集,即成员对象构造函数的执行顺序仅与成员对象在类中声明的顺序有关,而与成员初始化列表中给出的成员对象的顺序无关。如果成员对象所在的类中没有默认构造函数,将产生错误。建立一个类的对象时,要调用它的构造函数对类对象初始化,此时应先执行初始化列表对各个成员进行初始化,在执行当前类的构造函数体。当类中出现了成员对象时,该类的构造函数就要包括对成员对象的初始化,成员对象的初始化工作也是在成员初始化列表中完成的。
2024-07-17 23:41:18
281
原创 C++对象数组
d[3]=Date(5,10,2002)相当于生成一个匿名函数赋给d[3]之后释放匿名对象。对象数组是指数组元素为对象的数组,该数组中的每一个元素都是同一个类的对象。<类名><数组名>[<大小>]……例1 分析下列程序的输出结果。参考《全国计算机等级考试二级教程——C++语言程序设计》
2024-07-17 22:49:51
243
原创 C++友元
对于一个类,可以利用friend关键字将一般函数、其他类的成员函数或者是其他类声明为该类的友元,使得这个类中本来隐藏的信息(包括私有成员和保护成员)可以被友元所访问。除了可以将普通函数声明为类的友元函数以外,也可以将另一个类的成员函数声明为一个类的友元函数,有时候也把类的成员函数作为友元的情况称为友元成员。友元函数的定义通常在类外部。友元函数不是当前类的成员函数,而是独立于当前的外部函数(包括普通函数和其他类的成员函数),但它可以访问该类的所有成员,包括私有成员、保护成员和公有成员。friend<类名>;
2024-07-16 23:30:00
317
原创 C++常成员
const关键字不仅可以修饰类对象本身,也可以修饰类对象的成员函数和数据成员,分别称为常对象、常成员函数和常数据成员。,出错的主要原因就在于p2是一个常对象,它的值不能更新,而move不是一个常成员函数,它修改了调用它的对象的数据成员的值。上述程序中,这两个对象调用成员函数Print时,通过对象p1调用的是没有const修饰的一般成员函数,而通过对象p2调用的是const修饰的成员函数。由于常对象不能被更新,因此在将一个对象说明为常对象后,通过这个常对象只能调用它的常成员函数,而不能调用其他成员函数。
2024-07-14 22:12:24
535
原创 C++静态成员
对于类中的非静态数据成员,每一个类对象都拥有一个副本,即每个对象的同名数据成员可以分别存储不同的数值,这是保证每个对象拥有区别于其他对象的特征的需要。(1)由于在类的声明中仅仅是对静态数据成员进行了引用声明,因此必须在文件作用域的某个地方对静态数据成员进行定义并进行初始化,即应在类体外对静态数据成员进行初始化(静态数据成员的初始化与它的访问控制权限无关)。静态数据成员的值对每个对象都是一样的,它的值可以被任何一个对象更新,从而实现了同一类的不同对象之间的数据共享。9.1 静态数据成员。
2024-07-14 15:16:15
281
原创 C++this指针
this指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。当一个对象调用成员函数时,编译程序先将对象的地址赋值给this指针,然后调用成员函数。每次成员函数存取数据成员时会隐含使用this指针。C++提供了一个特殊的对象指针——this指针,它是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针可以知道自己属于哪一个对象。this指针隐含于每一个类的非静态成员函数中,他可以引用对象的数据成员和成员函数。
2024-07-02 16:29:35
174
原创 C++自由存储对象
到目前为止,在为程序中定义的对象分配内存空间时采用的都是静态存储方式,在编译时就确定了所占空间的大小,而与之相对的动态存储分配技术则可以保证在程序运行过程中按照实际需要申请适量的内存,使用结束后再进行释放。在对自由存储对象调用构造函数和析构函数时要注意,这时的调用是显式进行的,调用顺序取决于new和delete运算符的顺序。这时析构函数的执行顺序不一定与构造函数的执行顺序严格相反,但对象数组中各个元素的构造和析构顺序仍是相反的。参考《全国计算机等级考试二级教程——C++语言程序设计》
2024-07-01 09:28:55
193
原创 C++构造函数和析构函数
由于temp对象的作用域仅在函数fun中,因此不能将temp对象直接赋值给对象date2,此时必须生成一个匿名对象,首先用temp初始化匿名对象,然后再将匿名对象赋值给对象date2,赋值完毕后,匿名对象被释放。析构函数与构造函数的作用几乎正好相反,它用来完成对象被删除前的一些清理工作,也就是专门做扫尾工作的,一般情况下,析构函数在对象的生存期即将结束的时候由系统自动调用。构造函数也是类的成员函数,但它是一种特殊的成员函数,它除了具有一般成员函数的特性之外,还具有一些特殊的性质。
2024-06-30 13:20:47
1290
原创 C++对象的定义
其中date1是对象名;<参数表>是初始化对象时需要的,建立对象时可以根据给定的参数调用相应的构造函数对对象进行初始化。一个对象的成员就是该对象的类所定义的成员,包括数据车管员数据成员和成员函数。其中"."运算符适用于一般对象和引用对象,而"->"运算符适用于指针对象(即指向对象的指针)。<对象名>.<成员函数名>(<参数表>)或<对象名>-><成员函数名>(<参数表>)<对象名>-><数据成员名> 等价于 (*<对象名>).<数据成员名><对象名>.<数据成员名>或<对象名>-><数据成员名>
2024-06-29 06:07:10
473
原创 C++类的定义
如果一个成员函数的声明在类体内,而定义在类体外,这时对该成员函数的调用是按一般函数进行的。如果要将定义在类体外的成员函数作为内联函数处理就必须在成员函数的定义前加上关键字“inline”,以此显示地说明该成员函数也是一个内联函数,类的成员包括数据成员和成员函数,分别描述类所表达的问题属性和行为。自身类的对象是不可以作为自身类的成员存在的,但自身类的指针可以。类的成员函数描述类所表达的问题的行为。在类外定义成员函数时在类声明中给出对成员函数的说明,在类外部对成员函数进行定义(但成员函数仍在类范围内)
2024-06-28 13:21:39
1184
原创 C++变量的生存周期
通过作用域运算符,即使该函数(块)中已经有与之同名的变量,也可以在函数(块)中使用定义在函数外的全局变量。(1)变量由编译程序在编译时给其分配存储空间(称为静态存储分配),并在程序执行过程中始终存在。这类变量的生存周期与程序的运行周期相同,当程序运行时,该变量的生存周期随即存在,程序运行结束,变量的生存周期随即终止。(2)变量由程序在运行时自动给其分配存储空间(称为自动存储分配),这类变量为函数(或块)中定义的自动变量。它们在程序执行到该函数(或块)时被创建,在函数(或块)执行结束时释放所占用的空间。
2024-06-26 12:03:44
406
原创 C++递归函数
递归是解决某些复杂为题的十分有效的方法。(1)用递归编写代码往往较为简洁,但一般要牺牲一定的效率。因为系统处理递归函数时都是通过压栈/退栈的方式实现的。(3)编写递归函数时需要进行递归分析,既要保证正确使用了递归语句,还要保证完成了相应操作。(2)数据之间的关系(即数据结构)按递归定义,如树的遍历、图的搜素等。(2)无论用那种递归调用,都必须要有递归出口,即结束递归调用的条件。(3)问题解法按递归算法实现,如回溯法等。参考《全国计算机等级考试二级教程——C++语言程序设计》(1)数据的定义形式为递归定义。
2024-06-26 11:14:46
325
原创 C++内联函数
内联函数和宏观函数的区别在于,宏函数是由预处理器对宏进行替换,而内联函数是通过编译器实现的,因此内联函数是真正的函数,只是在调用的时候内联函数像宏函数一样展开,所以它没有一般函数的参数压栈和退栈操作,减少了调用开销,因此内联函数比普通函数执行效率更高。不过编译器会将在类的说明部分定义的任何函数都认定为内联函数,即使它们没有用inline说明。当然内联函数也有一定的局限性,就是函数中的执行代码不能太多,结构也不能太复杂。如果内联函数的函数体过大,编译器将会放弃内联方法,而采用普通的方式调用函数。
2024-06-26 10:42:24
167
原创 C++函数重载
在这个例子中,分别给Max函数的4个重载函数一组实参,程序运行时根据所传递的实参的不同,调用相应的函数。因为C++编译器无法区分它们,也就是说如果函数只是函数类型不同,而其他完全相同(参数个数及类型),则不能作为重载函数来使用。在C中,编写函数时必须必须确保函数名唯一。参考《全国计算机等级考试二级教程——C++语言程序设计》例1 函数重载实例。
2024-06-25 18:53:13
212
原创 C++函数参数
从运行结果中发现变量a和变量b没有交换,原因在于swap函数的参数传递采用了传值方式,函数调用仅仅将实参变量a和b的值复制给了形参变量x和y,因此调用swap(a,b)时仅仅交换了两个形参变量x和y的值,而相应实参变量没有交换。由于传值方式是将实参的值复制到新惨重,因此实参和形参是两个不同的变量,有各自的存储空间,函数形参可以看作是函数的局部变量。与一般的引用不同(一般是定义时初始化为另一个变量的引用),引用参数是在函数被调用时初始化为实参变量的引用。在上面程序中,函数参数传递方式采用的就是复制方式。
2024-06-25 17:29:18
1079
原创 C++函数返回类型
根据函数是否带有参数以及函数是否有返回值,可以将函数分为如下四类。例3 评定成绩,将百分制表示的成绩转换成五级评价。<返回类型><函数名>(<参数列表>)例4 在屏幕上用星号打印一个三角形。参考《全国计算机等级考试二级教程——C++语言程序设计》void<函数名>(<参数列表>)例1 阶乘函数。(2)不带参数的有返回值函数。<返回类型><函数名>( )(4)不带参数的无返回值函数。(1)带参数的有返回值函数。(3)带参的无返回值函数。void<函数名>()
2024-06-24 17:22:41
405
原创 C++函数原型
在C++中,通常将main函数放在程序的最前面,因为程序总是从main函数开始执行。此外对于大型软件来说,一个程序通常由多个文件组成,如果一个文件中的函数要调用另一个文件中的函数时,也会出现这类问题。实际上,标准函数的原型声明放在了相应的头文件中,这也是为什么在调用标准函数时必须要包含相应的头文件的原因之一。这种声明在标准C++中称为函数原型,函数原型给出了函数名、返回类型以及在调用函数时必须提供的参数的个数和类型。(2)在函数原型声明中省略参数列表中的新参变量名,进给出函数名、函数类型、参数个数及次序。
2024-06-24 12:03:11
385
原创 C++函数调用
当调用一个函数时,其实参的个数、类型及排列次序必须与函数定义时的实参相一致,也就是说实参与形参应该一对一地匹配。若函数定义时没有形参,则函数调用时<实参表>亦为空。通常用于不带返回值的函数。这种情况下,被调用函数作为一个独立的语句出现在程序中。将被调用函数作为表达式的一部分进行调用,适用于被调用函数带有返回值的情况。被调用函数作为另一个函数的一个参数进行调用。已经定义的函数可以在其他函数中使用,如同使用标准函数一样。<函数名>(<实参表>)参考《全国计算机等级考试二级教程——C++语言程序设计》
2024-06-23 12:11:18
685
原创 C++函数定义
返回类型>又称函数类型,表示一个函数所计算(或运行)的结果值的类型。如果一个函数没有结果值,如函数仅用来更新变量(或设置)变量值、显示信息等,则函数返回值类型为void类型。<表达式>的类型必须与函数定义时的函数返回值类型一致。<函数名>一般是标识符,好的程序设计风格要求函数名最好是有助于记忆的名字,通过函数的名字可以知道函数的功能可以增加程序的可读性。return语句的第二种形式用于无返回值的函数,即函数返回类型为void。由一对花括号括起来的<函数体>是语句的序列,它定义了函数应执行的具体操作。
2024-06-23 09:33:19
317
原创 C++动态存储分布
其中,<>指针表示指向数组首元素的指针,delete之后的方括号指明要释放的内存空间中储存着数组元素。注:上述指针必须是由new返回的指向动态内存空间的地址,而不能是普通变量或数组的地址否则会产生十分严重的错误。其中,<类型>表达要分配的类型(如 char、int、double等),<指针>表示指向<类型>类型变量的指针(如char*、int*、double*等)。使用new动态分配的数组与一般定义语句声明的数组之间的最大的区别是,前者的元素个数可以是一个变量,而后者的元素个数必须是常量。
2024-06-18 15:39:53
596
原创 C++引用
如果有占有空间的对象(例如一个大的结构对象或类对象)需要作为函数参数传递的时候,在C语言中的做法往往是使用指针,因为这样可以避免将整个实参对象数据全部复制给形式参数,可以提高程序的执行效率。而在C++中,由于引入了引用的概念,因此既可以使用指针,亦可以使用引用来做同样的事情。引用是个别名,建立时需用另一个数据对象(如一个变量)的名字进行初始化,以指定该引用所代表的数据类型。(2)一旦一个引用被初始化为一个对象的引用,它就不能再被改变为另一个对象的引用(指针则可以在任何时候改变为指向另一个对象)
2024-06-16 22:15:20
201
原创 C++指针
上述程序中在:首先将指针a指向x的地址①中输出的是指针a的地址,②中输入的是指针a指向的值的地址,③中输出的是变量x的地址。之后将变量y的值赋给指针a,也就是将y的值赋给x④中输出指针a的地址,⑤中输出a指向的值的地址,也就是x的地址,⑥中输出变量y的地址,⑦中输出更改后x的值。在C++中,数组的名字就是指向该数组第一个元素(下标为0)的指针,即该数组第一个元素的地址,也即该数组的首地址。若p为指针,n为整型量,则p+n和p-n是合法的,同时p++也是合法的,它们的结果同指针所指对象类型有关。
2024-06-16 20:46:14
1010
原创 C++数组
Fibonacci序列是指:如果给定序列的前两项,比如说a1和a2,则该序列中的第n项an(n>=3)的计算公式是:an=a(n-1)+a(n-2),这种序列称作Fibonacci数列,如:1,1,2,3,5,8,13,21,34,..]。在此<数据类型>是类型说明符,<数组名>是数组的名字,<数据长度>是任一值为正整数的int型常数表达式,用来指定数组中元素的个数,即数组的大小,数组元素的下标是从0到<数组长度>-1。在定义数组时,可以不必给出所有数组元素的初始值,即在定义时可以部分初始化数组。
2024-06-12 12:13:53
676
原创 C++基本控制结构编程题
要求用户输入温度数值并指明该数值表示摄氏温度(C)还是华氏温度(F),程序将根据不同的输入(摄氏或华氏)进行不同的换算。例如,用户输入 40.2C,程序输出104.36F,或用户输入104.36F,程序输出40.2C。7.编写程序,求"水仙花数"。例如,153是水仙花数,因为153=1'+5'+33。例如,6是完全数,因为6=1+2+3。5.编写程序,根据公式e=1+1/1!4.编写程序,求1-3+5-7+…(a)年份如能被4整除,而不能被100整除,则为闰年。(3)不能被3,5,7中的任一个数整除。
2024-06-10 11:29:58
285
原创 C++跳转语句
在for循环中,当遇到continue时,执行流程将跳过循环体中余下的语句,而去执行for语句中,然后根据进行循环条件的判定以决定是否继续执行for循环体。在返回值类型不是void的函数体中,应使用return语句的第2种格式,使执行流程转移到调用该函数的位置,并将的值作为函数的返回值。标号语句中的应于goto语句中的相同,可以是任何类型的C++语句。goto语句的功能是使执行流程跳转到所标记的处(即对应的标号语句处)
2024-06-08 23:24:47
603
原创 C++循环语句
(2)do...while与while循环的不同之处在于:do...whlie循环的循环体在前,循环条件在后,因此do...while循环体在任何条件下(即使不满足循环条件)都至少被执行一次。(2)计算<表达式>的值,如果此值不等于0(即循环条件为“真”),则继续执行一遍循环体<语句>;(2)计算<表达式2>的值,如果此值不等于0(即循环条件为“真”),则进入语句;如果此值等于0(即循环条件为“假”),则结束for循环。(1)计算<表达式>的值,如果此值不为0(即循环条件为“真”),则执行循环体;
2024-06-08 16:22:14
800
原创 C++选择语句
if...else语句的执行过程是:首先计算<条件>的值,如果此值不为0(“真”),则执行<语句1>,然后忽略<语句2>而去执行if语句之后的下一条语句;如果此值为0(“假”),则忽略<语句1>,执行<语句2>,然后继续执行if语句之后的下一条语句。基本if语句的执行过程是:首先计算<条件>的值,如果此值不为0(“真”),则执行<语句>;switch的执行过程是:首先计算出<表达式>的值设为E,然后计算每个<常量表达式i>的值设为C1、C2...Cn,将E与C1、C2...Cn进行比较。
2024-06-07 13:02:27
836
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅