c++ 引用类型【&】需注意之第一次有效性

c++中的引用类型大家都有所了解,但是它的“第一次有效性”常常被忽略。
什么是第一次有效性呢?就是引用类型只有在第一次附值时被当作引用,其它时候的附值被认为是对它所引用的内容进行的附值。
举个小例子:

#include <iostream>

using namespace std;

int main() 
{
	int a = 3;
	int b = 4;
	int& c = a;
	c = b;
	c = 5;
	cout << a << b << endl ;
	system("pause");
}

大家觉得输出会是多少呢?
3 5 吗?
但实际结果可能会让你困惑: 5 4
因为第一次附值后,c就是a的代名词了, 且永远无法改变这个事实。
后而的附值操作实际是对a进行的。


为什么要把这个问题提出来?

因为我在使用的过程中出现了这种情况:Tree* & tree;
即“指针的引用”。
当我令

 tree = tree->left;
 tree = new Tree;

时无论如何不能正确输出。于是意识到了这个问题。

下面是部分代码:
解决办法就不在此呈现了。

struct Tree
{
    Tree* left;
    Tree* right;
    int data;
    int count;
    Tree(int data_ = 0)
    {
        left = right = 0;
        data = data_;
        count = 0;
    }
    static void search(Tree* p, int aim)
    {
        Tree* & tree = p;   // 就是这里
        while(true)
        {
            if(tree == 0)
            {
                tree = new Tree(aim);   // 实际是改变的形参 p的值。
                break;
            }
            if(aim == tree->data)
            {
                tree->count++;
                break;
            }
            if(aim < tree->data)
            {
                tree = tree->left;    //还有这里
            }else
            {
                tree = tree->right;	//还有这里
            }
        }
    }
};
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值