C++ 学习笔记之 引用
一.定义:
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样.
二.用法:
- 基本用法
例如: int & a = b;
- 引用作为函数返回值
先看一个例子:
#include <iostream>
using namespace std;
class Node{
int x;
public:
Node(const Node & n){//去掉copy函数关于h的输出结果神奇般相同,原因未知
x = n.x;
}
Node(int x=):x(x){ }
};
int temp ;
int & F(){
temp*=;
return temp;
}
int F1(){
temp*=;
return temp;
}
Node F2(){
Node u();
cout << &u << " ";
return u;
}
int main(){
temp = ;
int &d = F(); //引用给引用,他们地址相同
int e = F(); //引用给非引用,发生了复制
const int & f = F();//把引用值赋值给常引用,他们的地址相同
const int & g = F1();//对于内置数据类型,把非引用值赋值给常引用,他们的地址不同
cout << &d << " " << &temp << endl;
cout << &e << " " << &temp << endl;
cout << &f << " " << &temp << endl;
cout << &g << " " << &temp << endl;
const Node & h = F2();//对于类对象类型,把非引用值赋值给常引用,他们的地址可能不同
cout << &h << endl;
cout << d << " " << temp << endl;
return ;
} 程序输出结果为:
0x602194 0x602194
0x7fffe0565418 0x602194
0x602194 0x602194
0x7fffe056541c 0x602194
0x7fffe0565410 0x7fffe0565410
80 80从结果中可以看到,当使用引用作为程序返回值并且将这个返回值赋值给引用类型时,他们的地址是相同的(都指向temp这个变量),其他情况都产生了值的赋值,发生了地址的变化。由此也可以看出,使用引用可以减少值的复制,特别是当需要传的数据特别大的时候。
- 另外,函数中返回非引用类对象赋值给const 引用变量时输出结果有些奇怪,不明白里面的copy函数为什么不调用但只加上就可以使他们的地址相同。
- 常引用
基本用法如下:int b = ;
const int a = b;使用常引用可以是引用的值不可修改。这样可以防止因误操作引发的数据修改,保证了安全性。
- 引用函数作为左值
一般非引用函数都是只能作为右值,函数一旦计算完成那么它就是一个确定的常数。但引用函数不同。它既可作为左值,又可作为右值。
int &d = ++F();
相当于
int A[];
int &array = A;这是它作为左值的应用。
但当我执行
int &d = F()++;
这样会产生错误。错误信息为:
error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
这个错误信息与执行
int &d = ;
的错误信息一致,说明F()++操作实际上是相当于先把F()的值存到一个整型常量中,然后F()(相当于temp)的值加一.一个整型常量无法复制给int&类型。
执行
const int &d = F()++;(使用常引用)
或
int d = F()++;(把常量值拷贝到变量中)
才可以正常编译。
三.注意事项:
- 引用不能用于数组,但可以用在指针上
如果尝试执行
int A[];
int &array = A;编译器会报错:
error: declaration of 'd' as array of references但我可以对指针用引用:
int *p = A;
int &array = p;编译成功。
至于为什么不能对数组用引用,网上答案很多,我自己不能确定哪种答案是正确的,大家可以自行搜索相关问题。
- 不要试图返回临时对象的引用,这样引用会成为无效引用,假如把返回值赋值给变量,那么程序可能会崩掉
- 返回函数内部new分配的内存的引用或指针,这样的写法不推荐,很容易会造成内存泄漏(即无法正常的回收这块内存)
- 注意常引用与普通引用之间的相互赋值问题
temp = ;
const int t = ;
int &d = temp;
const int &e = temp;
const int &f = t;
int &g = t;//编译错误常量变量都可以赋值给常引用,但只有变量值才可以给普通引用,若常量值给普通引用会发生编译错误。
- 另外记录一次在写C++作业的过程中偶然发现的一个问题,这加深了我对常引用以及ostream重载等的一些理解。点击跳转
C++ 学习笔记之 引用的更多相关文章
- C++学习笔记2——引用
1. int ival = 1; int &refVal = ival; //引用必须初始化,且类型严格匹配 2. int ival = 1; int &refVal = ival; ...
- (C/C++学习笔记) 十三. 引用
十三. 引用 ● 基本概念 引用: 就相当于为变量起了一个别名(alias), △与指针不同的是它不是一个数据类型 通过引用我们可以间接访问变量,指针也能间接访问变量,但引用在使用上相对指针更安全. ...
- Java学习笔记-方法引用
方法引用(Method Reference) 上一篇中记录了Lambda表达式,其可以创建匿名方法.当Lambda表达式只是调用一个存在的方法时,可以采用方法引用(JDK8具有的特性).如下: pub ...
- Java学习笔记day03_引用数据类型
1.引用数据类型 步骤: 1. 导包 2. 创建引用类型变量 类型 变量名 = new 类型名(); 3. 使用数据类型的功能 变量名.功能名(); 如Scanner类: import jav ...
- c++学习笔记之引用
引用是 C++ 的新增内容,在实际开发中会经常使用:C++ 用的引用就如同C语言的指针一样重要,但它比指针更加方便和易用,有时候甚至是不可或缺的. 同指针一样,引用能够减少数据的拷贝,提高数据的传递效 ...
- c#学习笔记01——引用&类
数据类型 值类型 bool 布尔值 True 或 False False byte 8 位无符号整数 0 到 255 0 char 16 位 Unicode 字符 U +0000 到 U +ffff ...
- c++ 学习笔记 c++ 引用C库注意点:#ifdef __cplusplus 倒底是什么意思?
时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #en ...
- HTML学习笔记 iframe引用页面按列(针对target打开方式解释) 第九节 (原创)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CMake学习笔记六-引用cmake文件
include(${CMAKE_CURRENT_SOURCE_DIR}/../Share/share.cmake)
随机推荐
- div盒子水平垂直居中的方法推荐
父盒子是position:relative 方法一:(宽高确定) div绝对定位水平垂直居中[margin 负间距], 方法二: (宽高确定) div绝对定位水平垂直居中[margin:auto实现绝 ...
- Java : java基础(6) 反射与枚举
类需要经过 加载, 连接, 初始化三个步骤来进行初始化. 加载是把class文件读入内存创建一个class对象, 连接分为三步,第一步是验证是否是正确的结构, 第二步是准备, 为类的静态成员分配内存, ...
- 支付宝PC端的支付(PHP)
现在的一个项目支付宝PC支付还是用的以前网关:https://mapi.alipay.com/gateway.do (是支付宝 2012年7月13日的3.3版本) 所以现在要做下支付宝PC支付的升级 ...
- 能够还原jQuery1.8的toggle的功能的插件
下面这个jQuery插件能够还原1.8的toggle的功能,如果你需要,可以直接把下面这段代码拷贝到你的jQuery里面,然后跟平时一样使用toggle的功能即可. //toggle plugin f ...
- 学习新框架laravel4 第一天(- -! 新公司版本使用的4,所以还要重新学习)
路由使用: //根目录 Route::get('/', function() { return View::make('hello'); }); 自定义模板: /app/views/home/inde ...
- Java开发小技巧(五):HttpClient工具类
前言 大多数Java应用程序都会通过HTTP协议来调用接口访问各种网络资源,JDK也提供了相应的HTTP工具包,但是使用起来不够方便灵活,所以我们可以利用Apache的HttpClient来封装一个具 ...
- 用matplotlib库画图
1.用例一 import matplotlib.pyplot as plt import numpy as np x=np.linspace(0,10,100) y=np.cos(2*np.pi*x) ...
- 苏州Uber优步司机奖励政策(4月2日~4月3日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Hihocoder #1515 : 分数调查
#1515 : 分数调查 http://hihocoder.com/problemset/problem/1515 分析 带权并查集. 如果把每个人抽象成一个点,之间的关系抽象成边.那么如果询问的两个 ...
- MySQL高级-性能分析Explain
1.使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.分析你的查询语句或是表结构的性能瓶颈 . 2.执行方法:Explain + SQL语句 解释 ...