引用(reference)

3.9 引用(reference)

3.9.1 引用基本用法

引用是c++对c的重要扩充。在c/c++中指针的作用基本都是一样的,但是c++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference),它也存在于其他一些编程语言中,并不是c++的发明。

  1. 变量名实质上是一段连续内存空间的别名,是一个标号(门牌号)
  2. 程序中通过变量来申请并命名内存空间
  3. 通过变量的名字可以使用存储空间

对一段连续的内存空间只能取一个别名吗?

c++中新增了引用的概念,引用可以作为一个已定义变量的别名。

基本语法:

Type& ref = val;

注意事项:

  1. &在此不是求地址运算,而是起标识作用。
  2. 类型标识符是指目标变量的类型
  1. 必须在声明引用变量时进行初始化。
  2. 引用初始化之后不能改变。
  3. 不能有NULL引用。必须确保引用是和一块合法的存储单元关联。
  4. 建立对数组的引用。

//1. 认识引用

void test01(){

int a = 10;

//给变量a取一个别名b

int& b = a;

cout << "a:" << a << endl;

cout << "b:" << b << endl;

cout << "------------" << endl;

//操作b就相当于操作a本身

b = 100;

cout << "a:" << a << endl;

cout << "b:" << b << endl;

cout << "------------" << endl;

//一个变量可以有n个别名

int& c = a;

c = 200;

cout << "a:" << a << endl;

cout << "b:" << b << endl;

cout << "c:" << c << endl;

cout << "------------" << endl;

//a,b,c的地址都是相同的

cout << "a:" << &a << endl;

cout << "b:" << &b << endl;

cout << "c:" << &c << endl;

}

//2. 使用引用注意事项

void test02(){

//1) 引用必须初始化

//int& ref; //报错:必须初始化引用

//2) 引用一旦初始化,不能改变引用

int a = 10;

int b = 20;

int& ref = a;

ref = b; //不能改变引用

}

建立数组引用:

//1. 建立数组引用方法一

typedef int ArrRef[10];

int arr[10];

ArrRef& aRef = arr;

for (int i = 0; i < 10;i ++){

aRef[i] = i+1;

}

for (int i = 0; i < 10;i++){

cout << arr[i] << " ";

}

cout << endl;

//2. 建立数组引用方法二

int(&f)[10] = arr;

for (int i = 0; i < 10; i++){

f[i] = i+10;

}

for (int i = 0; i < 10; i++){

cout << arr[i] << " ";

}

cout << endl;

3.9.3 引用的本质

引用的本质在c++内部实现是一个常指针.

Type& ref = val; // Type* const ref = &val;

c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见。

//发现是引用,转换为 int* const ref = &a;

void testFunc(int& ref){

ref = 100; // ref是引用,转换为*ref = 100

}

int main(){

int a = 10;

int& aRef = a; //自动转换为int* const aRef = &a;这也能说明引用为什么必须初始化

aRef = 20; //内部发现aRef是引用,自动帮我们转换为: *aRef = 20;

cout << "a:" << a << endl;

cout << "aRef:" << aRef << endl;

testFunc(a);

return EXIT_SUCCESS;

}

3.9.4 指针引用

在c语言中如果想改变一个指针的指向而不是它所指向的内容,函数声明可能这样:

void fun(int**);

给指针变量取一个别名。

Type* pointer = NULL;  

Type*& = pointer;

Type* pointer = NULL;  Type*& = pointer;

struct Teacher{

int mAge;

};

//指针间接修改teacher的年龄

void AllocateAndInitByPointer(Teacher** teacher){

*teacher = (Teacher*)malloc(sizeof(Teacher));

(*teacher)->mAge = 200;  

}

//引用修改teacher年龄

void AllocateAndInitByReference(Teacher*& teacher){

teacher->mAge = 300;

}

void test(){

//创建Teacher

Teacher* teacher = NULL;

//指针间接赋值

AllocateAndInitByPointer(&teacher);

cout << "AllocateAndInitByPointer:" << teacher->mAge << endl;

//引用赋值,将teacher本身传到ChangeAgeByReference函数中

AllocateAndInitByReference(teacher);

cout << "AllocateAndInitByReference:" << teacher->mAge << endl;

free(teacher);

}

对于c++中的定义那个,语法清晰多了。函数参数变成指针的引用,用不着取得指针的地址。

3.9.5 常量引用

常量引用的定义格式:

const Type& ref = val;

常量引用注意:

  1. 字面量不能赋给引用,但是可以赋给const引用
  2. const修饰的引用,不能修改。

void test01(){

int a = 100;

const int& aRef = a; //此时aRef就是a

//aRef = 200; 不能通过aRef的值

a = 100; //OK

cout << "a:" << a << endl;

cout << "aRef:" << aRef << endl;

}

void test02(){

//不能把一个字面量赋给引用

//int& ref = 100;

//但是可以把一个字面量赋给常引用

const int& ref = 100; //int temp = 200; const int& ret = temp;

}

      1. 引用使用场景

常量引用主要用在函数的形参,尤其是类的拷贝/复制构造函数。

将函数的形参定义为常量引用的好处:

  • 引用不产生新的变量,减少形参与实参传递时的开销。
  • 由于引用可能导致实参随形参改变而改变,将其定义为常量引用可以消除这种副作用。

 如果希望实参随着形参的改变而改变,那么使用一般的引用,如果不希望实参随着形参改变,那么使用常引用。

//const int& param防止函数中意外修改数据

void ShowVal(const int& param){

cout << "param:" << param << endl;

}

3.9.6.1 引用使用中注意点

最常见看见引用的地方是在函数参数返回值中。当引用被用作函数参数的时,在函数内对任何引用的修改,将对还函数外的参数产生改变。当然,可以通过传递一个指针来做相同的事情,但引用具有更清晰的语法。

如果从函数中返回一个引用,必须像从函数中返回一个指针一样对待。当函数返回值时,引用关联的内存一定要存在。

//值传递

void ValueSwap(int m,int n){

int temp = m;

m = n;

n = temp;

}

//地址传递

void PointerSwap(int* m,int* n){

int temp = *m;

*m = *n;

*n = temp;

}

//引用传递

void ReferenceSwap(int& m,int& n){

int temp = m;

m = n;

n = temp;

}

void test(){

int a = 10;

int b = 20;

//值传递

ValueSwap(a, b);

cout << "a:" << a << " b:" << b << endl;

//地址传递

PointerSwap(&a, &b);

cout << "a:" << a << " b:" << b << endl;

//引用传递

ReferenceSwap(a, b);

cout << "a:" << a << " b:" << b << endl;

}

通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单:

  1.  函数调用时传递的实参不必加“&”符
  2.  在被调函数中不必在参数前加“*”符

引用作为其它变量的别名而存在,因此在一些场合可以代替指针。C++主张用引用传递取代地址传递的方式,因为引用语法容易且不易出错。

//返回局部变量引用

int& TestFun01(){

int a = 10; //局部变量

return a;

}

//返回静态变量引用

int& TestFunc02(){

static int a = 20;

cout << "static int a : " << a << endl;

return a;

}

int main(){

//不能返回局部变量的引用

int& ret01 = TestFun01();

//如果函数做左值,那么必须返回引用

TestFunc02();

TestFunc02() = 100;

TestFunc02();

return EXIT_SUCCESS;

}

  1. 不能返回局部变量的引用。

函数当左值,必须返回引用。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LaTeX是一种排版系统,可以让用户轻松地创建漂亮的文档。其中一个重要的功能是引用参考文献。在LaTeX中,参考文献被称为“reference”,可以方便地引用和管理。 创建reference可以使用不同的方式,最常用的是使用BibTeX工具。BibTeX可以为用户提供一个简单的文本数据库,其中包含完整的参考文献信息,包括作者,标题,出版日期等。用户可以通过调用这些信息来引用文献。 要引用reference,用户可以在其文本中使用命令“\cite{ }”,并在括号中输入相应的引用标识符。标识符通常与BibTeX的数据库实体名称相对应。在编译文档时,LaTeX会自动检索相应的参考文献并将其插入到文档中。 在LaTeX中,用户还可以选择不同的引用样式,以调整参考文献的外观和格式。这些样式通常以“.bst”文件的形式提供,用户可以在编译之前选择不同的样式文件。 总之,LaTeX的reference功能为用户提供了强大的文献引用和管理功能,使其可以轻松地创建清晰,准确和美观的参考文献。 ### 回答2: Latex参考文献是指在Latex文档中引用参考资料的方法和规范。在学术写作中,参考文献的准确引用是非常重要的,它不仅可以增强文章的可信度,还能够让读者轻松地找到原始资料。 在Latex中,参考文献的引用通常需要配合使用BibTeX,它是一种基于LaTeX的应用程序,能够将文档引用的参考资料列表编译成一个独立的文献库文件。使用BibTeX可以大大简化参考文献的引用操作,同时还能够实现各种特殊格式要求。 在Latex中编写参考文献时,通常需要进行以下步骤: 1. 编写参考资料库文件(.bib文件),这通常需要手动或者使用参考资料管理软件完成。 2. 在LaTeX文档中使用bibliography命令引用参考资料库文件,例如: \bibliography{mybibfile} 3. 在文档中需要引用参考文献的地方使用cite命令,例如: \cite{article1,article2} 这里的article1和article2是在参考资料库文件中定义的参考文献条目。 4. 使用Latex编译生成文档,其中包括有自动按参考次序排序的参考文献列表。 在编写参考文献时,有一些常见的注意事项: 1. 引用文章的格式要求通常由论文的出版社或期刊标准规定,需要在写作前了解清楚。 2. 对于同一篇文章的不同版本,应该使用不同的条目定义来区分。 3. 参考资料库文件应该包含全部引用的参考文献条目,以免遗漏。 总之,Latex参考文献和reference是学术写作中不可或缺的组成部分,熟练掌握其使用方法可以提高文献引用的准确性和效率。 ### 回答3: LaTeX(发音为lay-tech)是一种排版系统,广泛用于学术界和科研领域中。LaTeX最重要的特点是可以用代码来排版文档,可以轻松处理大量的专业符号和复杂的文档结构,而且生成的文档看起来更加美观、规范化。在LaTeX中,参考文献是非常重要的一部分。 一个完整的参考文献列表应该包括以下信息:作者、题目、出版年份、书名、页面、出版社和ISBN号等。参考文献的格式通常有几种,包括MLA、APA、Chicago等等。在LaTeX中,我们通过使用BibTeX来生成参考文献。BibTeX是一种软件,它可以帮助我们自动把参考文献引用到需要的地方,同时还能方便地生成参考文献目录。 在LaTeX中,我们需要在文档的头部指定参考文献的格式。我们需要选择一个合适的参考文献样式,并且指定参考文献文件的路径。接着,我们需要在LaTeX文件中定义参考文献的引用方式。这通常是通过使用\cite命令来实现的,引用方式可以是数字、作者名字等等。在文档中引用参考文献时,我们需要使用\cite命令来引用。当我们编译LaTeX文档时,BibTeX会自动处理参考文献并生成参考文献目录。我们可以通过修改参考文献文件(.bib文件)自定义参考文献的内容和格式。 总的来说,LaTeX的参考文献功能可以帮助我们快速、准确地生成参考文献列表和文中引用。与手动创建参考文献相比,LaTeX的参考文献带来的便利非常明显,尤其是在处理大型文献和多篇文章引用时,其效率更高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值