持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
const关键字
常函数:
- 成员函数后加const后我们称为这个函数为常函数
- 常函数内不可以修改成员属性
- 成员属性声明时加关键字mutable后,在常函数中依然可以修改
常对象:
- 声明对象前加const称该对象为常对象
- 常对象只能调用常函数
1、如何理解this指针?
说到const关键字不得不提到this指针,this指针的本质是一个指针常量,指针的指向不可修改(如在类中,this指针代表的就是当前对象,也就是说this代表的当前对象不可被更换)
2、如何将this指针指向的值也不可修改
需要声明常函数(成员函数后加const后)
3、在一个函数的参数传入对象的时候通常使用const &对象的方式,此举有何意义?且常见的问题有哪些?
此举是为了避免在传入参数的时候还需new一个新的对象,调用构造和析构,从而达到提高效率的目的
常见问题1:此时的对象是一个常对象,无法对类中的属性进行修改,但是可以访问,那么如何解决呢?
我们需要将成员变量声明为mutable(可修改 可变的)
常见问题2:常对象无法访问成员函数,那么如何解决呢?
我们需要将成员函数的后面加上一个关键字const,将其变成常函数
示例:
class Person {
public:
Person() {
m_A = 0;
m_B = 0;
}
void ShowPerson() const {
//const Type* const pointer;
//this = NULL; //不能修改指针的指向 Person* const this;
//this->mA = 100; //但是this指针指向的对象的数据是可以修改的
//const修饰成员函数,表示指针指向的内存空间的数据不能修改,除了mutable修饰的变量
this->m_B = 100;
}
void MyFunc() const {
//mA = 10000;
}
public:
int m_A;
mutable int m_B; //可修改 可变的
};
//const修饰对象 常对象
void test01() {
const Person person; //常量对象
cout << person.m_A << endl;
//person.mA = 100; //常对象不能修改成员变量的值,但是可以访问
person.m_B = 100; //但是常对象可以修改mutable修饰成员变量
//常对象访问成员函数
person.MyFunc();
}
int main() {
test01();
system("pause");
return 0;
}
static关键字遗留问题
重点:
1、static修饰的成员变量为静态成员变量,需要在类外进行声明,且可通过类名::的方式进行调用(注意不是类名.)
2、静态成员函数内不能使用this指针访问类内的属性,如果想要在静态成员函数的内部使用非静态成员属性,传入对象访问即可
静态数据成员
在类内数据成员的声明前加上static关键字,该数据成员就是类内的静态数据成员。其特点如下:
- 静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义
- 静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。
由于上面的原因,静态数据成员不属于任何对象,在没有类的实例时其作用域就可见,在没有任何对象时,就可以进行操作
- 和普通数据成员一样,静态数据成员也遵从public, protected, private访问规则
- 静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名> = <值>
- 类的静态数据成员有两种访问方式:<类对象名><静态数据成员名> 或 <类类型名>::<静态数据成员名> 同全局变量相比,使用静态数据成员有两个优势:
- 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能
静态成员函数
与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象,其特性如下:
- 静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数
- 出现在类体外的函数定义不能指定关键字static
- 非静态成员函数可以任意地访问静态成员函数和静态数据成员
关于static关键字想要了解在 C语言 和 java中的使用 请点此处跳转