一文吃透C++程序结构,小白也能秒懂!

目录

一、C++ 程序结构初印象

二、深入剖析 C++ 程序结构

2.1 预处理命令

2.2 函数

2.3 变量与数据类型

2.4 语句与控制结构

三、C++程序结构的高级特性

3.1 类与对象

3.2 模板

3.2.1 函数模板

四、总结与展望

4.1 书籍推荐

4.2 网站推荐

4.3 在线课程推荐


一、C++ 程序结构初印象

        在 C++ 的世界里,我们先来通过一个经典的 “Hello World” 程序,揭开它神秘的面纱。这就好比我们学习外语时,最先学会的 “Hello” 一样,是踏入 C++ 编程大门的第一步。

#include <iostream>  // 引入输入输出流头文件,用于实现输入输出功能
using namespace std;  // 使用标准命名空间,这样就可以直接使用std命名空间中的标识符,而不用每次都写std::

int main()  // 主函数,程序的入口,任何一个可执行的C++程序都必须有一个main函数
{
    cout << "Hello World!" << endl;  // 输出“Hello World!”到控制台,并换行
    return 0;  // 返回0,表示程序正常结束
}

        运行这个程序,屏幕上就会神奇地出现 “Hello World!” 的字样。从这个简单的程序中,我们可以一窥 C++ 程序结构的基本组成部分:

  • 头文件(Header Files):#include <iostream>这一行,其中#include是预处理指令,它的作用是在编译之前,将尖括号内指定的头文件内容插入到当前源文件中。iostream头文件包含了输入输出相关的函数和对象的声明,比如cout(标准输出流对象,用于输出数据到控制台)和cin(标准输入流对象,用于从控制台读取数据)。C++ 有许多标准头文件,每个头文件都提供了特定的功能,我们在编写程序时,根据需要引入相应的头文件。例如,#include <cmath>用于数学计算相关的函数,#include <vector>用于使用向量容器等。

  • 命名空间(Namespace):using namespace std;声明使用标准命名空间std。命名空间是 C++ 中用来避免命名冲突的一种机制。在大型项目中,不同的库或者模块可能会定义相同名字的变量、函数或类,如果没有命名空间,这些名字就会相互冲突。std是 C++ 标准库使用的命名空间,通过using namespace std;声明后,我们就可以直接使用std命名空间中的成员,如cout、endl(表示换行)等,而不需要写成std::cout、std::endl。不过,在实际编程中,不建议在全局作用域使用using namespace std;,因为这样可能会引入一些潜在的命名冲突,更好的做法是使用std::前缀来明确指定命名空间,或者在局部作用域内使用using声明引入特定的成员,比如using std::cout; 。

  • 主函数(Main Function):int main()是整个程序的入口点,程序从这里开始执行。无论程序中有多少代码,执行的流程总是从main函数开始。main函数返回一个int类型的值,这个返回值通常用于向操作系统报告程序的执行状态。一般来说,返回值为 0 表示程序正常结束,非零值表示程序出现了异常或错误 。在main函数内部,花括号{}括起来的部分是函数体,包含了程序要执行的具体操作。比如在 “Hello World” 程序中,cout << "Hello World!" << endl;这一行就是在函数体中,它实现了向控制台输出字符串 “Hello World!” 并换行的功能。

        通过这个简单的 “Hello World” 程序,我们对 C++ 程序结构有了一个初步的认识,接下来,我们将深入探讨每个部分的详细内容和更多的 C++ 编程知识。

二、深入剖析 C++ 程序结构

2.1 预处理命令

        预处理命令是在编译之前由预处理器执行的特殊指令,它们以 “#” 符号开头,常见的预处理命令有#include和#define 。

  • #include:用于包含头文件,将指定头文件的内容插入到当前源文件中。头文件通常包含函数声明、类型定义、常量定义等,通过#include可以让我们使用这些已定义好的内容,避免重复编写代码。例如,在前面的 “Hello World” 程序中,#include <iostream>引入了输入输出流相关的头文件,使我们能够使用cout和cin进行输入输出操作。除了标准库头文件(用尖括号<>括起来),我们也可以包含自定义的头文件,这时使用双引号"",比如#include "myheader.h",预处理器会先在当前源文件所在目录查找myheader.h,若找不到再去标准头文件目录查找。

  • #define:主要用于定义常量和宏。定义常量时,它将一个标识符定义为一个常量值,在预处理阶段,预处理器会将代码中所有出现该标识符的地方替换为对应的常量值。例如:

#define PI 3.1415926  // 定义常量PI
#include <iostream>
int main()
{
    double r = 5.0;
    double area = PI * r * r;  // 使用常量PI计算圆的面积
    std::cout << "圆的面积是: " << area << std::endl;
    return 0;
}

        这里定义了PI为圆周率的值,在计算圆面积时,PI会被替换为3.1415926 。

        #define还可以定义宏函数,宏函数是一种特殊的宏,它看起来像函数调用,但在预处理阶段是通过文本替换来实现的,而不是像普通函数那样进行函数调用。例如:

#define MAX(a, b) ((a) > (b)? (a) : (b))  // 定义宏函数MAX,返回两个数中的较大值
#include <iostream>
int main()
{
    int x = 10;
    int y = 20;
    int max_value = MAX(x, y);  // 使用宏函数MAX
    std::cout << "较大值是: " << max_value << std::endl;
    return 0;
}

        在上述代码中,MAX(x, y)在预处理阶段会被替换为((x) > (y)? (x) : (y)) 。需要注意的是,宏函数只是简单的文本替换,不会进行参数类型检查,使用时要格外小心,避免出现意想不到的错误 。

2.2 函数

        函数是 C++ 程序中完成特定任务的独立代码块,它可以提高代码的复用性和模块化程度 。

  • 函数的定义:函数定义包括返回值类型、函数名、参数列表和函数体。其一般形式如下:
返回值类型 函数名(参数列表)
{
    // 函数体,包含一系列执行语句
    return 返回值;  // 如果返回值类型不是void,必须有return语句返回一个值
}

例如,下面是一个计算两个整数之和的函数定义:

int add(int a, int b)  // 返回值类型为int,函数名为add,参数列表包含两个int类型的参数a和b
{
    int sum = a + b;  // 计算两数之和
    return sum;  // 返回计算结果
}
  • 函数的声明:函数声明用于告诉编译器函数的名称、返回值类型和参数列表,以便在调用函数时进行语法检查。函数声明和函数定义的参数列表必须一致,返回值类型也必须相同。函数声明通常放在源文件的开头或者头文件中,函数定义可以在源文件的其他位置或者其他源文件中。函数声明的形式如下:
返回值类型 函数名(参数列表);

        例如,对于上述add函数,其声明可以写成:

 

int add(int a, int b);

  • 函数的调用:在程序中使用函数时,通过函数调用执行函数体中的代码。函数调用的形式为函数名加上括号,括号内是传递给函数的实际参数(实参),实参的个数和类型必须与函数声明和定义中的形式参数(形参)一致。例如:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雨淅淅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值