笔记:C++学习之旅---引用

笔记:C++学习之旅---引用

什么是引用?
引用就是别名,引用并非对象,相反的,他只是为一个已经存在的对象所起的另外一个名字。
/*引用就是别名*/
#include <iostream>
using namespace std;

int main()
{
             int num;
             int &mum = num; //mum是num的别名,这两个变量是一个变量,只不过名字不同而已。对num的操作就是对mum的操作,这里‘&’不是取地址运算符,而是引用运算符,虽然符号一样,但是功能却不一样。
            num = 999;
            cout<< "mum:" <<mum<<endl; //结果为999
            mum = 0;
            cout<< "num:" <<num<<endl; //结果为0
    return 0;
}

/*引用就是别名变量*/
#include <iostream>
using namespace std;

int main()
{
             int a;
             int &ra = a;
            a = 999;
            cout<< "&a:" <<&a<<endl;
            cout<< "&ra:" <<&ra<<endl;
             int b = 888;
            ra = b;
            cout<< "&a:" <<&a<<endl; //ra和a地址和先前一样
            cout<< "&ra:" <<&ra<<endl;
            cout<< "&b:" <<&b<<endl; //b的地址不同
            cout<< "a:" <<a<<endl; //a = 888,同样ra是a的引用,a受到了牵连,所以a也等于888;
            cout<< "ra:" <<ra<<endl; //ra = 888,b的值赋值给了ra,所以ra值发生了改变;
            cout<< "b:" <<b<<endl; //b = 888
            ra = 1;
            cout<< "a:" <<a<<endl; //a = 1,由于ra = 1了,ra是a的引用,a受到牵连,所以a = 1;
            cout<< "ra:" <<ra<<endl; //ra = 1
            cout<< "b:" <<b<<endl; //b = 888,
            a = 666;
            cout<< "a:" <<a<<endl; //a = 666
            cout<< "ra:" <<ra<<endl; //ra = 666
            cout<< "b:" <<b<<endl; //b = 888
    return 0;
}
在上面例子中,我们将ra定义为a的别名,这样ra这个别名就只属于变量a,它不会变成b的别名。变量b只能将自己的值赋给这个ra,它不能改变ra的地址,比如说它不能让ra变成自己的别名。因此这个ra又可以看作是个别名常量,它是a的别名这个身份我们无法更改,我们能改变的只是他它引用的值。

引用对象
引用就是常量,在对其引用的同时要进行初始化
#include <iostream>
using namespace std;
class Human
{
public :
             void set( int x )
            {
                 i = x ;
            }
             int get()
            {
                return i;
            }
private :
             int i;
};
int main()
{
             Human Mike;
             Human &rMike = Mike; //定义一个对象的别名
             //Human &rHuman = Human;//不能定义一个类的别名,因为Human是一个类型,他没有具体的内存地址,所以我们不能定义它的别名;
    rMike.set(123); //通过引用来访问Human类
            cout<<rMike.get()<<endl;
             int a;
             int &ra = a;
             //int &ra;//这两行是错误的,引用就是常量,只能对其初始化,不能赋值
             //ra = a;  所以引用时一定要对该引用进行初始化
             return 0;
}

值传递、指针传递、引用传递
/*值传递*/
#include <iostream>
using namespace std;

void swap( int a , int b )
{
    int t;
            cout<< "swap函数中交换前a:" << a << ",b:" << b <<endl; //a = 3,b = 4
            t = a ;
             a = b ;
             b = t;
            cout<< "swap函数中交换后a:" << a << ",b:" << b <<endl; //a = 4,b = 3;
}
int main()
{
    int a = 3;
             int b = 4;
            cout<< "main函数中交换前a:" <<a<< ",b:" <<b<<endl; //a = 3,b = 4;
            swap(a,b);
            cout<< "main函数中交换后a:" <<a<< ",b:" <<b<<endl; //a = 3,b = 4,并没有发生改变,交换的只是a和b的副本;

             return 0;
}
a和b按值传递给swap函数,那么便一起会自动在栈中创建a和b的拷贝,然后将a和b的拷贝传递给swap函数。在swap函数中对a和b的拷贝进行交换。因此我们看到的输出语句,a和b确实进行了交换,只不过交换的是a和b的副本。所以并不是a和b的本身,所以在swap函数结束后,输出显示的main函数中的a和b并没有改变。

按址传递(指针传递)
/*按址传递(指针传递)*/
#include <iostream>
using namespace std;
void swap( int * a , int * b )
{
    int t;
            cout<< "swap函数中交换前a:" <<* a << ",b:" <<* b <<endl; //a = 3,b = 4;
            t = * a ;
            * a = * b ;
            * b = t;
            cout<< "swap函数中交换后a:" <<* a << ",b:" <<* b <<endl; //a = 4,b = 3;
}
int main()
{
             int a = 3;
             int b = 4;
            cout<< "main函数中交换前a:" <<a<< ",b:" <<b<<endl; //a = 3,b = 4;
            swap(&a,&b);
            cout<< "main函数中交换后a:" <<a<< ",b:" <<b<<endl; //a = 4,b = 3;
    return 0;
}
将a和b的地址传递给swap函数

引用传递
/*引用传递*/
#include <iostream>
using namespace std;
void swap( int & a , int & b ) //‘&’引用运算符,传递a和b的别名
{
    int t;
            cout<< "swap函数中交换前a:" << a << ",b:" << b <<endl; //a = 3,b = 4;
            t = a ;
             a = b ;
             b = t;
            cout<< "swap函数中交换后a:" << a << ",b:" << b <<endl; //a = 4,b = 3;
}
int main()
{
             int a = 3;
             int b = 4;
            cout<< "main函数中交换前a:" <<a<< ",b:" <<b<<endl; //a = 3,b = 4;
            swap(a,b);
            cout<< "main函数中交换后a:" <<a<< ",b:" <<b<<endl; //a = 4,b = 3;
    return 0;
}

/*利用指针返回多值*/
#include <iostream>
using namespace std;
int func( int a, int *b, int *c);
int main()
{
             int a = 1;
             int b = 2;
             int c = 3;
            cout<< "main函数调用func函数前...\n" ;
            cout<< "a:" <<a<<endl<< "b:" <<b<<endl<< "c:" <<c<<endl; //a = 1,b = 2,c = 3;
            func(a,&b,&c);
            cout<< "main函数调用func函数后...\n" ;
            cout<< "a:" <<a<<endl<< "b:" <<b<<endl<< "c:" <<c<<endl; //a = 1,b = 4,c = 27;a作为局部变量已经被释放所以打印的还是原先a = 1的值;

             return 0;
}
int func( int a , int * b , int * c )
{
    cout<< "func函数中,计算前...\n" ;
            cout<< "a:" << a <<endl<< "b:" <<* b <<endl<< "c:" <<* c <<endl; //a = 1,b = 2,c = 3;
             a = a + 1;
            * b = (* b )*(* b );
            * c = (* c )*(* c )*(* c );
            cout<< "func函数中,计算后...\n" ;
            cout<< "a:" << a <<endl<< "b:" <<* b <<endl<< "c:" <<* c <<endl; //a = 2,b = 4,c = 27;
             return a ;
}

/*利用引用传递返回多值*/
#include <iostream>
using namespace std;
int func( int a, int &b, int &c);
int main()
{
             int a,b,c;
             int check;
            cout<< "请输入一个数字,作为园的半径和正方形的边长\n" ;
            cin>>a;
            check = func(a,b,c);
    if (check)
            {
                cout<< "您输入的数字穿过计算范围\n" ;
            }
             else
            {
                cout<< "圆的面积为:" <<b<<endl;
                        cout<< "正方形的面积为:" <<c<<endl;
            }
             return 0;
}
int func( int a , int & b , int & c )
{
    if ( a > 20000)
            {
               a = 1;
            }
             else
            {
                b = a * a *3.14;
                         c = a * a ;
                         a = 0;
            }
             return a ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值