C++基础(7)
C++内联函数:
内联函数用内联代码替换函数调用
特点:运行速度快,占用内存多。
史用这项特性,必须采取下述措施之一:
- 在函数声明前加上关键字inline;
- 在函数定义前加上关键字inline。
引用变量
创建引用变量。例如要将a作为b的变量别名,可以这样做:
int b;
int & a = b;
其中,&不是地址运算符,而是类型标识符的一部分。
应尽可能使用const
将引用参数声明为常量数据的引用理由有三个:
- 使用const可以避免无意中修改数据的编程错误;
- 使用const使函数能够处理const和非const实参,否则将只能接受非const数据;
- 使用const引用使函数能够正确生成并使用临时变量。
函数重载
函数多态(函数重载)让您能够使用多个同名的函数。函数重载的关键是函数的参数列表,也称为函数特征标。如果参数数目和/或参数类型不同,则特征标也不同。
函数模板
函数模板是通用的函数描述,也就是说,他们使用泛型来定义函数,其中的泛型可用具体的类型(如int或double)替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。
例如,可以这样建立一个交换模板:
template <typename AnyType>
void Swap(AnyType &a, AnyType &b)
{
AnyType temp;
temp = a;
a = b;
b = temp;
}
重载模板。
单独编译
一种非常有用的组织程序策略,将程序分为三部分:
- 头文件:包含结构声明和使用这些结构的函数的原型。
- 源代码文件:包含与结构相关的函数的代码。
- 源代码文件:包含调用与结构相关的函数的代码。
头文件中常包含的内容:
- 函数原型。
- 使用#define或const定义的符号常量。
- 结构声明。
- 类声明。
- 模板声明。
- 内联函数。
单定义规则:变量只能有一次定义。
名称空间
C++新增了这样一种功能,即通过一种新的声明区域来创建命名的名称空间,这样做的目的之一是提供一个声明名称的区域一个名称空间中的名称不会与另外一个名称空间的相同名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。
using声明和using编译指令:
using Jill::fetch;
using namespace std;
最重要的OPP特性:
- 抽象
- 封装和数据隐藏
- 多态
- 继承
- 代码的可重用性
基本类型完成三项工作:
- 决定数据对象需要的内存数量
- 决定如何解释内存中的位(long和float在内存中占用的位数相同,但将它们转换为数值的方法不同)
- 决定可使用数据对象执行的操作或方法
什么是类
类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。
指定类设计的第一步是提供类声明。类声明类似结构声明,可以包括数据成员和函数成员。声明有私有部分,在其声明的成员只能通过成员函数进行访问;声明还具有公有部分,在其中声明的成员可被使用类对象的程序直接访问。通常,数据成员被放在私有部分中,成员函数被放在公有部分中,因此典型的类声明的格式如下:
class className
{
private:
data member declarations
public:
member function prototypes
}
构造函数
构造函数名称与类相同。
显式地调用构造函数,如:
Stock food = Stock("World Cabbage",250,1.25);
隐式地调用构造函数,如:
Stock garment("Furry Mason",50,2.5);
析构函数
析构函数完成清理工作。和构造函数一样,析构函数地名称也很特殊:在类名前加上~。因此Stock类地析构函数为 ~Stock()。
析构函数没有参数,因此Stock析构函数地原型必须是这样的:
~Stock();
this指针
this指针指向用来调用成员函数地对象(this被作为隐藏参数传递给方法)。
对象数组
声明对象数组地方法与声明标准类型数组相同:
Stock mystuff[4];
知识点总结
-
C++扩展了C语言的函数功能。通过将inline关键字用于函数定义,并在首次调用该函数前提供其函数定义,可以使得C++编译器将该函数视为内联函数。也就是说,编译器不是让程序跳到独立的代码段,以执行函数,而是用相应的代码替换函数调用。只有在函数很短时才能采用内联方式。
-
引用变量是一种伪装指针,它允许为变量创建别名(另一个名称 )。引用变量主要被用作处理结构和类对象的函数的参数。通常,被声明为特定类型引用的标识符只能指向这种类型的数据;然而,如果一个类(如ofstream)是从另一个类(如ostream)派生出来的,则基类引用可以指向派生类对象。
-
C++原型让您能够定义参数的默认值。如果函数调用省略了相应的参数,则程序将使用默认值;如果函数调用提供了参数值,则程序将使用这个值(而不是默认值)。只能在参数列表中从右到左提供默认参数。因此,如果为某个参数提供了默认值,则必须为该参数右边所有的参数提供默认值。
-
函数的特征标是其参数列表。程序员可以定义两个同名函数,只要其特征标不同。这被称为函数多态或函数重载。通常,通过重载函数来为不同的数据类型提供相同的服务。
-
函数模板自动完成重载函数的过程。只需使用泛型和具体算法来定义函数,编译器将为程序中使用的特定参数类型生成正确的函数定义。
-
C++鼓励程序员在开发程序时使用多个文件。一种有效的组织策略是,使用头文件来定义用户类型,为操纵用户类型的函数提供函数原型;并将函数定义放在一个独立的源代码文件中。 头文件和源代码文件一起定义和实现了用户定义的类型及其使用方式。最后,将main()和其他使用这些函数的函数放在第三个文件中。
-
C++的存储方案决定了变量保留在内存中的时间(储存持续性)以及程序的哪一部分可以访向它(作用域和链接性)。自动变量是在代码块(如函数体或函数体中的代码块)中定义的变量,仅当程序执行到包含定义的代码块时,它们才存在,并且可见。自动变量可以通过使用存储类型说明符register或根本不使用说明符来声明,没有使用说明符时,变量将默认为自动的。register说明符提示编译器,该变量的使用频率很高,但C++11摒弃了这种用法。
-
静态变量在整个程序执行期间都存在。对于在函数外面定义的变量,其所属文件中位于该变量的定义后面的所有函数都可以使用它(文件作用域),并可在程序的其他文件中使用(外部链接性)。另一个文件要使用这种变量,必须使用extern关键字来声明它。对于文件间共享的变量,应在一个文件中包含其定义声明(无需使用extern,但如果同时进行初始化,也可使用它),并在其他文件中包含引用声明(使用extern且不初始化)。在函数的外面使用关键字static定义的变量的作用域为整个文件,但是不能用于其他文件(内部链接性)。在代码块中使用关键字static 定义的变量被限制在该代码块内( 局部作用域、无链接性),但在整个程序执行期间,它都一直存在并且保持原值。
-
在默认情况下,C++函数的链接性为外部,因此可在文件间共享;但使用关键字static限定的函数的链接性为内部的,被限制在定义它的文件中。
-
动态内存分配和释放是使用new和delete进行的,它使用自由存储区或堆来存储数据。调用new占用内存,而调用delete释放内存。程序使用指针来跟踪这些内存单元。
-
名称空间允许定义一个可在其中声明标识符的命名区域。这样做的目的是减少名称冲突,尤其当程序非常大,并使用多个厂商的代码时。可以通过使用作用域解析运算符、using声明或using编译指令,来使名称空间中的标识符可用。
-
面向对象编程强调的是程序如何表示数据使用OOP方法解决编程问题的第一步是根据它与程序之间的接口来描述数据,从而指定如何使用数据。然后,设计一个类来实现该接口。一般来说,私有数据成员存储信息,公有成员函数(又称为方法)提供访问数据的唯一途径。 类将数据和方法组合成一个单元,其私有性实现数据隐藏。
-
通常,将类声明分成两部分组成,这两部分通常保存在不同的文件中。类声明(包括由函数原型表示的方法)应放到头文件中。定义成员函数的源代码放在方法文件中。这样便将接口描述与实现细节分开了。从理论上说,只需知道公有接口就可以使用类。当然,可以查看实现方法(除非只提供了编译形式),但程序不应依赖于其实现细节,如知道某个值被存储为int。只要程序和类只通过定义接口的方法进行通信,程序员就可以随意地对任何部分做独立的改进,而不必担心这样做会导致意外的不良影响。
-
类是用户定义的类型,对象是类的实例。这意味着对象是这种类型的变量,例如由new按类描述分配的内存。C++试图让用户定义的类型尽可能与标准类型类似,因此可以声明对象、指向对象的指针和对象数组。可以按值传递对象、将对象作为函数返回值、将一个对象赋给同类型的另一个对象。如果提供了构造函数,则在创建对象时,可以初始化对象。如果提供了析构函数方法,则在对象消亡后,程序将执行该函数。
-
每个对象都存储自己的数据,而共享类方法。如果mr_object 是对象名,try_me()是成员函数,则可以使用成员运算符句点调用成员函数: mr_object.try_ me()。 在OOP中,这种函数调用被称为将try_ me消息发送给mr_object 对象。在try_me(方法中引用类数据成员时,将使用mr_object 对象相应的数据成员。同样,函数调用i object.try_ me()将访问 i_object对象的数据成员。
-
如果希望成员函数对多个对象进行操作,可以将额外的对象作为参数传递给它。如果方法需要显式地引用调用它的对象,则可以使用this指针。由于this指针被设置为调用对象的地址,因此*this 是该对象的别名。
-
类很适合用于描述ADT。公有成员函数接口提供了ADT描述的服务,类的私有部分和类方法的代码提供了实现,这些实现对类的客户隐藏。