C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜色.名称.品种,行为 - 摇动.叫唤.吃.对象是类的实例. 类 - 类可以定义为描述对象行为/状态的模板/蓝图. 方法 - 从基本上说,一个方法表示一种行为.一个类可以包含多个方法.可以在方法中写入逻辑.操作数据以及执行所有的动作. 即时变量 - 每个对象都有其独特的即时变量.对象的状态是由这些即时变量的值创建的. C++ 程序结构 #include <iostream…
C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 C 标准库,为了支持类型安全,做了一定的添加和修改. 标准函数库 标准函数库分为以下几类: 输入/输出 I/O 字符串和字符处理 数学 时间.日期和本地化 动态分配 其他 宽字符函数 面向对象类库 标准的 C++ 面向对象类库定义了大量支持一些常见操作的类,比如输入/输出 I/O.字符串处理.数值处…
栈:在函数内部声明的所有变量都将占用栈内存. 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存. 可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址.这种运算符即 new 运算符. 不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存. new 和 delete 运算符 下面是使用 new 运算符来为任意的数据类型动态分配内存的通用语法: new data-type; 在这里,data-type 可以是包括数…
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计.类是 C++ 的核心特性,通常被称为用户定义的类型. 类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法.类中的数据和方法称为类的成员.函数在一个类中被称为类的成员. 类定义是以关键字 class 开头,后跟类的名称.类的主体是包含在一对花括号中.类定义后必须跟着一个分号或一个声明列表. 键字 class 定义 Box 数据类型,如下所示: class Box { public: double length;…
C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数.为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件. 有四个与时间相关的类型:clock_t.time_t.size_t 和 tm.类型 clock_t.size_t 和 time_t 能够把系统时间和日期表示为某种整数. 结构类型 tm 把日期和时间以 C 结构的形式保存,tm 结构的定义如下: struct tm { int tm_sec; // 秒,正常范围从…
C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符串实际上是使用 null 字符 '\0' 终止的一维字符数组.因此,一个以 null 结尾的字符串,包含了组成字符串的字符. 下面的声明和初始化创建了一个 "Hello" 字符串.由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个. ] = {'H', 'e', '…
C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 年在贝尔实验室开始设计开发的.C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言.C++ 可运行于多种平台上,如 Windows.MAC 操作系统以及 UNIX 的各种版本. 编译/执行 C++ 程序 #include <iostream> using namespace std; int main() { cout << "Hello, world!" << e…
C++ 实例 - 输出 "Hello, World!" #include <iostream> using namespace std; int main() { cout << "Hello, World!"; ; } C++ 实例 - 标准输入输出 #include <iostream> using namespace std; int main() { int number; cout << "输入一个…
C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以下三个组件: 容器(Containers) 容器是用来管理某一类对象的集合.C++ 提供了各种不同类型的容器,比如 deque.list.vector.map 等. 算法(Algorithms) 算法作用于容器.它们提供了执行各种操作的方式,包括对容器内容执行初始化.排序.搜索和转换等操作. 迭代器…
什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下: 公共网关接口(CGI),是一种用于外部网关程序与信息服务器(如 HTTP 服务器)对接的接口标准. Web 浏览 点击一个超链接,浏览一个特定的网页或 URL,看看会发生什么. 浏览器联系上 HTTP Web 服务器,并请求 URL,即文件名. Web 服务器将解析 URL,并查找文件名.如果找到请求的文件,…
多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程. 基于进程的多任务处理是程序的并发执行. 基于线程的多任务处理是同一程序的片段的并发执行. 多线程程序包含可以同时运行的两个或多个部分.这样的程序中的每个部分称为一个线程,每个线程定义了一个单独的执行路径. 创建一个 POSIX 线程: #include <pthread.h> pthread_create (thread, attr, start_rout…
信号是由操作系统传给进程的中断,会提早终止一个程序.在 UNIX.LINUX.Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断. 有些信号不能被程序捕获,但是下表所列信号可以在程序中捕获,并可以基于信号采取适当的动作.这些信号是定义在 C++ 头文件 <csignal> 中. SIGABRT 程序的异常终止,如调用 abort. SIGFPE 错误的算术运算,比如除以零或导致溢出的操作. SIGILL 检测非法指令. SIGINT 接收到交互注意信号. SIGS…
预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理. 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前.预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾. C++ 还支持很多预处理指令,比如 #include.#define.#if.#else.#line 等 #define 预处理指令用于创建符号常量.该符号常量通常称为宏,指令的一般 形式是: #define macro-name replacement-text 当这一行代码出现在一个文件中时…
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单一的定义,比如 向量,可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>. 模板函数定义的一般形式如下所示: template <class type> ret-type func-name(parameter list) { /…
假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等. 同样的情况也出现在 C++ 应用程序中.例如,可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz().这样,编译器就无法判断所使用的是哪一个 xyz() 函数. 因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数.类.变量等.使用了命名空间即定义了上下…
异常是程序在执行期间产生的问题.C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作. 异常提供了一种转移程序控制权的方式.C++ 异常处理涉及到三个关键字:try.catch.throw. throw: 当问题出现时,程序会抛出一个异常.这是通过使用 throw 关键字来完成的. catch: 在您想要处理问题的地方,通过异常处理程序捕获异常.catch 关键字用于捕获异常. try: try 块中的代码标识将被激活的特定异常.它后面通常跟着一个或多个 catch 块. 如果有一个…
如何从文件读取流和向文件写入流.这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型: ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息. ifstream 该数据类型表示输入文件流,用于从文件读取信息. fstream 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息. 要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostr…
接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类.纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示: class Box { public: // 纯虚函数 ; private: double length; // 长度 double breadth; // 宽度 double height; // 高…
所有的 C++ 程序都有以下两个基本要素: 程序语句(代码):这是程序中执行动作的部分,它们被称为函数. 程序数据:数据是程序的信息,会受到程序函数的影响. 封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全.数据封装引申出了另一个重要的 OOP 概念,即数据隐藏. 数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制. C++ 通过创建类来支持封装和数据隐藏(publi…
数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节. 数据抽象是一种依赖于接口和实现分离的编程(设计)技术. 它们向外界提供了大量用于操作对象数据的公共方法,也就是说,外界实际上并不清楚类的内部实现. 例如,程序可以调用 sort() 函数,而不需要知道函数中排序数据所用到的算法.实际上,函数排序的底层实现会因库的版本不同而有所差异,只要接口不变,函数调用就可以照常工作. 在 C++ 中,使用类来定义我们自己的抽象数据类型(ADT).可以使用类 iostr…
多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态. C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数. 下面的实例中,基类 Shape 被派生为两个类,如下所示: #include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( , ) { width = a; height = b; }…
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同. 当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义.选择最合适的重载函数或重载运算符的过程,称为重载决策. C++ 中的函数重载 在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或…
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可.这个已有的类称为基类,新建的类称为派生类. 继承代表了 is a 关系.例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等等. 基类 & 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数.定义一个派生类,我们使用一个类派生列表来指定基类.类派生列表以一个或多个基类命名,形式如下: class derived-class: access-specifier base-c…
C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项. 结构用于表示一条记录,假设想要跟踪图书馆中书本的动态,可能需要跟踪每本书的下列属性: Title :标题 Author :作者 Subject :类目 Book ID :书的 ID 为了定义结构,必须使用 struct 语句.struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下: struct type_name { membe…
C++ 的 I/O 发生在流中,流是字节序列.如果字节流是从设备(如键盘.磁盘驱动器.网络连接等)流向内存,这叫做输入操作.如果字节流是从内存流向设备(如显示屏.打印机.磁盘驱动器.网络连接等),这叫做输出操作. 下列的头文件在 C++ 编程中很重要. <iostream> 该文件定义了 cin.cout.cerr 和 clog 对象,分别对应于标准输入流.标准输出流.非缓冲标准错误流和缓冲标准错误流. <iomanip> 该文件通过所谓的参数化的流操纵器(比如 setw 和 se…
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要的不同: 不存在空引用.引用必须连接到一块合法的内存. 一旦引用被初始化为一个对象,就不能被指向到另一个对象.指针可以在任何时候指向到另一个对象. 引用必须在创建时被初始化.指针可以在任何时间被初始化. C++ 中创建引用 试想变量名称是变量附属在内存位置中的标签,可以把引用当成是变量附属在内存位置中…
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. #include <iostream> using namespace std; int main () { int var1; ]; cout << "var1 变量的地址: "; cout << &var1 << endl; cout << "var2 变量的地址: ";…
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 number0.number1.....number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[].numbers[].....numbers[] 来代表一个个单独的变量.数组中的特定元素可以通过索引访问. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址对应…
下面是一个 C++ 中定义各种类型数字的综合实例: #include <iostream> using namespace std; int main () { // 数字定义 short s; int i; long l; float f; double d; // 数字赋值 s = ; i = ; l = ; f = 230.47; d = 30949.374; // 数字输出 cout << "short s :" << s <<…
函数是一组一起执行一个任务的语句.每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 可以把代码划分到不同的函数中.如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的. 函数声明告诉编译器函数的名称.返回类型和参数.函数定义提供了函数的实际主体. C++ 标准库提供了大量的程序可以调用的内置函数.例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置…