对于const,其实我们只需要知道const修饰的东西不可以修改就行了,至于int const *p,int *const p
这两个有什么区别,其实很好理解的,int const *p就是常量指针,const在前是常量,像int *const p这个*在前就是指针常量,意思是指针指向的常量,那么指针指向的内容是不可以修改的,但是指针可以修改,第一个常量指针,就是指针这个是个常量,指向的地址是不可以修改的,但是指向的地址的那个内容,比如可能指向a,a的值是可以修改的
其实我们在函数里面也用了const这个关键字了的,在函数的右侧加上const就是一个常函数,我们都知道常函数不能调用非常函数,也不能改变成员变量,其实是这个函数的this指针有const修饰了,比如A类的成员函数,这个函数其实默认有参数的,就是A*this,因为只有这样才能确定我调用的是哪个类的成员函数,但是如果被const修饰了就是常量指针,这个指针是指向的常量,常量不能修改,所以说常函数正常情况下就是不能修改成员函数的,这里说一嘴,就是正常成员函数是A*const this的是指针常量,就是指针类型的常量,指针指向的内容不能更改,这样符合规范,如果成员函数修改了我写了A类的成员函数最后被B类的调用(没有继承关系),那不是乱套了
static关键字,这个东西蛮有用的,比如说,我在一个.cpp文件中全局变量定义了a,另一个文件中也定义了一个a,在这个项目里面,两个a会冲突,那怎么办,我就用static关键字就能做到不冲突,这是修饰全局变量的
static修饰局部变量时,只会被初始化一次,比如在一次循环中我定义static int a=1;a++;此时我们打印a会发现a就声明了一次1,后面不断被++,而不是一直输出2
成员变量被static修饰,首先是内存分布,会占用静态区内存不会占用对象内存,然后就是类内声明,类外初始化,在继承时,父类和子类享有同一个静态成员变量,如果此时父类和子类都有一个同名的成员变量,那么就会分别享有互不干扰,你的时你的变量我的是我的变量
我们可以用static来写单例模式,单例模式就是我访问就这一个,没有多余的对象访问,我们可以用单例模式来访问我们想要访问的成员变量
cpp
#ifndef _MANAGER_H_
#define _MANAGER_H_
template<typename T>
class Manager
{
public:
static T* instance()
{
if (!manager)
manager = new T;
return manager;
}
protected:
Manager() = default;
~Manager() = default;
Manager(const Manager&) = delete;
Manager& operator=(const Manager&) = delete;
private:
static T* manager;
};
template<typename T>
T* Manager<T>::manager = nullptr;
#endif // !_MANAGER_H_
这是一段关于单例模式的模板代码,我们不难发现,创造的实例是static,就只有一个这样我们可以避免多个单例的创建
这里还有一个static的用法就是在成员函数加上static,加上了成员函数就不能访问非静态成员变量,因为static后这个成员函数是属于整个类的,我创建了一个A a,A b,此时我们调用a的静态成员函数,因为static没有this指针,不知道是修改a的成员变量还是b的成员变量,会报错,所以就有static的成员函数无法访问非静态的成员变量,但是静态成员变量是共享的,所以不用担心修改a的成员变量会不会影响b的成员变量,因为静态成员变量是共享的肯定是会影响的