C++引用
引用是C++新增的复合类型,引用是已定义变量的别名。
引用的用途:做函数的形参和返回值。
引用的语法
引用类型 & 引用名 = 原变量名
案例
#include<cstdio> #include<iostream> using namespace std; void swap(int&a,int&b) //通过引用交换数值 { int tmp = a; a = b; b = tmp; } int main() { int a = 3; //(1) int b = 5; //(2) printf("%d %d",a,b);//(3) 打印的内容是一样的吗?? swap(a,b); //(4) printf("%d %d",a,b);//(5) }
定义
int
类型变量并赋值为3
定义
int
类型变量并初始化为5
打印交换前的变量
a
和b
调用
swap
函数对a
和b
进行交换(通过引用)打印交换后的值
这段代码的
a
和b
经过我们的swap
函数调用后,成功的输出了交换后的值
3 5
5 3
足够说明
作为形参的引用会指向形参,类似于指针,调用函数后,实现了真正的交换。
引用的形参和const
在C++中,引用是一个别名,即它是另一个变量的同义词。通过使用引用,可以通过不同的名称访问同一变量的内容。引用通常用于将函数的参数传递给另一个函数或在函数内返回值。
例如,以下代码创建了一个整数类型的引用并将其初始化为变量a的引用:
int a = 5;
int &ref = a;
现在,可以使用ref
来访问和修改变量a
的值,就像使用变量a
一样。
另一方面,const
关键字指定了一个变量的值不能被修改。此关键字可应用于任何数据类型(如基本数据类型、类、结构等)。
例如,以下代码声明了一个整数类型的常量:
const int b = 10;
在这个例子中,变量b
的值被设置为10,并且不能被修改。如果试图更改该变量的值,则会导致编译错误。
可以将引用和const
结合使用来创建常量引用,如下所示:
const int& ref = a;
在这个例子中,使用const
关键字将引用ref
定义为一个常量引用,它只能访问变量a
的值,但不能修改它。
引用可以和指针玩出什么新花样?
- 引用参数的指针
2
- 指向引用的指针
int main() {
int a = 0;
int &ref = a; // 定义引用ref,并使其指向变量a
int *&ptr = &ref; // 定义指向引用的指针ptr
*ptr = 123; // 使用指针访问引用所指向的变量并赋值
std::cout << a << std::endl; // 输出a的值,将会输出123
return 0;
}
- 引用成员变量和指针成员变量
class MyClass {
public:
MyClass(int &ref, int *ptr) : ref_(ref), ptr_(ptr) {}
void setRef(int val) { ref_ = val; } // 设置引用成员变量的值
void setPtr(int val) { *ptr_ = val; } // 设置指针成员变量所指向的变量的值
private:
int &ref_; // 引用成员变量
int *ptr_; // 指针成员变量
};
int main() {
int a = 0;
int b = 0;
MyClass obj(a, &b); // 创建对象,并将引用和指针传递给构造函数
obj.setRef(123); // 调用成员函数设置引用的值
obj.setPtr(456); // 调用成员函数设置指针所指向的变量的值
std::cout << a << "," << b << std::endl; // 输出a和b的值,将会输出123,456
return 0;
}
这些示例代码演示了使用引用和指针结合的一些常见场景。当然,在实际使用时需要根据具体情况进行灵活处理。
引用和typedef
有什么区别?
虽然引用和typedef都可以用来给变量取别名,但它们之间有着本质的区别。
引用是一个变量的别名,而
typedef
是一个类型的别名。引用提供了对变量的直接访问,而typedef则提供了对类型的简单命名。引用必须在定义时就进行初始化(即指定初始值),一旦初始化完成后就不能再改变引用所绑定的变量。而typedef可以随时使用,也可以用来定义多个变量。
引用只能与其指向的变量绑定在一起,而typedef可以为任何类型创建一种新的名称。引用通常用于传递函数参数、返回函数结果或者作为类成员变量;typedef则常用于简化复杂类型的声明。
下面是一个示例代码,演示了引用和typedef的区别:
#include <iostream>
using namespace std;
typedef int myInt;
// 定义一个函数,使用引用作为参数
void func(int& ref) {
ref++;
}
int main() {
// 使用typedef定义一个整型别名
myInt a = 10;
// 定义一个引用,并将其初始化为a的别名
int& b = a;
cout << "a=" << a << ", b=" << b << endl;
// 调用函数,传入引用参数
func(b);
cout << "After calling func, a=" << a << ", b=" << b << endl;
return 0;
}
在这个示例中,我们首先使用typedef定义了一个myIn
t类型,它是int
类型的别名。然后,我们定义了一个整型变量a,并将其初始化为10。接着,我们定义了一个引用b
,并将其初始化为a
的别名。
在调用函数func
之前,我们输出了a
和b
的值。然后,我们将b作为参数传递给函数func
,func
会向其传入的引用参数ref所绑定的变量加1。最后,我们再次输出a和b的值,可以看到它们的值都增加了1。
总之,虽然引用和typedef都可以用来取别名,但它们在本质上有着不同的作用和用法。在实际编程中,我们需要根据具体情况选择合适的方式来定义变量或者类型的别名。