C++中引用的简单介绍与使用注意

来源:互联网 发布:汉诺塔递归算法复杂度 编辑:程序博客网 时间:2024/06/18 15:00

C++引用可以让你给一个已有的变量取一个别名, 你可以用它对这个变量中的内存信息进行读取和修改。 这可能听起来不是那么有吸引力, 这意味着当你声明一个引用并为它分配一个变量, 你就可以在不同作用域通过引用的声明操作改变被引用变量的值。如果你让你的函数参数引用 你可以通过这个函数的方法去改变源内存中的信息。这十分不同于你用函数参数传递使其产生一个用来拷贝的新变量。你还可以通过引用来减少函数在幕后发生的拷贝。

 

基础语法

 

声明一个引用为int型变量:

 

int& foo = ....;

 

 

这里的“....”就是就是你要告诉编译器你要引用的变量, foo即为他的别名, 当你创建它,你必须初始化使另一个变量的地址在幕后让你你使用它来修改这个变量。

通过这样的方法有点像你用一个指针指向一个变量来操作指针指向的内存。

不过其中还是有两点区别:1.引用不需要解除指针, 你只需要把它当做普通变量来使用。2.你创建引用变量时你不需要专门为其赋值,编译器会在幕后自动帮你找到变量内存地址:

 

int x;

int& foo = x;

 

// foo作为引用将x的值改为56

foo = 56;

std::cout << x <<std::endl;

 

函数参数作引用

 

这是一个简单将函数参数作引用交换两数值的例子:

void swap (int& first, int& second)

{

        int temp = first;

        first = second;

        second = temp;

}

两个参数通过引用可以让函数被调用时知道要传递的是地址:

int a = 2;

int b = 3;

swap( a, b );

交换后a = 3,b = 2.事实上引用可能导致一些混乱,因为传进去的参数可能被改变而在仅仅在被调用函数程序段中不是那么显而易见, 而指针则可清楚地表达传进去了内存可能会被改变的意思。

 

引用提高运行效率

 

你可能会想你从来没想过通过引用来改变值哪点好。 其实引用就是意味着你可以不必去增加拷贝, 不必做过多的处理。当你使用类做函数参数时, 用引用可以帮你节省很大的开销, 基本上类作参数时要通过引用, 注意通常要加一个const。

例子:

int workWithClass( const MyClass& a_class_object )

{

}

建立一个常量引用时为了防止类中变量被修改。 这样你就可以随时改变一个很大的对象方法。避免用指针传递大的对象, 用引用可以让你的代码更简洁, 增加可读性。

 

引用的安全问题

 

为了使代码目的看起来更加明确, 在一个大或小的实例中观察无效引用。

 

首先, 你引用你定义的一个空指针,你的引用将是无效的:

 int *x = 0;

int& y = *x;

如果你现在去用这个引用,就会因为访问无效内存而出错。 这样子做实际上没有访问到*x中储存的值。

 

另一个重大的问题就是可能引用到一块曾经有效单后面释放后的失效内存:

 

int& getLocalVariable()

{

        int x;

        return x;

}


这里在栈中创建了一个引用函数, 将x返回给他,使他的值改变, 但是函数由于存放在栈中会释放掉, 这块内存将不在再有效。

 

引用与动态分配内存

 

最后, 要注意对动态内存的引用, 第一个问题就是当你引用动态内存时, 不清楚这块内存是否被释放了, 不过通常是不需要知道的。 这样的好处是当你向一个函数传数据时你不需要对再去担心内存的释放。(反正只要不是太多浪费)

 另一方面, 如果你返回一个引用去申请一块动态内存, 如果不清楚内存是否需要被调用函数清理, 那你就是自找麻烦。 



0 0
原创粉丝点击