C++ 有三种传递方式:值传递,指针传递,引用传递
变量名称是变量附属在内存位置中的标签,可把引用看作是变量附属在内存位置中的第二个标签,可通过原始变量名称或引用来访问变量的内容
int i;
int & j; // 错误,没有初始化
int & k=i; // 正确,此时 &k = &i
#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;
}
- 返回一个引用时,要注意被引用的对象不能超出作用域.
- 当函数返回一个引用时,则返回一个指向返回值的隐式指针。函数可放在赋值语句的左边。
- 不能返回函数内部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;
}