笔记: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
  ;
 
 
 }
                
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号