Skip to content

Latest commit

 

History

History
102 lines (80 loc) · 2.35 KB

引用.md

File metadata and controls

102 lines (80 loc) · 2.35 KB

引用

Abstract

C++ 有三种传递方式:值传递,指针传递,引用传递

introduction

定义

变量名称是变量附属在内存位置中的标签,可把引用看作是变量附属在内存位置中的第二个标签,可通过原始变量名称或引用来访问变量的内容

语法

声明:数据类型 & 标识符 初始化

示例:

int i;  
int & j;  // 错误,没有初始化  
int & k=i; // 正确,此时 &k = &i  

作为参数:数据类型 函数名标识符(数据类型 &形参名标识符)

注意:引用型参数应该在能被定义为const的情况下,尽量定义为const

细节:实参传入形参时,例如foo()和"hello world"串都会产生const类型的临时对象

示例:

#include<iostream>
#include<string>

std::string foo();
// 不加 const 会报错
void bar(const std::string & s)
{
	std::cout << s;
}

std::string foo()
{
	std::string a = "int";
	return a;
}

int main() 
{
	//那么下面的表达式将是非法的:
	bar(foo());
	bar("hello world");
	return 1;
		 
}

作为返回值:数据类型 & 函数标识符(数据类型 形参名标识符)

注意:

  1. 返回一个引用时,要注意被引用的对象不能超出作用域.
  2. 当函数返回一个引用时,则返回一个指向返回值的隐式指针。函数可放在赋值语句的左边。
  3. 不能返回函数内部new分配的内存的引用。

示例:

#include <iostream>
 
using namespace std;
 
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
 
double& setValues( int i )
{
  return vals[i];   // 返回第 i 个元素的引用
}
 
int& func() {
   int q;
   //! return q; // 在编译时发生错误
   static int x;
   return x;     // 安全,x 在函数作用域外依然是有效的
}

// 要调用上面定义函数的主函数
int main ()
{
 
   cout << "改变前的值" << endl;
   for ( int i = 0; i < 5; i++ )
   {
       cout << "vals[" << i << "] = ";
       cout << vals[i] << endl;
   }
 
   setValues(1) = 20.23; // 改变第 2 个元素
   setValues(3) = 70.8;  // 改变第 4 个元素
 
   cout << "改变后的值" << endl;
   for ( int i = 0; i < 5; i++ )
   {
       cout << "vals[" << i << "] = ";
       cout << vals[i] << endl;
   }
   return 0;
}