this 指针
为什么要用this指针?
在学习this指针之前,我们先简单了解一下对象的创建。
拿上图举例,我们创建了两个对象p1,p2,每个对象(如p1)都能有自己对应的数据(p1的a和b),而函数则是公用的,若是我们在函数之中进行扩充,想要在fun(int x,int y)里对a和b的数据进行一些处理 ,因为函数是公用的,我们如果判断处理的数据是与之对应对象的数据呢?而this指针就是用来解决这个问题的。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A {
public:
void fun(int x, int y) {
this->a = x;
this->b = y;
}
void printfun() {
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
private:
int a;
int b;
};
int main() {
A p1;
p1.fun(1, 3);
A p2;
p2.fun(10, 30);
p1.printfun();
p2.printfun();
system("pause");
return EXIT_SUCCESS;
}
这样我们就可以确定a和b是我们对应对象的a和b了。因为this指针指向被调用函数的成员函数所属的对象。
在上述代码中,我们体会到了this指针的作用,但是这个指针的作用在这里并没有体现出来,又或者说this指针的具体原理又是什么?
为什么又被叫做this指针,这个指针又体现在那里?
在c++中规定,this指针是隐含在对象成员函数内的一种指针。当一个对象被创建后,该对象中的每一个成员函数都含有一个由系统自动生成的隐含指针this,该针this用来保存对象的地址。
除了上述作用,this指针还可以用来返回对象本身。
A &getA() {
return *this;
}
this指针能否存储静态成员变量?
不能,因为静态成员变量不属于该对象 。这里我们可以借助sizeof来理解。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A {
public:
private:
int a;
};
int main() {
A m;
cout << sizeof(m) << endl;
system("pause");
return EXIT_SUCCESS;
}
这时候打印结果是4,如果我们再加一个int类型数据
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A {
public:
private:
int a;
int b;
};
int main() {
A m;
cout << sizeof(m)<< endl;
system("pause");
return EXIT_SUCCESS;
}
打印结果是8
那我们要是继续添加一个静态变量
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A {
public:
private:
int a;
int b;
static int c;
};
int main() {
A m;
cout << sizeof(m)<< endl;
system("pause");
return EXIT_SUCCESS;
}
这时候我们会发现,打印结果并没有发生改变,所以说明静态变量不属于该对象,所以static变量不能用this。
this指针的指向能否改变?
不能。改变后将无法找到对象,也就失去了其意义。
常函数
什么是常函数?
常函数就是在函数的()后又加上const的函数
void fun(int a,int b) const{//该函数为常函数
a = 10;
b = 10;
}
常函数有哪些特点?
1.常函数内不能修改普通成员变量
如下面的情况,若是想要修改普通成员变量,编译器会报错
2. mutable修饰的成员变量在常函数中可以修改
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A {
public:
void fun() const{
b = 1;
}
private:
mutable int b;
};
int main() {
system("pause");
return EXIT_SUCCESS;
}
常对象
什么是常对象?
在创建对象的那行代码前面加上const。
常对象有哪些特点?
常对象不能改变普通成员变量的值
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A {
public:
private:
int a;
int b;
};
void fun() {
const A m;
m.a = 10;//error
}
int main() {
system("pause");
return EXIT_SUCCESS;
}
常对象也不能调用普通成员函数
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A {
public:
void f() {
cout << "f函数被调用" << endl;
}
private:
int a;
int b;
};
void fun() {
const A m;
m.f();//error
}
int main() {
system("pause");
return EXIT_SUCCESS;
}
但是常对象可以调用常函数
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A {
public:
A(int x,int y) {
this->a = x;
this->b = y;
}
void f() const {
cout << "f函数被调用" << endl;
}
private:
int a;
int b;
};
void fun() {
const A m(10,8) ;
m.f();
}
int main() {
fun();
system("pause");
return EXIT_SUCCESS;
}