引用与this指针
在C++编程中,引用和this指针是两个重要的概念,也是在前期学习之中较难理解的一个点,它们在对象和函数之间的交互中起着至关重要的作用。
引用
在C++中,引用是一种用于别名变量的机制。引用允许我们创建一个变量的别名,这意味着该引用变量将与原始变量共享相同的内存地址。引用提供了一种更直接的方法来操作变量,而无需复制数据,从而提高了程序的效率和简洁性。
1.声明引用:
使用&符号来声明引用。例如:
int original = 10;
int &ref = original;
2.别名:
引用的本质其实就是跟变量起了一个别名,举个例子,有一个学生叫张三,那么同学们喊他张三,他的老师可能会喊他小张,他的女朋友可能喊他宝贝(如果他有女朋友的话)等等,但是,我们发现,这么多不同的昵称,最后都指向了张三这个人,引用也是这个道理。引用提供了变量的另一个名称,因此在使用引用时,我们可以像使用原始变量一样使用它,而不必担心指针的复杂性。
3.引用必须初始化:
引用在声明时必须初始化(在C++中初始化引用的时候,必须将引用绑定到一个对象,而不是字面量或表达式的结果),并且不能更改引用的目标。例如:
int original = 10;
int &ref = original; // 正确
int &ref1 = 1; //错误,将引用ref1绑定到一个临时值1上,而不是变量。
int &ref2; // 错误,引用必须初始化
4.引用传参:
引用通常用于函数参数传递,可以通过引用修改原始变量的值,而不是创建副本。这可以提高函数的性能和效率。例如:
void increment(int &num) {
num++;
}
5.引用与指针的区别:
1.引用必须在声明时初始化,而指针可以在稍后指向其他对象。
2.引用不能指向空值,而指针可以为空。
3.引用一旦绑定到对象,就无法重新绑定到另一个对象,而指针可以随时重新赋值指向其他对象。
6.引用的应用:
1.函数参数传递:通过引用传递参数,可以避免拷贝大型对象的开销。
2.返回引用:函数可以返回引用,使得返回值可以被修改。
3.在类中使用:引用可以作为类成员,用于操作类的数据成员。
this指针
在C++中,this 指针是一个特殊的指针,它指向当前对象的地址。这个指针允许在类的成员函数中访问对象的成员变量和成员函数。
this指针的作用
this 指针的主要作用是允许在类的成员函数中引用调用该函数的对象。每个对象都有自己的 this 指针,它指向对象的地址,从而使成员函数能够访问对象的成员变量和其他成员函数。还以学生张三举个例子,张三作为学生类的一个对象,他的地址就是他的宿舍号加床号,也就是说,张三的this指针就指向他的宿舍号和床号,方便我们找到他,对他进行一些访问或者操作。
1.避免命名冲突
this 指针在成员函数中起到了隐式参数的作用。当成员函数的参数和成员变量同名时,可以使用 this 指针来区分它们,避免命名冲突。
class MyClass {
private:
int value;
public:
void setValue(int value) {
this -> value = value; // 使用 this 指针避免命名冲突,这句话的意思实际上是把传入的value用于对象的初始化
//this指针指向的value代表对象的属性value,赋值后面的value代表传参传入的value
}
};
2.在成员函数中返回对象本身
在某些情况下,成员函数需要返回对象本身,以便支持链式调用。这通常在实现一些操作符重载时非常有用。
class MyNumber {
private:
int value; // 私有成员变量,用于存储整数值
public:
// 构造函数,初始化对象的状态
MyNumber(int val) : value(val) {}
// 成员函数,用于将传入的整数值加到当前对象的 value 成员变量上,并返回对象本身的引用
MyNumber &add(int num) {
value += num; // 将传入的整数值加到当前对象的 value 成员变量上
return *this; // 返回对象本身的引用,允许链式调用
}
};
上述例子中,我们定义了一个能够存储整数值的类 MyNumber
,并实现了一个可以连续对其进行加法操作的成员函数 add
。add 函数返回 *this,允许对同一个对象进行连续的 add 操作。
一些注意事项
静态成员函数
在静态成员函数中,因为静态成员函数不属于任何实例对象,所以无法使用 this 指针。
class MyClass {
public:
static void staticFunction() {
// 不能使用 this 指针
}
};
避免悬空指针
使用 this 指针时,要确保对象存在。避免在对象生命周期结束后仍然使用 this 指针,以防止产生悬空指针。
(今天才发现md编辑器CPP和C++导入结果不一样,我还寻思为啥之前的文章代码都没高亮…)