📜  C++中的参考

📅  最后修改于: 2021-05-26 02:48:10             🧑  作者: Mango

当将变量声明为引用时,它将成为现有变量的替代名称。通过在声明中添加“&”,可以将变量声明为引用。

CPP
#include
using namespace std;
 
int main()
{
  int x = 10;
 
  // ref is a reference to x.
  int& ref = x;
 
  // Value of x is now changed to 20
  ref = 20;
  cout << "x = " << x << endl ;
 
  // Value of x is now changed to 30
  x = 30;
  cout << "ref = " << ref << endl ;
 
  return 0;
}


CPP
#include
using namespace std;
 
void swap (int& first, int& second)
{
    int temp = first;
    first = second;
    second = temp;
}
 
int main()
{
    int a = 2, b = 3;
    swap( a, b );
    cout << a << " " << b;
    return 0;
}


CPP
struct Student {
   string name;
   string address;
   int rollNo;
}
 
// If we remove & in below function, a new
// copy of the student object is created.
// We use const to avoid accidental updates
// in the function as the purpose of the function
// is to print s only.
void print(const Student &s)
{
    cout << s.name << "  " << s.address << "  " << s.rollNo;
}


CPP
#include 
using namespace std;
 
int main()
{
    vector vect{ 10, 20, 30, 40 };
 
    // We can modify elements if we
    // use reference
    for (int &x : vect)
        x = x + 5;
 
    // Printing elements
    for (int x : vect)
       cout << x << " ";
 
    return 0;
}


CPP
#include 
using namespace std;
 
int main()
{
    vector vect{"geeksforgeeks practice",
                     "geeksforgeeks write",
                     "geeksforgeeks ide"};
 
    // We avoid copy of the whole string
    // object by using reference.
    for (const auto &x : vect)
       cout << x << endl;
 
    return 0;
}


C++
#include 
using namespace std;
 
int main() {
    int i=10; //simple or ordinary variable.
    int *p=&i; //single pointer
    int **pt=&p; //double pointer
    int ***ptr=&pt; //triple pointer
    // All the above pointers differ in the value they store or point to.
    cout << "i=" << i << "\t" << "p=" << p << "\t"
         << "pt=" << pt << "\t" << "ptr=" << ptr << "\n";
    int a=5; //simple or ordinary variable
    int &S=a;
    int &S0=S;
    int &S1=S0;
    cout << "a=" << a << "\t" << "S=" << S << "\t"
         << "S0=" << S0 << "\t" << "S1=" << S1 << "\n";
    // All the above references do not differ in their values
    // as they all refer to the same variable.
 }


CPP
#include
using namespace std;
 
int &fun()
{
    static int x = 10;
    return x;
}
int main()
{
    fun() = 30;
    cout << fun();
    return 0;
}


CPP
#include
using namespace std;
 
int fun(int &x)
{
    return x;
}
int main()
{
    cout << fun(10);
    return 0;
}


CPP
#include
using namespace std;
 
void swap(char * &str1, char * &str2)
{
  char *temp = str1;
  str1 = str2;
  str2 = temp;
}
 
int main()
{
  char *str1 = "GEEKS";
  char *str2 = "FOR GEEKS";
  swap(str1, str2);
  cout<<"str1 is "<


CPP
#include
using namespace std;
 
int main()
{
   int x = 10;
   int *ptr = &x;
   int &*ptr1 = ptr;
}


CPP
#include
using namespace std;
 
int main()
{
   int *ptr = NULL;
   int &ref = *ptr;
   cout << ref;
}


CPP
#include
using namespace std;
 
int &fun()
{
    int x = 10;
    return x;
}
int main()
{
    fun() = 30;
    cout << fun();
    return 0;
}


输出:

x = 20
ref = 30

应用范围:

  1. 修改函数传递的参数:如果函数收到对变量的引用,则可以修改变量的值。例如,以下程序变量使用引用进行交换。

CPP

#include
using namespace std;
 
void swap (int& first, int& second)
{
    int temp = first;
    first = second;
    second = temp;
}
 
int main()
{
    int a = 2, b = 3;
    swap( a, b );
    cout << a << " " << b;
    return 0;
}

输出:

3 2 

1.避免大型结构的副本:假设有能力接收大对象的函数。如果我们通过它而没有引用,则会创建它的新副本,这会浪费CPU时间和内存。我们可以使用引用来避免这种情况。

CPP

struct Student {
   string name;
   string address;
   int rollNo;
}
 
// If we remove & in below function, a new
// copy of the student object is created.
// We use const to avoid accidental updates
// in the function as the purpose of the function
// is to print s only.
void print(const Student &s)
{
    cout << s.name << "  " << s.address << "  " << s.rollNo;
}

2.在“对于每个循环”中修改所有对象:我们可以在“对每个循环”中使用引用来修改所有元素

CPP

#include 
using namespace std;
 
int main()
{
    vector vect{ 10, 20, 30, 40 };
 
    // We can modify elements if we
    // use reference
    for (int &x : vect)
        x = x + 5;
 
    // Printing elements
    for (int x : vect)
       cout << x << " ";
 
    return 0;
}

3.对于每个循环,避免对象复制:当对象较大时,我们可以在每个循环中使用引用来避免单个对象的复制。

CPP

#include 
using namespace std;
 
int main()
{
    vector vect{"geeksforgeeks practice",
                     "geeksforgeeks write",
                     "geeksforgeeks ide"};
 
    // We avoid copy of the whole string
    // object by using reference.
    for (const auto &x : vect)
       cout << x << endl;
 
    return 0;
}

参考与指针:

无论引用和指针可以用来更改另一个函数中一个函数的局部变量。当作为参数传递给函数或从函数返回时,它们都还可以用于保存大对象的副本,以提高效率。尽管有上述相似之处,但引用和指针之间仍存在以下差异。

1.可以将指针声明为void,但引用永远不能为空例如

int a = 10;
void* aa = &a;. //it is valid
void &ar = a; // it is not valid

感谢Shweta Bansal补充了这一点。

2.指针变量具有n级/多级间接寻址,即单指针,双指针,三指针。而参考变量仅具有一个/单个间接级别。以下代码揭示了上述要点:

C++

#include 
using namespace std;
 
int main() {
    int i=10; //simple or ordinary variable.
    int *p=&i; //single pointer
    int **pt=&p; //double pointer
    int ***ptr=&pt; //triple pointer
    // All the above pointers differ in the value they store or point to.
    cout << "i=" << i << "\t" << "p=" << p << "\t"
         << "pt=" << pt << "\t" << "ptr=" << ptr << "\n";
    int a=5; //simple or ordinary variable
    int &S=a;
    int &S0=S;
    int &S1=S0;
    cout << "a=" << a << "\t" << "S=" << S << "\t"
         << "S0=" << S0 << "\t" << "S1=" << S1 << "\n";
    // All the above references do not differ in their values
    // as they all refer to the same variable.
 }

引用不如指针强大
1)创建引用后,以后就不能再引用另一个对象了;它不能被重新安置。这通常是通过指针完成的。
2)引用不能为NULL。指针通常被设置为NULL,以指示它们没有指向任何有效的对象。
3)引用必须在声明时进行初始化。指针没有这种限制
由于上述限制,C++中的引用不能用于实现链接列表,树等数据结构。在Java,引用没有上述限制,可以用于实现所有数据结构。 Java引用更强大是Java不需要指针的主要原因。
参考更安全,更易于使用:
1)更安全:由于必须初始化引用,因此不太可能存在诸如野指针之类的野引用。仍然可能有引用未引用有效位置的引用(请参阅以下练习中的问题5和6)
2)易于使用:引用不需要解引用运算符即可访问该值。它们可以像普通变量一样使用。仅在声明时才需要“&”运算符。同样,可以使用点运算符(’。’)访问对象引用的成员,这与需要箭头运算符(->)访问成员的指针不同。
结合上述原因,在像复制构造函数参数这样的地方,很少有不能使用指针的地方。必须使用引用在复制构造函数中传递参数。同样,必须使用引用来重载某些运算符(例如++)。
锻炼:
预测以下程序的输出。如果存在编译错误,请修复它们。
问题1

CPP

#include
using namespace std;
 
int &fun()
{
    static int x = 10;
    return x;
}
int main()
{
    fun() = 30;
    cout << fun();
    return 0;
}

问题2

CPP

#include
using namespace std;
 
int fun(int &x)
{
    return x;
}
int main()
{
    cout << fun(10);
    return 0;
}

问题3

CPP

#include
using namespace std;
 
void swap(char * &str1, char * &str2)
{
  char *temp = str1;
  str1 = str2;
  str2 = temp;
}
 
int main()
{
  char *str1 = "GEEKS";
  char *str2 = "FOR GEEKS";
  swap(str1, str2);
  cout<<"str1 is "<

问题4

CPP

#include
using namespace std;
 
int main()
{
   int x = 10;
   int *ptr = &x;
   int &*ptr1 = ptr;
}

问题5

CPP

#include
using namespace std;
 
int main()
{
   int *ptr = NULL;
   int &ref = *ptr;
   cout << ref;
}

问题6

CPP

#include
using namespace std;
 
int &fun()
{
    int x = 10;
    return x;
}
int main()
{
    fun() = 30;
    cout << fun();
    return 0;
}

相关文章 :

  • C++中的指针与引用
  • 我们什么时候通过引用或指针传递参数?
  • 引用可以引用C++中的无效位置吗?
  • 在C++中通过指针传递Vs通过引用传递
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”