目录
引用的概念
引用不是新定义一个变量,而是给已存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
定义格式:
数据类型& 引用名=引用的目标;
例如: int& ra=a;//给a取别名叫ra
引用的条件:
- 引用的同时必须初始化
- 引用的类型必须和引用的目标保持一致
- 引用的目标一旦确定就不能更改
引用的基本使用
#include <iostream>
#include <string>
//字符串的头文件,C语言的头文件string.h,如:strcopy(),strlen(),strcmp()
//而C++的字符串的头文件代表的是一个类
using namespace std;
int main()//C++规定,主函数的返回值必须是int类型的
{
int a = 10;
int * pa = &a;
cout<<"&a"<<&a<<endl;
cout<<"&pa:"<<&pa<<endl;//会单独开辟一片内存空间的
cout<<"pa:"<<pa<<endl;
int b = 10;//初始化
int & rb = b;//给b变量取别名叫rb
cout<<"&b:"<<&b<<endl;//0x61fe80
cout<<"&rb:"<<&rb<<endl;//0x61fe80
cout<<"b:"<<b<<endl;//10
cout<<"rb:"<<rb<<endl;//10
//int & rb = a;error 重定义
rb = a;//这是表示给a取别名叫rb吗?
//不是,是赋值
cout<<"&rb:"<<&rb<<'\t'<<"&a:"<<&a<<endl;
return 0;
}
常引用
格式:
const 数据类型& 引用名=引用的目标;
功能:不能通过引用来改变引用目标的值,但是可以通过引用的目标来改变值,通常可以将常引用用于函数的形参以保证形参不能通过引用被改变。但是可以通过
代码示例:
#include <iostream>
#include <string>
//字符串的头文件,C语言的头文件string.h,如:strcopy(),strlen(),strcmp()
//而C++的字符串的头文件代表的是一个类
using namespace std;
int add(const int& a,const int& b)//常引用,当我们的引用放在函数的形参位置时,可以不进行初始化
{
return a+b;//将引用设置为常引用时,函数体的内部不会对形参进行更改
}
int main()//C++规定,主函数的返回值必须是int类型的
{
int a = 10;
int & ra = a;
int b = 30;
const int & rb = b;
ra = 10;
//rb = 30;//error
b = 20;//b的值不能通过rb改变但是可以通过b可以改变
//rb和b指向同一片空间
cout<<"sum:"<<add(a,b)<<endl;
return 0;
}
结构体中的引用成员
代码示例:
#include <iostream>
#include <string>
//字符串的头文件,C语言的头文件string.h,如:strcopy(),strlen(),strcmp()
//而C++的字符串的头文件代表的是一个类
using namespace std;
struct Student
{
int h = 43;
int age;
int & score;//引用成为结构体成员时可以不进行初始化
int & height = h;//也可以在结构体中进行初始化操作
//Student(int h,int a,int& s,int& he):h(h),age(a),score(s),height(he){}
//这种初始化方式使用圆括号进行,需要写构造函数
};
int main()
{
int sco = 98;
int hei = 180;
//结构体中的成员定义是可以不进行初始化,但是用之前必须进行初始化,并且不能用引用直接初始化
//Student s1(8,9,sco,hei);//结构体中使用引用必须初始化
Student s2={8,9,sco,hei};
//1、如果结构体中对引用没有初始化,必须在定义结构体变量的时候进行初始化
//2、如果结构体中对引用初始化,可以在定义定义结构体变量的时候不进行初始化
//cout<<s1.h<<endl<<s1.score<<endl;
return 0;
}
指针和引用的区别
- 引用访问一个变量是直接访问,而指针是间接访问。
- 引用是变量的别名,不需要对其进行内存分配,但是指针需要内存分配。
- 引用的目标一旦确定就不能修改,但是指针能够改变指向。
- 引用必须在定义时就初始化,但是指针在定义时可以指向NULL,如果进行指向说明就会成为野指针。
- sizeof的含义不同:引用的大小是引用的数据类型的大小,而指针的大小是指针的大小,固定的4字节。