码迷,mamicode.com
首页 > 编程语言 > 详细

C++引用

时间:2016-04-11 12:01:44      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

这个写的很不错

http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html

什么叫引用?

引用就是对某对象的另一个名字。

主要用途:

为了描述函数的参数和返回值,特别是运算符的重载。

用法:

X var;

X& r = var;

那么r是对象var的一个引用,而&在此处是作为引用的标识符而不是区地址。

特点:

(1)引用在创建的时候必须进行初始化,以确保引用会指向某个对象。

int i = 1;

int& r1 = i; //正确:r1被初始化

int& r2; //错误:r2没有被初始化

extern int& r3; //正确:r3在别处被初始化了

(2)所有对引用的操作,都可以看成是对被引用的对象执行的。

void g()

{

int ii = 0;

int& rr = ii;

rr++; //实际上是执行了ii++

int* pp = &rr; //pp指向了ii

}

因此在对应用进行操作时完全可以把引用替换为被引用的对象。

(3)一个引用的值在初始化之后就不可能改变了,它总是引用它初始化所指的那个对象,至死不渝。

(4)可以通过&r来获取r所指对象的地址。

(5)引用本身并不占有存储单元,有时候编译器可以通过优化去掉引用,使得在执行时根本不存在任何表示引用的东西。

(6)对于T&这种引用,属于变量引用,被引用的类型必须是T的左值,而对于const T&是常量引用,的初始式不必是一个左值,甚至可以不是类型T的,此时:

[1]首先需要将该类型到T类型进行隐式转换;

[2]随后将结果存入一个类型为T的临时变量;

[3]最后将这个临时变量作为初始式的值。

double& dr = 1; //错误,要求左值

const double& cdr = 1; //正确

对于初始化的解释是

double temp = double(1); //首先建立一个具有正确值的临时变量

const double& cdr = temp; //用临时变量作为cdr的初始值

这种保存引用初始式的临时变量将会一直存在,直到这个引用的作用域结束。

(7)需要区分对变量的引用和对常量的引用,常量引用是不能通过引用对目标变量进行修改的,从而使被引用的目标称为const,达到一定的安全性。

string foo();

void bar(string& s);

那么下列的表达式将是非法的:

bar(foo());

bar(“hello world”);

因为foo()和”hello world”串都会产生一个临时对象,而在C++中,这些临时对象都是const类型,上面表达式试图将const类型对象转为非congst类型对象,是非法的。

(8)可以通过引用来描述一个函数参数,使该函数能够改变传进来的该参数的值。

void increment(int& aa) { aa++; }

void f()

{

int x = 1;

increment(x); //x = 2

}

为了提高程序的可读性,应该避免让函数去修改它们的参数。相反应该让函数明确地返回一个值,或者明确要求一个指针参数:

int next(int p) { return p+1; }

void incr(int* p) { (*p)++; }

void g()

{

int x = 1;

increment(x); //x = 2

x = next(x); //x = 3

incr(&x); //x = 4

}

将引用作为参数传递进去将会,使得人们强烈感受到参数将被修改。

(9)引用还可以用于定义一些函数,使它们既可以被用于赋值的左边也可以用于右边。

(10)不能给数组建立引用,因为数组是若干元素组成的集合。

引用作为返回值

引用作为返回值需要在函数名前加&

引用作为返回值最大的好处就是内存中不产生被返回值的副本。

#include <iostream.h>

float temp;

float fn1(float r);

float &fn2(float r);

float fn1(float r)

{

temp = (float)(r*r*3.14);

return = temp;

}

flaot& fn2(float r)

{

temp = (float)(r*r*3.14);

return temp;

}

void main()

{

float a = fn1(10.0);

float &b = fn1(10.0);

float c = fn2(10.0);

float &d = fn2(10.0);

cout << a << c << d;

}

不能返回局部变量的引用,主要是因为局部变量会在函数返回后被销毁,因此被返回的引用就成了无所指的引用,使程序进入未知状态。

不能返回函数内部new分配的内存引用,虽然不存在被动销毁的问题,对于这种情况(返回函数内部new分配内存的使用),又面临其他尴尬局面,例如函数返回的引用只是作为一个临时变量出现,而没有被赋予一个时间的变量,那么这个引用所指向的空间就无法释放,造成memory leak。

可以返回类成员的引用,但最好是const,主要是当对象的属性与某种业务关联时,其赋值常常与某些其他的属性或者对象的状态有关,如果获得了非常量的引用则会导致单纯赋值破坏业务规则的完整性。

引用与一些操作符重载,这还是与引用可以作为左值有关。

引用和多态

C++引用

标签:

原文地址:http://www.cnblogs.com/tuhooo/p/5377406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!