c++学习之this指针,初始化列表,const,static

问题一:

this指针:,即类中指向自己本身的指针,可以用来表明类中的成员变量与成员函数中的参数的区别。

//代码一
class person{
public: int age;
public:
void setage(int age)
{
this->age=age;//最浅显用法
}
}

在实际接触时this指针对于我这种小白来说接触不是太大,但是对于大牛们无疑是把利器。而我们能够了解this指针必将加快我们对深层代码工作原理的理解。

//代码二
class person{
public: int age;
public:
void setage(person *this,int age)//底层的代码
{
this->age=age;
}
}

代码一和代码二的区别也是理解this指针的好处,这也为接下来讲述const成员函数的工作机制探究,埋下伏笔。

问题二:初始化列表

当类中拥有特殊的变量,比如const型变量,或者把某个类当做成员变量,都不能通过普通的构造函数的方式进行初始化,需要利用初始化列表。

#include <stdio.h>
#include <iostream>
using namespace std;
class house {
private:
	int size;
	int price;
public:
	house(int num,int num2)
	{
		this->size = num;
		this->price = num2;
	}
};
class person:public house 
{
private:
		int a;
		int b;
		house c;
	const int num;
public:
	person():num(10),b(10),house(10,20),c(20,30)
	//常量必须得用初始化列表进行初始化
	//普通变量可以利用初始化列表,也可以利用构造函数;
	//初始化列表执行顺序是按照定义变量的顺序(不考虑继承的情况)
	//(但是会先执行继承的父类构造函数,再执行house成员变量的构造函数,剩下的变量按照定义的顺序执行)
	{
		a = 10;
	}
};
int main()
{
	person();
	system("pause");
	return 0;
}


详情在代码注释处都一一列举了,这里都不再赘述,但是应该强调的是掌握初始化列表的执行顺序和初始化列表语法。

问题三:const

**const:**为修饰关键字,在类中主要用于修饰成员变量,和成员函数。

calss person{
private:
string name ;
const int sex;
pubic:
person():sex(1)
{
name="rain";
}
void set()
{
//sex=0;//会报错
this->name="678";//正常编译
}

就是说 const修饰的变量无法修改。

const 修饰成员函数:
相信很多人都见过一些见过一些大佬写代码类似 void getage()const{balabla~~}
Why?
那是因为加上const之后会使整个函数无法修改成员变量,防止出现bug。
但是又会有人问 为什么会这样呢??
这里就要接一下上面this指针中讲的伏笔,成员函数参数表中会隐藏this指针,类似(person *this,int a),也就是const所要修饰的对象,那么 const person this 为参数,person对象中的成员变量必定无法修改。
也是因为 this指针为默认的存在,所以const的位置 就不受约束,也可以放在函数名之前,类似 void const get(balabala~~){balabala~~}.起到的作用一样。
cosnt修饰对象:
cosnt person A;就是这种用法,作用就是定义的A对象只能使用const修饰的成员函数。
Why?
reason:
因为上述A对象进行调用成员函数时,会将cosnt person
A指针传入默认的person *this,从而导致安全级数不匹配的现象,产生报错。
然而,const修饰的函数默认的this指针参数的类型变成 const person *this,安全级数就能达成匹配,从而正确传参。
(上述内容一定要好好理解
详情见代码:

#include <stdio.h>
#include <iostream>
using namespace std;
class person {
private:
	int age;
public:
	void show()const //常函数 不能修改成员的成员属性
	//常函数不能修改类中的成员属性,因为this指针已经变成了 const类型
	{
	//	age = 123;
		cout << age << endl;
	}
	void show2()
	{
		cout << "nihao" << endl;
	}
};
int main()
{
	const person ps;//常量对象,只能调用const函数,普通函数不能用
	//ps.show2();//相当于类中的默认传参 this指针 传的参数是 const person*
	//而普通函数中的this传参  类型仍然是 person *类型 与传参(const person*)安全性不匹配
	system("pause");
	return 0;
}


问题四:static

当一个类中只有一个static int 型成员变量时你猜空间是多少?
没错 他和一个空对象一样也只占一个字节(占位字节),那是因为 static存放于全局静态区。并不存放于类的内部。所以在调用static修饰的函数或者变量时,都可以通过 类名::函数名(或者变量名)的方式进行访问,无法通过this指针访问(理所应当,毕竟根本不属于类的空间)。
哈哈 这也解释了另外一个现象。
为什么static修饰的函数只能修改 static修饰的成员变量,因为本身static修饰的成员就可以直接访问,而且static修饰的成员函数没有类似上述的默认this指针来指向自己。
所以只能修改static修饰成员。

#include <stdio.h>
#include <iostream>
using namespace std;
class person {
public:
	//int num;
	int num;
	static int num2;//编译期存在,只有一份,属于类的,所有对象共享
public:
	static void show()
	{
		//因为static函数没有this指针
		//num = 2;//在静态函数中只能用static变量,不能使用非static
	}
};
int person::num2 = 1;//一定要在类的外部进行初始化。
int main()
{
	person A;
	cout << sizeof(A) << endl;
	cout << person::num2 << endl;
	person::show();//可以通过类名直接调用
	system("pause");
	return 0;
}


总结:

虎子于2020年2月20走丢。
英语六级考试在2020年2月21日10分得知考了420分又没过。
心情糟糕透了~~~~。
还好有蘑菇安慰我~~。
thanks.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值