前言:大三马上要结束了,假期特意抽出点时间回顾一下C++,发现自己还是有很多似懂非懂的地方。于是就打算写几篇文章,既是对自己的激励,又希望与大家共勉!如果文章中有哪些不对的地方,请各位不吝赐教。谢谢大家支持!
一、基本知识
再多的文字有时也不如一两个例子来的生动,简洁。文中尽量避免空口白话,结合例子希望说明地清楚明白!
*,&是学习C++的人经常碰到的,也是挺让人头疼的事情。(在这里必须郑重感谢MS的VS,纠错功能之强大使得许多人不很明白,却照样用引用和指针)。
引用和指针是有一定的相同之处的,个人理解,两者都涉及地址这个概念,因此在参数传递时也就具有了节省空间的作用。试想一下,一个char ch[10000],传入一个头地址方便呢,还是将整个数组传入方便。
从定义上看,引用类型和指针也是比较类似。
int x=0;
//引用类型在声明引用变量时必须同时初始化
int &x_cite = x;
int *x_pointer = &x;
上面定义了引用类型x_cite和指针x_pointer,并对它们进行了初始化。
下面说一下指针类型和引用类型两者的区别。
int x;
int y;
int &x_cite = x;
x_cite = y;
int *x_pointer = &x;
x_pointer = &y;
运行上面代码,VS编译器应该会报错
error C4700: 使用了未初始化的局部变量“y”
但是如果删掉"x_cite=y;"这一句,编译器就不会报错了。
int x;
int y;
int &x_cite = x;
int *x_pointer = &x;
x_pointer = &y;
这是因为引用类型只能指向一个变量。我可以理解为引用类型很专一,对一个人(变量)从一而终;而指针呢,则很花心,总是与不同的人(变量)交往。
二、进阶第一步:函数中的引用类型
新手在解除C++时,常常会被&和*搞混。希望看完下面的东西,可以对你有一点帮助!
首先定义函数,
//传入引用类型
void find(int x)
{
x = x + 1;
}
void find_cite(int &x)
{
x = x + 1;
}
主函数
int x=0;
int &x_cite=x;//声明引用变量时必须同时定义
find(x);
std::cout << "未使用引用类型" << std::endl;
std::cout << x<<std::endl; //未改变x
find_cite(x_cite);
std::cout << "使用引用类型" << std::endl;
std::cout << x << std::endl; //改变x
运行结果截图
由上图可见,函数参数使用引用类型(int &x)改变了主函数中定义的整型“int x;”的值。究其原因,引用类型使用了变量x的地址,其操作是&x,即取x的地址,因此在改变x_cite的同时对原来的x也有影响。
进一步说,这里如果使用
find_cite(x);
其结果也是相同的!
定义返回引用类型的函数,如下:
int& find_cite(int &x)
{
x = x + 1;
return x;
}
不过这样做的意义通常不大。
三、进阶第二步:类对象的引用
class Node
{
public:
int data = 5;
};
void fun1(Node nd)
{
nd.data = 10;
}
void fun2(Node &nd)
{
nd.data = 20;
}
void fun3(Node* nd)
{
nd->data = 30;
}
void main()
{
Node nd;
int num = nd.data;
cout << num<< endl;
fun1(nd);
cout << num << endl;
fun2(nd);
num = nd.data;
cout << num << endl;
fun3(&nd);
num = nd.data;
cout << num << endl;
}
运行结果截图:
如果定义int &num=nd.data;,就不需要num=nd.data;这一步了!同样可以得到上面的结果。
void main()
{
Node nd;
int &num = nd.data;
cout << num<< endl;
fun1(nd);
cout << num << endl;
fun2(nd);
//num = nd.data;
cout << num << endl;
fun3(&nd);
//num = nd.data;
cout << num << endl;
}
未完待续!