定义与起源
- C++是一种高级编程语言,它是C语言的扩展。C++由Bjarne Stroustrup在20世纪80年代初开发,最初被称为“C with Classes”。其设计目的是在保持C语言高效性的同时,增加面向对象编程(OOP)的特性。例如,C语言主要侧重于过程式编程,像写一个简单的文件读取程序,在C语言中是通过一系列的函数调用来实现,如
fopen
、fread
、fclose
等函数按顺序操作。而C++在C的基础上,允许将文件读取操作封装到一个类中,这样可以更好地组织和管理代码。
主要特性
- 面向对象编程(OOP)
- C++支持类和对象的概念。类是一种用户定义的数据类型,它封装了数据成员(变量)和成员函数(方法)。例如,定义一个简单的
Circle
类来表示圆:
在这个例子中,class Circle { public: double radius; double calculateArea() { return 3.14 * radius * radius; } };
radius
是数据成员,calculateArea
是成员函数。可以通过创建Circle
类的对象来使用这些成员,如Circle myCircle; myCircle.radius = 2.0; double area = myCircle.calculateArea();
。 - C++支持类和对象的概念。类是一种用户定义的数据类型,它封装了数据成员(变量)和成员函数(方法)。例如,定义一个简单的
- 继承
- 继承允许创建一个新类(派生类),它继承了现有类(基类)的属性和行为。例如,定义一个
ColoredCircle
类继承自Circle
类:
这里class ColoredCircle : public Circle { public: std::string color; };
ColoredCircle
类继承了Circle
类的radius
成员和calculateArea
函数,同时还添加了自己的color
成员。 - 继承允许创建一个新类(派生类),它继承了现有类(基类)的属性和行为。例如,定义一个
- 多态
- 多态是指同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在C++中,通过虚函数来实现多态。例如,有一个基类
Shape
和两个派生类Circle
和Rectangle
,都有一个draw
函数:
可以通过基类指针来调用派生类的函数,如class Shape { public: virtual void draw() { std::cout << "Drawing a shape" << std::endl; } }; class Circle : public Shape { public: void draw() override { std::cout << "Drawing a circle" << std::endl; } }; class Rectangle : public Shape { public: void draw() override { std::cout << "Drawing a rectangle" << std::endl; } };
Shape* shape1 = new Circle; shape1->draw(); // 输出Drawing a circle
,根据对象的实际类型来决定调用哪个draw
函数。 - 多态是指同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在C++中,通过虚函数来实现多态。例如,有一个基类
- 模板(Templates)
- 模板是C++的一个强大特性,它允许编写泛型代码。例如,定义一个简单的模板函数来交换两个变量的值:
这个函数可以用于交换不同类型的变量,如template<typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; }
int num1 = 1, num2 = 2; swap(num1, num2);
或者double d1 = 1.0, d2 = 2.0; swap(d1, d2);
。
- 应用领域
- 系统软件
- C++在操作系统、编译器等系统软件的开发中广泛应用。例如,Linux操作系统的部分代码就是用C++编写的。C++的高效性使得它能够很好地处理系统资源的管理和底层操作。
- 游戏开发
- 许多大型游戏的引擎都是用C++编写的。像Unreal Engine(虚幻引擎),它提供了高性能的图形渲染、物理模拟等功能。C++可以直接操作硬件,能够充分利用计算机的性能来实现复杂的游戏逻辑和逼真的视觉效果。
- 数据库管理系统
- C++用于开发高性能的数据库管理系统。例如,MySQL数据库的部分核心代码是C++编写的。C++能够高效地处理大量的数据存储、检索和管理任务。
- 系统软件
- 与其他语言的比较
- 与C语言比较
- C++继承了C语言的语法和高效性。C语言主要是过程式编程,而C++在此基础上增加了面向对象编程等特性。例如,C语言中没有类的概念,在处理复杂的软件项目时,代码的组织和复用性相对较差,而C++可以通过类来更好地组织代码结构。
- 与Java比较
- Java是一种纯面向对象的编程语言,具有自动内存管理(垃圾回收)的特性。C++虽然也支持面向对象编程,但需要开发者手动管理内存(虽然也有智能指针等工具来辅助)。另外,C++的执行效率通常比Java高,因为Java有一层虚拟机的中间层,而C++编译后的代码直接在机器上运行。例如,对于一些对性能要求极高的实时系统,C++可能是更好的选择。
- 与C语言比较
C++程序结构
-
头文件部分(#include)
- 作用
- 头文件包含是C++程序结构的重要部分。
#include
指令用于将其他头文件的内容引入到当前文件中。头文件中通常包含函数声明、类定义、常量定义和模板声明等内容,这使得程序可以复用已有的代码定义,避免重复编写相同的代码片段。
- 头文件包含是C++程序结构的重要部分。
- 示例
- 标准库头文件:
#include <iostream>
是C++中最常用的头文件之一。它提供了输入输出流的功能,如std::cout
用于标准输出(控制台输出),std::cin
用于标准输入(控制台输入)。例如,在下面的代码中:
因为包含了#include <iostream> int main() { std::cout << "Hello, World!" << std::endl; return 0; }
<iostream>
头文件,所以能够使用std::cout
来输出字符串。- 用户自定义头文件:假设你有一个名为
myfunctions.h
的头文件,其中定义了一些函数声明,如int add(int a, int b);
。在主程序文件(假设为main.cpp
)中,你可以使用#include "myfunctions.h"
来包含这些函数声明,这样在main.cpp
中就可以调用add
函数。
- 标准库头文件:
- 作用
-
命名空间(namespace)使用
- 作用
- 命名空间用于将代码组织在不同的逻辑区域,主要目的是避免命名冲突。在大型项目或者使用多个库时,不同的部分可能会定义相同名称的函数、类或变量。命名空间就像一个容器,将相关的代码元素封装在一起,通过特定的语法来访问其中的内容。
- 示例
- 标准命名空间:在C++中,标准库中的大部分内容都位于
std
命名空间中。例如,std::cout
和std::cin
前面的std
就是命名空间。你可以通过using namespace std;
来避免每次都写std::
前缀,但这种做法在大型项目中可能会导致命名冲突。更好的做法是只引入需要使用的部分,如using std::cout; using std::cin;
或者在使用时完整地写上std::
前缀。 - 用户自定义命名空间:假设你定义了一个用户自定义命名空间
MyNamespace
,其中包含一个函数void myFunction()
。定义如下:
要使用这个函数,可以在namespace MyNamespace { void myFunction() { // 函数体内容 } }
main
函数或者其他函数中通过MyNamespace::myFunction();
来调用。 - 标准命名空间:在C++中,标准库中的大部分内容都位于
- 作用
-
全局变量和全局函数声明与定义(如果有)
- 作用
- 全局变量是在所有函数和类外部定义的变量,其作用域是整个程序文件。全局函数是在全局范围内定义的函数,可在程序的任何地方调用(只要在声明或定义之后)。不过,过多地使用全局变量和函数可能会导致程序的可读性和可维护性变差,因为它们可以在程序的任何地方被修改。
- 示例
- 全局变量声明和定义:
int globalVariable = 10; // 全局变量定义,同时初始化 extern int anotherGlobalVariable; // 全局变量声明,假设在其他文件中定义
- 全局函数声明和定义:
int globalFunction(int a, int b) { // 全局函数定义 return a + b; } extern int anotherGlobalFunction(int a); // 全局函数声明,假设在其他文件中定义
- 作用
-
主函数(main) - 程序的入口点
- 作用
main
函数是C++程序的起点,程序从main
函数的第一条语句开始执行。它有两种常见的形式:int main()
和int main(int argc, char* argv[])
。int main()
是最简单的形式,函数返回一个int
类型的值,通常用于表示程序的退出状态(0表示正常退出,非0表示异常退出)。int main(int argc, char* argv[])
用于处理命令行参数,其中argc
表示命令行参数的个数,argv
是一个字符指针数组,argv[0]
通常是程序的名称,argv[1]
到argv[argc - 1]
是实际的命令行参数。
- 示例
- 简单的
main
函数:
int main() { std::cout << "This is a simple C++ program." << std::endl; return 0; }
- 带有命令行参数处理的
main
函数:
int main(int argc, char* argv[]) { if (argc > 1) { std::cout << "Command - line arguments: "; for (int i = 1; i < argc; ++i) { std::cout << argv[i] << " "; } std::cout << std::endl; } else { std::cout << "No command - line arguments." << std::endl; } return 0; }
- 简单的
- 作用
-
函数定义(包括成员函数和非成员函数)
- 作用
- 函数是一段完成特定任务的代码块。函数定义包括函数头(返回类型、函数名称和参数列表)和函数体(花括号内的代码)。函数可以接收参数,执行一系列操作,并返回一个结果(如果返回类型不是
void
)。在面向对象编程中,还有成员函数,它们是类的一部分,用于操作类的对象的数据成员。
- 函数是一段完成特定任务的代码块。函数定义包括函数头(返回类型、函数名称和参数列表)和函数体(花括号内的代码)。函数可以接收参数,执行一系列操作,并返回一个结果(如果返回类型不是
- 示例
- 非成员函数定义:
int add(int a, int b) { return a + b; }
- 成员函数定义(假设存在一个类
MyClass
):
class MyClass { public: int data; void setData(int value) { data = value; } };
- 作用
-
类定义(如果是面向对象程序)
- 作用
- 类是一种用户定义的数据类型,用于封装数据成员(变量)和成员函数(方法)。类的定义包括类头(
class
关键字、类名称和可能的继承关系)和类体(花括号内的内容,包括数据成员和成员函数的声明)。通过类可以创建对象,对象是类的实例,它们具有自己的数据成员副本,并可以调用成员函数来操作这些数据。
- 类是一种用户定义的数据类型,用于封装数据成员(变量)和成员函数(方法)。类的定义包括类头(
- 示例
- 简单的类定义:
class Rectangle { public: int width; int height; int area() { return width * height; } };
- 带有构造函数和析构函数的类定义:
class ComplexNumber { public: double real; double imaginary; ComplexNumber(double r = 0.0, double i = 0.0) : real(r), imaginary(i) {} // 构造函数 ~ComplexNumber() {} // 析构函数 double magnitude() { return std::sqrt(real * real + imaginary * imaginary); } };
- 作用