c++复习——const,static字

对于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的成员变量,因为静态成员变量是共享的肯定是会影响的

相关推荐
灵晔君37 分钟前
【C++】二叉搜索树
开发语言·c++
鱼子星_1 小时前
【C++】内存管理:内存分布,new/delete的使用及细节处理,new/delete的底层,定位new表达式
开发语言·c++·笔记
鱼子星_1 小时前
【C++】string(上):string的基本使用
c++·笔记·字符串
神仙别闹2 小时前
编写基于C++ Huffman 算法的无损压缩程序和解压程序
java·c++·算法
炸膛坦客2 小时前
单片机/C/C++八股:(二十三)#define 和 typedef 的区别
c语言·c++·单片机
旖-旎3 小时前
《LeetCode 646 最长数对链 || LeetCode 1143 最长公共子序列》
c++·算法·leetcode·动态规划
阿米亚波4 小时前
【C++ STL】std::list
c++·windows·笔记·stl·list
橙色阳光五月天4 小时前
CMake 构建配置文件解析
c++·cmake·plugin
载数而行5204 小时前
C++进阶 Linux相关的静态库,动态库,第三方库
c++
c238564 小时前
下篇:伸缩魔法!进阶吃透可变滑动窗口篇
c++·算法