C++中 const关键字使用中常见问题及static遗留问题

165 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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中的使用 请点此处跳转