函数是 C++ 中的基本构建块,它允许我们将代码组织成可重用的模块。每个函数(除了 `void` 函数)都有一个明确的 返回值类型,它规定了函数执行完毕后将返回何种类型的数据。
int
, float
, double
, long long
- 返回基本数值类型char
, std::string
- 返回单个字符或字符串 (需 #include
)bool
- 返回逻辑真 (true
) 或假 (false
)void
- 不返回 任何值int&
, double&
- 返回一个变量的 引用 (别名)int*
, char*
- 返回一个指向某种类型数据的 指针 (内存地址)struct
)、类 (class
) 对象函数参数是函数与外部世界沟通的桥梁。C++ 提供了多种参数传递方式,主要有以下三种:
函数接收的是实参的 副本。在函数内部修改形参,不会 影响函数外部的原始实参。
void func(int x);
函数接收的是实参的 别名。在函数内部修改形参,会直接 影响函数外部的原始实参。
void func(int &x);
函数接收的是实参的 内存地址。通过解引用指针 (*
),函数内部可以访问和修改原始实参。
void func(int *x);
作用域 (Scope) 是指标识符(如变量名、函数名)在程序代码中有效的区域。
{...}
) 内部声明的变量。如果在内部作用域(如函数内)声明了一个与外部作用域(如全局)同名的变量,内部变量会 遮蔽 外部变量。在该内部作用域中,直接使用该名称访问的是内部变量。
// 假设在全局作用域
int globalValue = 10; // 全局变量
void scopeDemo() {
int localVar = 20; // 局部变量,仅在 scopeDemo 内可见
int globalValue = 30; // 局部变量,遮蔽了全局的 globalValue
// 访问变量
// cout << localVar << endl; // 输出 20 (局部变量)
// cout << globalValue << endl; // 输出 30 (访问的是被遮蔽的局部 globalValue)
// cout << ::globalValue << endl; // 使用作用域解析符 :: 访问全局 globalValue, 输出 10
} // localVar 和 局部的 globalValue 在此销毁
使用 static
关键字修饰的局部变量:
void countCalls() {
static int callCount = 0; // 静态局部变量,只初始化一次为 0
callCount++;
// cout << "函数已被调用 " << callCount << " 次" << endl;
}
调用次数: 0
全局变量 (Global Variables) 在所有函数之外声明,其作用域从声明点开始,直到文件结束。默认情况下,它们在整个程序(包括其他文件,需配合 extern
)中都是可见的。
// 在某处声明
int globalCounter = 100;
一个函数可以访问和修改全局变量:
void modifyGlobal() {
globalCounter += 10; // 直接访问并修改
// cout << globalCounter;
}
如果想在一个 C++ 文件 (.cpp
) 中使用另一个文件中定义的全局变量,需要在当前文件中使用 extern
关键字进行 声明(不是定义)。这告诉编译器该变量在别处定义。
// ---- file1.cpp ----
#include
int sharedGlobalVar = 5; // 定义并初始化全局变量
// ---- file2.cpp ----
#include
extern int sharedGlobalVar; // 声明 file1.cpp 中的全局变量
void printGlobal() {
// std::cout << "来自 file1 的值: " << sharedGlobalVar << std::endl; // 可以访问
sharedGlobalVar = 10; // 也可以修改
}
测试一下你对本章内容的掌握程度吧!(点击选项查看答案和解析)
int calculate();
void printMessage();
bool checkStatus();
char getInitial();
void
作为返回值类型表示函数不返回任何值。void modify(int x) { x = x + 5; }
和调用 int num = 10; modify(num);
,调用后 num
的值是多少?modify
使用的是按值传递 (int x
)。形参 x
是实参 num
的一个副本。在函数内部修改 x
不会影响原始的 num
。因此,num
的值仍然是 10。int x
)int &x
)const int &x
)int* func()
)int &x
) 允许函数通过形参直接操作原始实参。按指针传递 (int *x
) 也可以达到修改目的,但选项中更直接的是引用传递。常量引用 (const int &x
) 则禁止在函数内修改。fileA.cpp
中定义了全局变量 int count = 0;
。要在 fileB.cpp
中访问并修改这个 count
变量,应该在 fileB.cpp
中如何做?count
,无需声明。static int count;
声明。extern int count;
声明。extern
关键字用于向编译器声明一个变量或函数是在其他源文件中定义的,使得当前文件可以链接并使用它。动手实践是最好的学习方式!尝试完成下面的编程任务。
编写一个 C++ 函数 swapInts
,该函数接收两个整型变量的引用作为参数,并交换它们的值。函数本身不返回值 (void
)。
例如,调用前 a = 5, b = 10
,调用 swapInts(a, b)
后,应使得 a = 10, b = 5
。
编写一个 C++ 函数 countGreaterThan
,该函数接收一个整型数组、数组的大小和一个整数阈值 (threshold) 作为参数。函数应返回数组中有多少个元素严格大于该阈值。
例如,对于数组 {1, 5, 2, 8, 3}
,大小为 5,阈值为 4
,函数应返回 2
(因为 5 和 8 大于 4)。
恭喜你完成了 C++ 自定义函数的学习!回顾一下关键知识点:
返回值类型 函数名(参数列表) { 函数体 }
的结构来创建可重用的代码块。void
(无返回值),也可以是基本类型、引用、指针或自定义类型,通过 return
语句返回值。继续练习,加深理解!