《C++程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记
文章目录
【前言】C 和 C++ 的区别与联系
C 和 C++是两种不同的编程语言,它们之间存在区别与联系。
区别
(1)语法特性:
-
C语言是面向过程的编程语言,注重程序的过程和函数的设计,语法相对简洁。
-
C++在C语言的基础上添加了面向对象的特性,如类、对象、继承、多态等,使得代码更加模块化和可复用。
(2)标准库:
- C语言的标准库主要包括输入输出函数、字符串处理函数等。
- C++在C语言标准库的基础上,添加了大量的模板库,如STL(Standard Template Library),包括容器、算法、迭代器等,方便开发和使用。
(3)内存管理:
- C语言需要手动管理内存,包括分配和释放内存空间。
- C++引入了自动内存管理机制,通过构造函数和析构函数自动处理内存的分配和释放,避免了内存泄漏和越界访问的问题。此外,C++还引入了智能指针等特性来进一步简化内存管理。
(4)异常处理:
- C语言中没有原生的异常处理机制,开发者需要使用错误码或其他方式来处理错误和异常情况。
- C++引入了异常处理机制(try-catch语句),可以捕获和处理程序运行过程中的异常情况,使得错误处理更加灵活和易于管理。
(5)名称空间:
- C++引入了命名空间(namespace)的概念,可以用来避免不同库或代码之间的命名冲突问题。而C语言没有命名空间的概念,通常通过文件作用域和static关键字来避免命名冲突。
(6)文件后缀名:
- C语言的源文件通常使用“.c”作为文件扩展名。
- C++的源文件则通常使用“.cpp”作为文件扩展名。
联系
(1)兼容性:C++是C语言的超集,大部分符合C语言语法规范的程序也可以在C++环境中编译和运行。C++程序员可以在C++中直接使用C语言代码,包括数据类型、基本语法结构、运算符以及大多数标准库函数等。
(2)应用场景:C语言以其高效、简洁的特点广泛应用于嵌入式和底层开发等领域;而C++则凭借其丰富的特性和灵活性适用于系统软件和应用软件的开发,如大型软件系统、图形图像处理、游戏开发等。
综上所述,C和C++在语法特性、标准库、内存管理、异常处理、名称空间以及文件后缀名等方面存在显著区别,但同时它们之间也存在紧密的联系和兼容性。在实际应用中,开发者可以根据项目的需求选择合适的语言来实现最优的开发效果。
1、程序设计语言简介
1)程序设计是人机交互的重要媒介
学好程序设计包含两个方面的内容,一方面要熟练掌握程序设计语言的使用方法,另一方面也要学会计算机思维分析和表达现实世界的问题。
2)程序设计语言的发展概况
-
机器语言:0,1 编码的指令序列构成,依赖于特定型号的计算机硬件,执行效率高,但难移植,对程序员来说编写、阅读和修改都比较困难
-
汇编语言:“ADD”、“MOV”,尝试用一些简洁的英文符号来代替指令中特定的二进制串,虽然也对硬件比较依赖,移植性不好,但程序精炼且质量高
-
高级语言:上述两种语言开发效率低且容易出错,人们开始寻找一种接近于数学或自然语言的编程语言,不依赖于硬件,编出的程序能在不同的机器上通用。第一个完全脱离机器硬件的高级语言 FORTRAN 于 1954 年问世!高级语言的发展也经历了从早期的无结构语言到结构化语言,从过程型语言到面向对象语言的历程
2、C++语言的特点与程序结构
1)C++语言的特点
- 语言简练、程序结构简单:大部分功能都由各种标准函数和类来实现
- 数据类型丰富、齐全:整数、实数、字符、字符串等基本数据类型,数组、指针、结构体等构造数据类型,还有类这一个特殊数据类型
- 运算符丰富、齐全:有常规运算符(算数、逻辑、关系运算符)和硬件有关的运算符(位、地址运算符)
- 语言的通用性及可移植性强:
2)简单的 C++ 程序例
eg 1-1 输出 “Hello World”
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World";
return 0;
}
第一行,是一个“文件包含指令”,是 C++ 编译预处理指令之一,作用是将文件 iostream 的内容包含到该指令所在的程序文件中
第二行,使用命名空间 std,C++标准库中的类和函数的在命名空间 std 中进行了声明
cout
是 C++系统定义的对象名,成为输出流对象
return
返回 0 表示程序正常结束,如果程序不能正常执行,则会自动向操作系统返回一个非零值,一般为 -1
eg 1-2 求 a、b两个数之和
#include <iostream>
using namespace std;
int main()
{
int a,b,sum;
cin>>a>>b;
sum = a + b;
cout<<"a+b="<<sum<<endl;
return 0;
}
>>
是“提取运算符”,cin
是输入对象流
endl
是 C++输出时的控制符,作用是换行,end line
eg 1-3 输出两个数中的较大数
#include <iostream>
using namespace std;
int max(int x, int y)
{
int z;
if (x>y)
z = x;
else
z = y;
return z;
}
int main()
{
int a, b, m;
cin >> a >> b;
m = max(a, b);
cout << "max=" << m << "\n";
return 0;
}
output
1 2
max=2
输入的两个数据之间可用空格或回车键隔开
eg 1-4 用面向对象程序设计管理学生信息
#include <iostream>
using namespace std;
class Student
{private:
int num;
int score;
public:
void setdata()
{
cin >> num;
cin >> score;
}
void display()
{
cout<<"num="<<num<<endl;
cout<<"score="<<score<<endl;
}
};
int main()
{
Student stu1, stu2;
stu1.setdata();
stu2.setdata();
stu1.display();
stu2.display();
return 0;
}
output
1
98
2
99
num=1
score=98
num=2
score=99
数据成员和成员函数
3)C++程序的结构
- C++程序可以由一个或多个编译单元构成,每一个编译单元为一个文件
- 一个文件可以包括编译预处理命令(
#include <iostream>
: 包含标准输入输出库,用于输入输出操作。
#define, #ifndef, #endif 等:用于条件编译和宏定义)、头文件、命名空间、全局声明、函数等部分 - 一个函数由函数头部和函数体组成
- C++语句以分号结束
- 一个C++程序总是从 main 函数开始执行的
- 类是 C++ 新增加的重要的数据类型,是 C++ 对 C 的最重要的发展
- C++ 程序书写自由,一行内可以写几个语句,一个语句可以分写在多行上
- 好的、有使用价值的源程序都应当加上必要的注释
3、过程型程序设计
1)过程型程序设计的特点
一个过程型程序应包括以下两方面内容:
-
对数据的描述(数据结构)
-
对操作的描述(算法)
程序 = 算法+数据结构
优点:
- 简单直观:过程型程序设计通常比较直观,易于理解和实现。程序按照步骤执行,逻辑清晰,对于小型项目或简单任务来说,这种直观性是优势。
- 资源高效:在某些情况下,过程型程序设计可能更为资源高效,因为它通常不需要额外的抽象层,而直接执行任务步骤。
- 易于调试:由于程序是按照顺序执行的,定位和调试问题相对较为容易。程序员可以逐步追踪代码的执行流程。
缺点:
- 可维护性差:随着项目规模的增大,过程型程序设计可能导致代码难以维护。添加新功能或修改现有功能可能会影响整个程序,增加了出错的可能性。
- 可重用性差:过程型程序设计通常缺乏良好的模块化和抽象,使得代码的重用性降低。相同或类似的功能可能需要在不同的地方重复实现。
- 不适用大型项目:在大型、复杂的项目中,过程型程序设计可能难以应对复杂性和需求的变化。面向对象编程等其他范式更适合大型项目的组织和管理。
2)程序设计流程图
算法的描述方法有用自然语言表示算法、流程图表示算法、N-S盒图表示算法、伪代码表示算法、计算机语言表示算法
4、面向对象程序设计
1)面向对象程序设计的特点
Object-Oriented Programming,OOP
- 抽象,Abstraction,忽略对象的无关细节,强调对象的关键特征和行为
- 简化问题
- 提高代码的可读性
- 促进代码重用
- 封装,Encapsulation
- 数据隐藏:对象的内部数据对外部不可见,只有通过对象的接口才能访问和修改这些数据
- 提高代码的可维护性:封装将数据和操作封装在一起,形成一个独立的单元。这使得代码更加模块化和易于维护。当需要修改对象的行为时,只需修改对象内部的实现细节,而无需修改外部代码。
- 促进代码重用
- 继承,Inheritance,它允许子类继承父类的属性和方法,从而实现代码的复用和扩展。
- 代码复用
- 扩展功能
- 建立层次结构
- 多态,Polymorphism,它允许不同类型的对象对相同的消息做出不同的响应。例如同样是加法,把两个字符串加一起和把两个整数加一起的内涵是完全不同的
- 提高代码的可重用性
- 简化接口设计
2)如何进行面向对象程序设计
- 面向对象分析,Object Oriented Analysis,OOA
- 面向对象设计,Object Oriented Design,OOD
- 面向对象编程,Object Oriented Programming,OOP
- 面向对象测试,Object Oriented Test,OOT
- 面向对象维护,Object Oriented Soft Maintenance,OOSM
面向对象程序设计需要遵循一定的步骤和原则,包括需求分析、架构设计、详细设计、编程实现以及封装、继承、多态和抽象等面向对象设计的原则。通过定义类和对象、实现类的内部实现、建立对象之间的联系以及调试和测试等步骤,可以开发出高效、可维护和可扩展的面向对象程序。
附录
glibc(GNU C Library)和 uclibc(Micro C Library)的区别与联系
(1)区别
功能与应用场景
- glibc:是 GNU 项目发布的一个 C 标准库,是 Linux 系统中最常用的 C 标准库。 它提供了全面的 C 标准库支持,包括 POSIX 标准,支持多种硬件和内核平台,功能强大且全面。glibc主要应用于桌面和服务器环境中的 GNU/Linux 系统,能够满足大多数应用的需求。
- uclibc:是一个轻量级的 C 标准库,专为嵌入式Linux系统设计。 它体积小巧,功能相对精简,只提供最基本的 C 库函数,专注于性能和空间优化。uclibc 主要应用于资源受限的嵌入式系统,帮助开发者减小应用体积,提高系统性能。
体积与资源占用
- glibc:由于功能全面,glibc 的体积相对较大,代码较多,编译出来的函数库占用较多系统资源。
- uclibc:体积小,代码量较少,编译出来的函数库占用资源少,更适合资源受限的嵌入式系统。
可配置性
- glibc:虽然功能强大,但在可配置性方面相对较弱,用户难以根据具体需求对库进行裁剪。
- uclibc:具有高度的可配置性,开发人员可以根据功能需求和空间限制,灵活地裁剪和配置 uclibc 的功能,以满足特定嵌入式系统的需求。
兼容性
- glibc:与大多数 Linux 发行版和应用程序兼容,是 Linux 系统的标准 C 库。
- uclibc:虽然与 glibc 在已有的接口上兼容,但并未包括 glibc 中的所有接口实现。因此,有些在 glibc 中可以编译和运行的应用程序,在 uclibc 中可能无法编译或运行。
实现方式
- glibc:是独立开发的,实现了完整的 C 标准库功能,并提供了许多扩展功能。
- uclibc:为了应用于嵌入式系统,uclibc 重新实现了 C 标准库的部分功能,并进行了大量优化和裁剪。
(2)联系
- 都是C标准库的实现:glibc 和 uclibc 都是 C 语言标准库的实现,为开发者提供了 C 标准库函数,支持 C 语言程序的编译和运行。
- 都遵循开源原则:glibc 和 uclibc 都是开源项目,其源代码可以自由获取和使用,遵循相应的开源许可证。
- 目标一致:虽然应用场景和功能有所不同,但 glibc 和 uclibc 都致力于提供高效、稳定的 C 标准库支持,帮助开发者更好地编写 C 语言程序。
(3)选择建议
- 桌面和服务器环境:如果你的应用程序需要支持多种硬件和操作系统平台,且对功能全面性有较高要求,那么glibc是更好的选择。
- 嵌入式系统:如果你的应用程序需要在资源受限的嵌入式系统中运行,且对性能和空间有较高要求,那么uclibc可能更适合。
总之,glibc和uclibc各有其特点和适用场景。在选择时,需要根据具体的应用需求和运行环境进行综合考虑。