c++
文章平均质量分 51
c++入门
参考:《C++Primer》、西北工业大学《C++程序设计》中国大学MOOC平台
木木(。・ω・。)ノ♡
小白
展开
-
指向对象的常指针、指向常对象的指针、对象的常引用
1. 指向对象的常指针虽然常指针是const的不能改变指向,但常指针所指向的对象却不一定是const的。通常,使用常指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值,使其始终指向原来的对象。如果在函数执行过程中试图修改常指针形参的值,就会出现编译错误。2. 指向常对象的指针变量3. 对象的常引用在C++程序中,经常用对象的常指针和常引用作函数参数。这样既能保证数据安全,使数据在函数中不能被随意修改,又在调用函数时又不必传递实参对象的副本,大幅减少函数调用的空间..原创 2022-05-29 21:41:32 · 633 阅读 · 0 评论 -
常对象、常数据成员、常成员函数
C++有不少措施保护数据的安全性,如private保护类的数据成员等。 但对于一些共用的数据,如函数实参与形参等,我们可以在不同的场合通过不同的途径访问同一个数据对象。有时不经意的误操作会改变数据的值,而这是人们所不希望出现的。►既要使数据能在函数间共享,又要保证它不被任意修改,可以使用 const限定,即把数据定义为只读的。1. 常对象常对象中的数据成员均是const的,因此必须要有初值。无论什么情况下,常对象中的数据成员都不能被修改。除了合成的默认构造函数和默认析构函数外,也不能调用原创 2022-05-29 21:37:06 · 908 阅读 · 0 评论 -
类的作用域 & 对象的生命期
一、类的作用域(1)每个类都定义了自己的作用域和唯一的类型。在类体内声明类成员,将成员名引入类的作用域中。两个不同的类具有两个独立的类作用域。即使两个类具有完全相同的成员列表,它们也是不同的类型。每个类的成员不同于任何其他类的成员。例如:(2)在类作用域之外,成员只能通过对象、指针或引用的方式 (使用成员访问操作符“.”或“->”)来访问。这些运算符左边的运算对象分别是一个类对象、指向类对象的指针或对象的引用,后面的 成员名字必须在相对应的类的作用域中声明。(3)静态成员、类中定义原创 2022-05-29 21:06:48 · 1013 阅读 · 0 评论 -
this指针
除了静态成员函数外,每个成员函数都有一个额外的、隐含的形参 this。在调用成员函数时,编译器向形参this传递调用成员函数的对象的地址。例如成员函数:void Point::set(int a,int b) { x=a, y=b; } //成员函数定义编译器实际上会重写这个函数为:void Point::set(Point* const this,int a,int b) { this->x=a,this->y=b; }对应的函数调用:one.set(10,10); //调原创 2022-05-29 20:06:44 · 122 阅读 · 0 评论 -
类成员指针
对象的成员要占用存储空间,因此也有地址,可以定义指向对象成员的指针变量,一般形式为:数据成员类型 *指针变量名=初值;如:int *ptr=&now.hour; //指向对象数据成员的指针变量►C++比C语言有更严格的静态类型,更加强调类型安全和编译时检查。►因此,C++的指针被分成数据指针、函数指针、数据成员指针、成员函数指针四种,而且不能随便相互转换。其中前两种是C语言的,称为普通指针(ordinary pointer);后两种是C++专门为类扩展的,称为成员指针(pointe.原创 2022-05-29 19:56:41 · 654 阅读 · 0 评论 -
对象数组和对象指针
可以简单的理解类就是我们自定义的数据类型,而对象就是类的实例,因此我们也可以构造对象数组和对象的指针。一、对象数组将具有相同类类型的对象有序地集合在一起便构成了对象数组,以一维对象数组为例,其定义形式为:类名 对象数组名[常量表达式];一维对象数组有时也称为对象向量,它的每个元素都是相同类类型的对象。例如表示平面上若干个点,可以这样定义:Point points[100]; //表示100个点关于对象数组的说明:(1)在建立对象数组时,需要调用构造函数。如果对象数组有100原创 2022-05-29 15:29:33 · 116 阅读 · 0 评论 -
何时需要编写析构函数 & 构造函数和析构函数的调用次序
一、何时需要编写析构函数许多类不需要显式地编写析构函数,尤其是具有构造函数的类不一定需要定义自己的析构函数。析构函数通常用于释放在构造函数或在对象生命期内获取的资源(如动态分配的内存)。但是,析构函数的作用并不仅限于释放资源方面,它可以包含任意操作,用来执行“对象即将被撤销之前程序员所期待的任何操作” 。如果类需要析构函数,则该类几乎必然需要定义自己的复制构造函数和赋值运算符重载,这个规则称为析构函数三法则(rule of three)。二、构造函数和析构函数的调用次序构造函原创 2022-05-28 16:06:24 · 706 阅读 · 0 评论 -
析构函数的定义 & 合成析构函数
一、析构函数析构函数:当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统会自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一段内存空间,则在该对象消亡前应在析构函数中用delete释放这段存储空间)。规定析构函数的名字是类名的前面加一个波浪号(~)。其定义形式为:~类名() { 函数体 }析构函数不返回任何值,没有返回类型,也没有函数参数。由于没有函数参数,因此它不能被重载。换言之,一个类可以有多个构造函数,但是只能有一个析构函数。原创 2022-05-28 13:25:44 · 309 阅读 · 0 评论 -
复制构造函数与合成复制构造函数 & 深复制与浅复制
一、复制构造函数复制构造函数又称为拷贝构造函数,它是一种特殊的构造函数。它的作用就是用一个已经生成的对象来初始化另一个同类的对象。复制构造函数定义的一般形式为:类名(const 类名& obj){ 函数体}class Point { //Point类public: Point() : x(0), y(0) { } //默认构造函数 Point(const Point& r) : x(r.x), y(r.y) { } //复制构造函数 Point(int原创 2022-05-28 10:25:51 · 316 阅读 · 0 评论 -
默认构造函数 & 隐式类类型转换
一、定义默认构造函数默认构造函数就是在没有显式提供初始化式时调用的构造函数,它是一个不带参数的构造函数。如果定义某个类的对象时没有提供初始化式就会使用默认构造函数。定义默认构造函数(default constructor)的一般形式为:类名() { 函数体}它由不带参数的构造函数,或者所有形参均是默认参数的构造函数定义。与默认构造函数相对应的对象定义形式为:类名 对象名;►任何一个类有且只有一个默认构造函数。如果定义的类中没有显式定义任何构造函数,编译器会自动为该类生原创 2022-05-28 10:06:32 · 605 阅读 · 0 评论 -
构造函数的重载 & 带默认参数的构造函数
一、构造函数的重载 在一个类中可以定义多个构造函数版本,即构造函数允许被重载, 只要每个构造函数的形参列表是唯一的。一个类的构造函数数量是没有限制的。一般地,不同的构造函数允许建立对象时用不同的方式来初始化数据成员。尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说, 建立对象时只执行其中一个,并非每个构造函数都被执行。二、带默认参数的构造函数构造函数的参数允许使用默认值。对类的设计者来说,使用默认参数可以减少代码重复;对类的使用者来说,使用默认参数可以方便地用适当的参数进.原创 2022-05-28 07:58:01 · 823 阅读 · 0 评论 -
构造函数的定义
一、什么是构造函数?建立一个对象时,通常最需要立即做的工作是初始化对象,如对数据成员赋初值。构造函数就是用来在创建对象时初始化对象, 为对象数据成员赋初始值。类的数据成员是不能在类定义时初始化的,例如:原因是类定义并没有产生一个实体,而是给出了一个数据类型,不占用存储空间,因而也无处容纳数据。如果一个类中所有的数据成员是公有的,则可以在定义对象时对数据成员进行初始化,例如:如果类中的数据成员是私有的,如private的或protected的,就不能用这种方法初始化,因为外部不能直原创 2022-05-14 15:50:24 · 3375 阅读 · 0 评论 -
对象、对象指针或对象引用作为函数的参数和返回值
函数的参数可以是对象、对象指针或对象引用。(1)当形参是对象时,实参要求是相同类的对象名,C++不能对类对象进行任何隐式类型转换。此时形参是实参对象的副本。 采用这样的值传递方式会增加函数调用在空间、时间上的开销,特 别是当数据成员的长度很大时,开销会急剧增加。 实际编程中,传递对象时需要考虑类的规模带来的调用开销,如果开销很大时建议不用对象作为函数参数。(2)当形参是对象指针时,实参要求是同类对象的指针,C++不能对对象指针进行任何隐式类型转换。 函数调用时,无论类多大规模,传递的参数是一个地址值原创 2022-05-14 10:20:20 · 1664 阅读 · 1 评论 -
对象的赋值
如果一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值。这里所指的对象的“值”是指对象中所有数据成员的值。对象赋值的一般形式为:对象名1=对象名2;注意对象名1和对象名2必须属于同一个类。(1)对象的赋值只对其中的非静态数据成员赋值,而不对成员函数赋值。(2)如果对象的数据成员中包括动态分配资源的指针,按上述赋值的原理,赋值时只复制了指针值而没有复制指针所指向的内容。...原创 2022-05-14 10:11:36 · 658 阅读 · 0 评论 -
对象成员的引用
访问对象中的成员可以有3种方法:①通过对象名和对象成员引用运算符(.)访问对象中的成员;②通过指向对象的指针和指针成员引用运算符(->)访问对象中的成员;③通过对象的引用变量和对象成员引用运算符(.)访问对象中的成员;1.通过对象名访问对象中的成员访问对象中数据成员的一般形式为:对象名.成员名调用对象中成员函数的一般形式为:对象名.成员函数(实参列表)2.通过对象指针访问对象中的成员访问对象中数据成员的一般形式为:对象指针—>成员名调用对.原创 2022-05-13 18:15:22 · 1532 阅读 · 0 评论 -
对象的的定义与动态建立和释放
定义一个类时,也就是定义了一个具体的数据类型。若要使用类, 需要将类实例化,即定义该类的对象。一、对象的定义1.先定义类类型再定义对象将类的名字直接用作类型名:类名 对象名列表;Point a,b; //C++特色定义对象2.定义类类型的同时定义对象class 类名 {//类体 成员列表 }class Point { //类体 public: …//公有的数据成员和成员函数 private: …//私有的数据成员和成员函数 } one , two; //原创 2022-05-13 18:04:52 · 103 阅读 · 0 评论 -
类的数据成员与成员函数
一、类的数据成员1.在类中声明数据成员1)类的数据成员的声明类似于普通变量的声明。如果 一个类具有多个同一类型的数据成员,则这些成员可以在一个成员声明中指定。2)类的数据成员可以是基本类型、数组、指针、引用、共用体、枚举类型、void指针、const限定等数据类型。3)类的数据成员还可以是成员对象(member object),即类类型或 结构体类型的对象。若类A中嵌入了类B的对象,称这个对象为子对象(subobject)。例如:类Line嵌入了类Point的子对象start、end原创 2022-05-13 17:37:17 · 5824 阅读 · 0 评论 -
定义类与成员的访问控制
(1)抽象:对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。1.数据抽象2.行为抽象(2)封装:将抽象出的数据成员、行为成员相结合,将他们视为一个整体——类。使用者不需要了解具体的实现细节,只需要通过接口使用类的成员即可。(3)继承与派生:保持原有类特性的基础上,进行更具体的说明。类(class)是用户自定义数据类型。如果程序中要使用类类型 (class type),必须根据实际需要定义,或者使用已设计好的类。C++定义一个类,其方法与定义一个结构体类型是相原创 2022-05-13 17:17:55 · 351 阅读 · 0 评论 -
结构体的定义与使用
数组是一种数据形式,其特点是多个相同类型的元素集合起来;结构体是另一种重要的数据形式,特点是将不同类型的成员组合起来。数组和结构体形成了两种风格迥异的聚合方式,通过他们及其相互组合、嵌套的机制可以构造出复杂的、满足应用要求的自定义数据类型。1. 定义结构体类型结构体允许将不同类型的数据元素组合在一起形成一种新的数据类型,其声明形式为:struct 结构体类型名 { 成员列表 };结构体类型声明一般放在程序文件开头,此时这个声明是全局的。 在全局作用域内,该声明处处可见,因此同作.原创 2022-05-11 23:18:59 · 16751 阅读 · 0 评论 -
动态分配数组及字符串
一、动态分配数组使用动态内存,可以轻而易举地解决这样的问题:在程序运行时产生任意大小的“数组” 。动态分配一维或多维数组的方法是由指针管理数组,二维以上数组按一维数组方式来处理,具体步骤为:①定义指针p;②分配数组空间,用来存储数组元素,空间大小按元素个数计算;③按一维数组方式使用这个数组(例如输入、输出等);若是一维数组,则元素为p[i];若是二维数组,则元素为p[i*M+j], 其中M为列元素个数,以此类推。④释放数组空间;如:计算N*N二维数组的元素平均值 #in原创 2022-05-11 21:45:58 · 753 阅读 · 0 评论 -
new与delete运算
C++内存分配有两种方式:静态分配和动态分配。►静态分配指在编译时为程序中的数据对象分配相应的存储空间,前面所有例子中的变量、数组、指针定义等均是静态分配方式。 由于是在编译时为数据对象分配存储空间,因此就要求在编译时空 间大小必须是明确的,所以数组的长度必须是常量。而一旦编译完成,运行期间这个数组的长度就是固定不变的。►动态分配是程序运行期间根据实际需要动态地申请或释放内存的方式,它不象数组等静态内存分配方式那样需要预先分配存储空间, 而是根据程序的需要适时分配,且分配的大小就是程序要求的大小。原创 2022-05-10 23:47:41 · 222 阅读 · 0 评论 -
指向函数的指针
函数是实现特定功能的程序代码的集合,实际上,函数代码在内存中也要占据一段存储空间(代码区内),这段存储空间的起始地址称为函数入口地址。C++规定函数入口地址为函数的指针,即函数名既代表函数,又是函数的指针(或地址)。C++允许定义指向函数的指针变量,定义形式为:返回类型 (*函数指针变量名)(形式参数列表),...;它可以指向如下形式的函数:返回类型 函数名(形式参数列表){ 函数体 }int (*p)(int a, int b); //定义函数指针变量使函数指针指向原创 2022-05-03 10:43:30 · 184 阅读 · 0 评论 -
引用的声明与在函数内的使用
通过对象名称直接访问对象,优点是直观,操作哪个对象一目了然, 缺点一个函数内部不能使用另一个函数的局部变量;通过指针(或地址)间接访问对象,优点是无所不能,缺点是程序 中大量出现的间接访问,实在分不清具体是哪个对象,需要通过上 下文去分析。C++扩充了C语言对象访问方式,提供了引用访问。通过引用访问对象,结合了按名访问和按地址访问各自的优点,非常适合作为函数参数。1. 引用的声明简单地说,引用(reference)就是一个对象的别名(alias name), 其声明形式为:引用类型 &a原创 2022-05-03 10:22:39 · 1033 阅读 · 0 评论 -
指针、数组作为函数的参数
一、指针作为函数的参数指针最重要的应用是作为函数参数,它使得被调函数除了返回值之外,能够将更多的运算结果返回到主调函数中。因此: 指针是函数参数传递的重要工具。►函数形参可以是指针类型,一般形式为:返回类型 函数名(指向类型 *指针变量名,...) { 函数体 }如:设计一个函数swap,用于交换两个变量的值 #include <iostream> using namespace std; void swap(int *p1, int *p2)原创 2022-05-02 10:37:42 · 3190 阅读 · 0 评论 -
指针与字符串
可以利用一个字符型的指针处理字符串,其过程与通过指针访问数组元素相同。使用指针可以简化字符串的处理,是程序员处理字符串常用的编程方法。►C++允许定义一个字符指针,初始化时指向一个字符串常量,一般形式为:char *p="C Language";//或者char *p;p="C Language"; 初始化时,p存储了这个字符串首字符地址4000,而不是字符串常量本身,称p指向字符串。通过字符指针可以访问字符串。例如:char str[]="C Language", *p=st原创 2022-05-02 00:01:16 · 785 阅读 · 0 评论 -
一维数组与指针
C++程序员更偏爱使用指针来访问数组元素,这样做的好处是运行效率高、写法简洁。1. 一维数组的地址数组由若干个元素组成,每个元素都有相应的地址,通过取地址运算(&)可以得到每个元素的地址。int a[10];int *p=&a[0]; //定义指向一维数组元素的指针p=&a[5]; //指向a[5]C++规定,数组名既代表数组本身,又代表整个数组的地址,还是是数组首元素的地址值,即a与第0个元素的地址&a[0]相同。例如下面两个语句是是等价的。原创 2022-05-01 16:32:16 · 909 阅读 · 0 评论 -
指针的有效性和运算
一、指针的有效性►指针指向一个有确定存储空间的对象(称为已知对象),则该指针是有效的。►若一个指针不指向程序中任何已知对象,称其指向未知对象。未知对象的指针是无效的,无效的指针使用间接引用运算几乎总会导致崩溃性的异常错误。(1)如果指针的值为0,称为0值指针,又称空指针(null pointer),空指针是无效的。int *p=0;*p=2; //空指针间接引用将导致程序产生严重的异常错误(2)如果指针未经初始化,或者没有赋值,或者指针运算后指向 未知对象,那么该指针是无效的。原创 2022-05-01 15:42:04 · 1591 阅读 · 0 评论 -
指针的定义
可返回多个或不同类型的值,弥补数组与函数的缺陷。在程序设计过程中,无论是存入数据还是取出数据都需要与内存单元打交道,计算机通过地址编码来表示内存单元。指针类型就是存放地址编码,处理计算机的地址数据的。指针除了能够提高程序的效率,更重要的作用是能使一个函数访问另一个函数的局部变量,因此指针是两个函数进行数据交换必不可少的工具。1. 地址和指针的概念程序中的数据对象总是存放在内存中,在生命期内这些对象占据一 定的存储空间,有确定的存储位置。实际上,每个内存单元都有一个地址,即以字节为单位连续原创 2022-05-01 14:59:47 · 6026 阅读 · 1 评论 -
数组解决查找问题
1.顺序查找顺序查找的基本思想是让关键字与序列中的数逐个比较,直到找出与给定关键字相同的数为止或序列结束,一般应用于无序序列查找。 #include <iostream> using namespace std; int Search(int A[],int n,int find) { //顺序查找 n=序列元素个数 find=欲查找数据 int i; for (i=0; i<n ; i++) if (A[i]==find) return i; ret原创 2022-05-01 11:08:27 · 120 阅读 · 0 评论 -
数组解决排序问题
排序问题是程序设计中的典型问题,它有很广泛的应用,其功能是将一个数据元素序列的无序序列调整为有序序列。1、冒泡排序冒泡排序法(bubble sort)的基本思想是通过相邻两个记录之间的比较和交换,使关键码较小的记录逐渐从底部移向顶部(上升), 关键码较大的记录逐渐从顶部移向底部(沉底),冒泡由此得名。 设由A[1]~A[n]组成的n个数据,冒泡排序的过程可以描述为: #include <iostream> using namespace std; #define N 1原创 2022-05-01 10:37:41 · 238 阅读 · 0 评论 -
字符串对象及其操作
一、字符串对象C++为字符串提供了一种新的自定义类型:字符串类string。采用类来实现字符串,具有如下特点:①采用动态内存管理,不必担心存储空间是否足够,甚至都不用有字符数组的概念;②能够检测和控制诸如越界之类的异常,提高使用的安全性;③封装字符串多种处理操作,功能增强;④可以按运算符形式操作字符串,使用简单。►C++程序中使用string类型,比使用C风格字符串更方便、更安全。使用string类需要将其头文件包含到程序中,预处理命令为:#include <.原创 2022-05-01 10:08:31 · 284 阅读 · 0 评论 -
字符数组与字符串处理函数
1. 字符数组►用来存放字符型数据的数组称为字符数组,其元素是一个个的字符。►字符数组的定义形式为:char 字符数组名[常量表达式], ......char s[20]; //定义字符数组char s[4]={'J','a','v','a'}; //字符数组初始化2. 字符串的概念1)C++语言规定字符串是以'\0'(ASCII值为0)字符作为结束符的字符数组。2)在程序中可以通过判断数组元素是否为空字符来判断字符串是否结束,换言之,只要遇到数组元素是空字符,就表示字符串原创 2022-04-30 17:07:01 · 173 阅读 · 0 评论 -
数组参数的传递机制
数组作为函数的参数,传递的是数组的地址。 这样的传递机制使得当数组作为函数参数时,有下面的特殊性。(1)由于形参数组就是实参数组,所以在被调函数中使用形参就是在间接使用实参,形参改变实参也会改变,这点与变量作为函数参数的情况是不同的。void fun(int A[5],int n){ A[1]=100; //A[1]实质就是实参a[1] n=10; //赋值给形参n,不影响实参x}void caller(){ int a[5]={1,2,3,4,5},x=5; fun(a,x);原创 2022-04-30 16:31:53 · 2510 阅读 · 2 评论 -
数组与函数
1. 数组元素作为函数的参数一维数组元素可以直接作为函数实参使用,其用法与变量相同。int max(int a,int b);int A[5]={1,2,3,4,5} , c=2, x;x=max(c,-10); //使用变量作为函数实参x=max(A[2],-10); //使用数组元素作为函数实参2. 整个数组作为函数的参数数组作为函数的形参,基本形式为:返回类型 函数名(类型 数组名[常量表达式],...) {函数体}double average(doub原创 2022-04-30 15:56:40 · 275 阅读 · 0 评论 -
多维数组的定义、初始化、引用
二维:数组内每个元素都是一维数组。多维类似……一、定义C++允许定义多维数组,其定义形式为:元素类型 数组名 [常量表达式1][常量表达式2] …[常量表达式n]int A[3][4]; //定义二维数组int B[3][4][5]; //定义三维数组int C[3,4,5,6]; //错误!►多维定义实际上是反复递归一维定义:即一维数组的每一个元素又是一个一维数组,就构成了二维数组。►本质上,C++的多维数组都是一维数组,这是由内存形式的线性排 列决定的。因此,不能按几.原创 2022-04-23 18:06:26 · 2689 阅读 · 1 评论 -
一维数组的定义、初始化、引用
数组用来表示一组数据的集合。使用数组,可以方便地定义一个名字(数组名)来表示大批量数据,并能够通过循环批处理大量数据。一、定义数组就是一组相同类型数据的集合。一维数组的定义形式为:元素类型 数组名 [常量表达式(数组包含的元素个数)];int A[10];int B[10], C[15]; //多个数组定义int E[10], m, n, F[15]; //数组和变量混合在一起定义(1)一维数组是由元素类型、数组名和长度(数组包含的元素个数)组成的构造类型。in...原创 2022-04-23 17:21:16 · 4752 阅读 · 0 评论 -
命名空间的定义和使用
►大型应用程序经常使用来自不同厂商的开发库,几乎不可避免会使用相同的名字,也就是说一个库中定义的名字可能与其他库中的名字相同而产生冲突,使得程序员不能组合各自独立的开发库到一个程序中。►命名空间是用来限定名字的解析和使用范围的,它是C++开发大型程序的工具之一。►命名空间的原理是将全局作用域划分为一个一个的命名空间,每个命名空间是一个独立的作用域,在不同命名空间内部定义的名字彼此之间互不影响,从而有效的避免了命名空间污染。一、命名空间的定义1. 定义命名空间命名空间的定义形式为:原创 2022-04-20 21:23:00 · 8227 阅读 · 1 评论 -
头文件&工程文件&多文件编译
一、头文件为什么要使用头文件呢?►我们现在已经知道,如果是多文件结构程序,欲在文件中调用别的文件中的函数,需要有函数的声明,而且每个文件均是如此。如果 是函数声明比较多的情况下,在每个文件中都写上函数声明不是好办法,很难管理。例如:某个函数定义有变动,那么所有含有这个函数声明的调用文件都需要找出来,逐一修改。►使用头文件可以解决这个问题,其工作原理是通过将每个源文件中外部函数的函数声明等信息集中写到一个文件中,称为头文件(有 别于源文件),而别的源文件只需用文件包含命令将这个头文件包含,则编译原创 2022-04-20 20:53:21 · 398 阅读 · 0 评论 -
内部函数与外部函数
一、内部函数函数本质上是全局的,在多文件的程序中,在连接时会检查函数在 全局作用域内是否名字唯一,如果不是则出现连接错误。►在函数定义前加上static修饰,则函数称为内部函数,定义形式为:static 返回类型 函数名(形式参数列表){ 函数体 }►按照实体可见规则,内部函数仅在包含它的文件中有效。►之所以使用内部函数的原因是该函数逻辑上仅限定在一个文件中使用,其他文件不会用到。而且希望连接检查时永远不可能出现该函数名不唯一的连接错误,这在多人编写同一个程序的软件开发模式原创 2022-04-20 20:41:20 · 2220 阅读 · 0 评论 -
作用域&生命期
C++的实体通常有三类:►①变量或对象。例如变量、数组等;►②函数;►③类型。包含结构体类型、共用体类型、类类型。作用域是程序中的一段区域。在同一个作用域上,C++程序中每个名字都与唯一的实体对应;如果在不同的作用域上,程序中可以多次使用同一个名字,对应不同作用域中的不同实体。作用域分有:►(1)文件作用域(file scope)►(2)函数作用域(function scope)►(3)块作用域(block scope)►(4)类型声明作用域(declaratio.原创 2022-04-19 00:18:43 · 1333 阅读 · 0 评论