文章目录
- [可以修改参数值的比较值传递(int x)和引用传递(int &x)](#可以修改参数值的比较值传递(int x)和引用传递(int &x))
- [使用const不修改参数值的比较值传递(const int x)和引用传递(const int &x)](#使用const不修改参数值的比较值传递(const int x)和引用传递(const int &x))
-
- [1. `const int x` 示例](#1.
const int x示例) - [2. `const int &x` 示例](#2.
const int &x示例)
- [1. `const int x` 示例](#1.
可以修改参数值的比较值传递(int x)和引用传递(int &x)
cpp
#include <iostream>
void modifyByValue(int x) {
std::cout << "Inside modifyByValue:" << std::endl;
std::cout << " x before modification: " << x << std::endl;
x = 20; // 修改副本
std::cout << " x after modification: " << x << std::endl;
}
void modifyByReference(int &x) {
std::cout << "Inside modifyByReference:" << std::endl;
std::cout << " x before modification: " << x << std::endl;
x = 20; // 修改原始变量
std::cout << " x after modification: " << x << std::endl;
}
int main() {
int a = 10;
std::cout << "Before function calls:" << std::endl;
std::cout << " a: " << a << std::endl;
modifyByValue(a);
std::cout << "After modifyByValue:" << std::endl;
std::cout << " a: " << a << std::endl;
modifyByReference(a);
std::cout << "After modifyByReference:" << std::endl;
std::cout << " a: " << a << std::endl;
return 0;
}
modifyByValue函数(值传递)
cpp
void modifyByValue(int x) {
std::cout << "Inside modifyByValue:" << std::endl;
std::cout << " x before modification: " << x << std::endl;
x = 20; // 修改副本
std::cout << " x after modification: " << x << std::endl;
}
void modifyByValue(int x):定义一个函数modifyByValue,接受一个int类型的参数x。这是值传递,x是a的副本。std::cout << "Inside modifyByValue:" << std::endl;:打印当前在modifyByValue函数内部。std::cout << " x before modification: " << x << std::endl;:打印x的值(副本),值是 10。x = 20;:修改x的值。由于x是副本,这种修改不会影响main函数中的原始变量a。std::cout << " x after modification: " << x << std::endl;:打印修改后的x的值,结果是 20。
modifyByReference函数(引用传递)
cpp
void modifyByReference(int &x) {
std::cout << "Inside modifyByReference:" << std::endl;
std::cout << " x before modification: " << x << std::endl;
x = 20; // 修改原始变量
std::cout << " x after modification: " << x << std::endl;
}
void modifyByReference(int &x):定义一个函数modifyByReference,接受一个int &类型的参数x。这是引用传递,x是对原始变量的引用。std::cout << "Inside modifyByReference:" << std::endl;:打印当前在modifyByReference函数内部。std::cout << " x before modification: " << x << std::endl;:打印x的值(引用),值是 10。x = 20;:修改x的值,由于x是对a的引用,这会直接修改a的值。std::cout << " x after modification: " << x << std::endl;:打印修改后的x的值,结果是 20。
main函数
cpp
int main() {
int a = 10;
std::cout << "Before function calls:" << std::endl;
std::cout << " a: " << a << std::endl;
modifyByValue(a);
std::cout << "After modifyByValue:" << std::endl;
std::cout << " a: " << a << std::endl;
modifyByReference(a);
std::cout << "After modifyByReference:" << std::endl;
std::cout << " a: " << a << std::endl;
return 0;
}
int a = 10;:定义一个整型变量a,并初始化为 10。std::cout << "Before function calls:" << std::endl;:打印在调用函数之前a的值。std::cout << " a: " << a << std::endl;:打印a的值,结果是 10。modifyByValue(a);:调用modifyByValue函数,将a的值传递给函数。函数内部的x是a的副本,对x的修改不会影响a。std::cout << "After modifyByValue:" << std::endl;:打印在调用modifyByValue函数之后a的值。std::cout << " a: " << a << std::endl;:打印a的值,结果仍然是 10,因为modifyByValue函数中的修改不影响原始变量。modifyByReference(a);:调用modifyByReference函数,将a的引用传递给函数。函数内部的x是a的引用,对x的修改直接影响a。std::cout << "After modifyByReference:" << std::endl;:打印在调用modifyByReference函数之后a的值。std::cout << " a: " << a << std::endl;:打印a的值,结果是 20,因为modifyByReference函数中的修改影响了原始变量a。
执行结果
Before function calls:
a: 10
Inside modifyByValue:
x before modification: 10
x after modification: 20
After modifyByValue:
a: 10
Inside modifyByReference:
x before modification: 10
x after modification: 20
After modifyByReference:
a: 20
总结
- 值传递(
int x) :函数接收a的副本,对副本的修改不会影响原始变量a。在modifyByValue中,a的值保持不变。 - 引用传递(
int &x) :函数接收a的引用,对引用的修改会直接影响原始变量a。在modifyByReference中,a的值被修改为 20。
使用const不修改参数值的比较值传递(const int x)和引用传递(const int &x)
const int x 与 const int &x 的区别
在 C++ 中,const 关键字用于定义常量,意味着被修饰的变量的值不能被修改。const 可以与传值和传引用都不能改变元素值 的方式结合使用,效果有所不同。
-
const int x:x是一个常量整型参数,函数内部不能修改x的值。x是以值的方式传递的,这意味着函数内部使用的是x的副本,而不是原始变量的引用。这种方式适用于传递小的基本数据类型。 -
const int &x:x是一个常量整型的引用,函数内部不能修改x引用的值。引用传递不会复制数据,只是传递了数据的引用。通常在传递较大的对象时使用,以提高效率并避免不必要的数据复制。
1. const int x 示例
cpp
#include <iostream>
void printValue(const int x) {
// 打印 x 的值
std::cout << "Value of x: " << x << std::endl;
// 尝试修改 x 的值(这会引发编译错误)
// x = 20; // 错误: 'x' 是常量,不能被修改
}
int main() {
int a = 10;
// 调用 printValue 函数,传递整数值
printValue(a);
return 0;
}
-
#include <iostream>- 包含输入输出流库,用于标准输入输出操作。
-
void printValue(const int x) {- 定义了一个函数
printValue,它接受一个const int参数x。x是一个常量整型参数,函数内部不能修改它的值。
- 定义了一个函数
-
std::cout << "Value of x: " << x << std::endl;- 打印
x的值。由于x是传值的,函数内部对x的操作不会影响原始变量a的值。
- 打印
-
// x = 20;- 注释掉的代码,尝试修改
x的值会引发编译错误,因为x是const的。
- 注释掉的代码,尝试修改
-
int main() {- 主函数的开始。
-
int a = 10;- 定义一个整型变量
a,并初始化为 10。
- 定义一个整型变量
-
printValue(a);- 调用
printValue函数,传递a的值。此处,a的值 10 被复制到x中。
- 调用
执行结果:
Value of x: 10
2. const int &x 示例
cpp
#include <iostream>
void displayValue(const int &x) {
// 打印 x 的值
std::cout << "Value of x: " << x << std::endl;
// 尝试修改 x 的值(这会引发编译错误)
// x = 20; // 错误: 'x' 是常量,不能被修改
}
int main() {
int a = 10;
// 调用 displayValue 函数,传递整数变量的引用
displayValue(a);
return 0;
}
逐行解释:
-
#include <iostream>- 包含输入输出流库。
-
void displayValue(const int &x) {- 定义了一个函数
displayValue,它接受一个const int &参数x。这是一个常量整型引用,函数内部不能修改x引用的值。
- 定义了一个函数
-
std::cout << "Value of x: " << x << std::endl;- 打印
x的值。由于x是传引用的,函数内部对x的操作不会影响原始变量a的值。x直接引用a。
- 打印
-
// x = 20;- 注释掉的代码,尝试修改
x的值会引发编译错误,因为x是const的。
- 注释掉的代码,尝试修改
-
int main() {- 主函数的开始。
-
int a = 10;- 定义一个整型变量
a,并初始化为 10。
- 定义一个整型变量
-
displayValue(a);- 调用
displayValue函数,传递a的引用。此处,x引用a,所以x的值是 10。
Value of x: 10
- 调用