C++——this指针、常函数与常对象

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;
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值