问题一:
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 personA指针传入默认的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.