c++3之static、const、friend关键字

2023-11-19

1.1static

修饰局部变量,延长生命周期(由栈区 --->静态区)

修饰全局变量或函数,限制作用域,只能用于本文件中使用

static+成员变量:

1.static成员变量不占class的空间

⒉.修饰成员变量,需要在外部单独定义(要加来源 A::val)

3.多个对象访问到的static变量是同一个(可以实现对象建间的通讯)

4.不用对象,也可以访问成员变量(要加来源 A::val)

static+成员函数:

1.成员函数不拥有this指针,不能访问普通成员变量,可以访问静态成员变量

2.不用对象,也可以访问成员函数(要加来源 A::print_val)

#include <iostream>

using namespace std;

class A
{
public:
	void set_val(int n)
	{
		val=n;
	}
	 static void print_val()//不拥有this指针,不能访问普通成员变量,可以访问静态成员变量
	{
		//this  static修饰的成员函数不拥有this指针
		//cout << x << endl; //static修饰的成员函数,不能访问普通成员变量
		cout << val << endl; //static修饰的成员函数, 可以访问静态成员变量
		
	}
public:
//private:
	static int val;//1.
	int x;
	int y;	
};

int A::val=10;//2.外部初始化之后才能赋值   权限public 

int main()
{
	A::print_val(); 
	
	A a,a1,a2;
	//1.static成员变量不占内存空间 
	//cout << sizeof(a) << endl;

	//2. static修饰的变量,需要在类的外部单独定义 
	a.print_val();
	a.set_val(100);
	a.print_val();
	//3.多个对象访问到的static变量是同一个 权限public 
	cout << &a.val <<endl;
	cout << &a1.val <<endl;
	cout << &a2.val <<endl;
	//4.static修饰的public变量可以直接访问,不需要通过变量 权限public 
	cout << A::val << endl; 
	//cout << A::x << endl;没有static修饰的变量只能通过变量访问  
}

 

用处(原理:多个对象访问到的static变量是同一个(可以实现对象建间的通讯))

1.对象间通讯

2.QT的文件对话框

3.计算对象的数量

1.2const

const+变量:表示变量为只读变量

1.变量不能被修改

2.定义变量时要初始化,不然会报错

const+指针

原则是:const修饰谁,谁的内容就不可变,其他的可变

1.coust int *p

const 和int 可以互换位置,二者是等价的。
当把const放最前面的时候,它修饰的就是*p,那么*p就不可变。
这种用法常见于定义函数的形参。前面学习printf 和 scanf,以及后面将要学习的很多函数,它们的原型中很多参数都是用const修饰的,这样做的好处是安全!我们通过参数传递数据时,就把数据暴露了。而大多数情况下只是想使用传过来的数据,并不想改变它的值,但往往由于编程人员个人水平的原因会不小心改变它的值。这时我们在形参中用const 把传过来的数据定义成只读的,这样就更安全了。这也是 const最有用之处。
所以如果你不想改变某个参数传过来的值,那么定义函数时就最好用const修饰这个参数,否则就不要用const修饰了。
特别要注意的是:
虽然在*p前加上 const可以禁止指针变量p 修改变量a 中的值,但是它只能“禁止指针变量p 修改”。
也就是说,它只能保证在使用指针变量p 时,p 不能修改a 中的值。
其他指向 a的没有用const修饰的指针变量照样可以修改a 的值,而且变量a自己也可以修改自己的值。

2.int *const p;

3.const int *const p;

const+结构体变量:

不能通过结构体变量修改结构体成员的值 a.set_val(10);//错的

不能给结构体变量进行赋值 a1=a2;//错的

const+结构体指针

const Data *p不能通过指针修改指针指向的空间 *p->set_val(10);//错的

Data *const p 不能修改指针的指向 p=&a1;//错的

const+成员变量:成员变量不能被修改

注意:要给const成员变量赋初值

方法一:直接赋初值,很固话,永远是一个值,不太好用

const int val=0;

方法二:通过构造函数初始化列表,灵活一点

A(int n=0,int m=1):val(n),x(m)        //构造函数

const int val;        //私有变量
const int x;

const +成员函数:不能修改函数内部的成员变量

const加载{}前面

void set_val(int x) const  //不能修改函数内部的成员变量,有影响 
    {
        val=x;
    }

const+对象

1.const+类+对象 必须先初始化,const A a;(A中要写构造函数)

2.不能通过成员函数修改

3.使用的成员函数也要是const修饰的

4.成员变量的权限修改成public,可以访问,但是不能修改

1.3友元

friend 指类的朋友,使用友元访问类的私有成员。

修饰普通函数--友元函数

friend void fun(A &obj);//声明友元函数 
void fun(A &obj)//参数得是要调用的私有变量所属的类的对象 
{
	cout << obj.val <<endl;
}

注意:友元会破坏类的封装性,尽量少用

友元用于处理与多个对象之间的私有数据有关的问题

修饰类

类A 类B

//类B 是类A的朋友类,B就可以调用A中的私有变量

A中
friend class B;

B中
void func(A &obj)
    {
        cout << obj.val << endl;
    }

通过clsaaB 中的成员函数,通过A类的对象(形参),访问A中的私有数据

友元关系不具有传递性。例如,类A是类B的友元,类B是类C的友元,但并不表示类A是类c的友元。

友元关系不具有交换性。例如,类A是类B的友元,但类B不是类A的友元。

作业:

1.new delete和malloc free的区别

1.申请的内存所在位置

new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存.自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

2.返回类型安全性

new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

3.内存分配失败时的返回值

new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。

4.是否需要指定内存大小

使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而malloc则需要显式地指出所需内存的尺寸。

5.是否调用构造函数/析构函数

new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构。而malloc则不会。

6.对数组的处理

new对数组的支持体现在它会分别调用构造函数函数初始化每一个数组元素,释放对象时为每个对象调用析构函数。注意delete[]要与new[]配套使用,不然会找出数组对象部分释放的现象,造成内存泄漏

7.new与malloc是否可以相互调用

operator new /operator delete的实现可以基于malloc,而malloc的实现不可以去调用new。

8.是否可以被重载

opeartor new /operator delete可以被重载,而malloc/free并不允许重载

2.封装一种数据结构(链表、栈、队列、树)

链表

#include <iostream>

using namespace std;

typedef int data_t;

class LinkList
{
public:	
	LinkList * Create_Linklist()	//创建链表 
	{
		LinkList *head = new LinkList;
		head->data=-1;
		head->next=NULL;
		cout << "链表创建成功" << endl; 
		return head;
	}
	
	int Linklist_Empty(LinkList *link)	//判空 
	{
		if(link->next==NULL)
			return 1;
		else
			return 0;
	}
	
	int Linklist_Length(LinkList *link)//求链表长度 
	{
		int len=0;
		
		while(link->next!=NULL)
		{
			len++;
			link=link->next;
		}
		return len;
	}
	
	void Linklist_Insert(LinkList *link,data_t data)//头插法
	{
		LinkList *s = new LinkList;	
		s->data=data;
		
		s->next=link->next;	//插入 
		link->next=s; 
	} 
		
	void Linklist_Insert_Pos(LinkList *link,int pos,data_t data)//按位置插入 
	{
		int i=Linklist_Length(link);
		if(pos<0 || pos>i+1)	//判断pos是否合法 
		{
			cout<< "pos erroe" << endl;
			exit(-1);
		} 
		for(i=0;i<pos+1;i++)	//跳转到所要求的的位置 
		{
			link=link->next;
		}
		
		LinkList *s = new LinkList;	//插入 
		s->data=data;
		s->next=link->next;
		link->next=s;
	} 
	
	void Linklist_Delete_Pos(LinkList *link,int pos)//按位置删除 
	{
		if(Linklist_Empty(link))
		{
			cout<< "链表为空" << endl;
			return ; 
		}
		
		int i=Linklist_Length(link);	//判断pos是否合法
		if(pos<0 || pos>i+1)
		{
			cout<< "pos erroe" << endl;
			exit(-1);
		} 
		for(i=0;i<pos;i++)		//跳转到所要求的的位置
		{
			link=link->next;
		}
		
		LinkList *s=link->next;			//删除 
		cout <<"删除" <<s->data << endl;	//打印删除的值 
		link->next=s->next;
		delete s;
	}
	
	int Linklist_Find_Key(LinkList *link,data_t data)//按值查找 
	{
		if(Linklist_Empty(link))
		{
			cout<< "链表为空" << endl;
			return -1; 
		}
		
		int i=-1,j=Linklist_Length(link);
		
		while(link->data!=data && i++<j+1)	//找到所求的的值,并记录次数 
		{
			link=link->next;
		}
		
		if(i==j)	//找完所有元素退出 
		{
			cout << "表中无这个元素" <<endl;
			return -1;
		}
		else	//没找完所有元素 
		{
			return i;	
		}
	}
	
	void Linklist_Delete_Key(LinkList *link,data_t data)//按值删除 
	{
		if(Linklist_Empty(link))
		{
			cout<< "链表为空" << endl;
			return ; 
		}
		
		int i =Linklist_Find_Key(link,data);//找到值所在下表 
		 
		Linklist_Delete_Pos(link,i);	//根据下标删除 
		
	}
	
	int Linklist_Find_Pos(LinkList *link,int pos)//按位置查找 
	{
		if(Linklist_Empty(link))
		{
			cout<< "链表为空" << endl;
			return -1; 
		}
		
		int i=Linklist_Length(link);
		if(pos<0 || pos>i+1)	//判断pos是否合法 
		{
			cout<< "pos erroe" << endl;
			exit(-1);
		} 
		
		for(i=0;i<pos+1;i++)	//找到所求的位置 
		{
			link=link->next;
		}
		
		cout<< link->data << endl;
		
	}
		
	void Linklist_Change_Key(LinkList *link,data_t data,data_t new_data)//按值改变值 
	{
		int i=Linklist_Find_Key(link,data),j;//找到所求值的下标 
		
		for(j=0;j<=i;j++)	//跳转到所求下标的节点 
		{
			link=link->next;
		}
		link->data=new_data;
	}
	
	void Linklist_Setnull(LinkList *link)//清空表 
	{
		LinkList *p=link->next;
		
		while(p==NULL)	//一个一个删 
		{
			Linklist_Delete_Pos(link,0);
			p=p->next;
		}
		link->next=NULL;
		cout<<"链表以清空" <<endl; 
	}
	
	void Linklist_free(LinkList *link)//删除表 
	{
		if(link->next!=NULL)//判断是否只剩表头 
		{
			Linklist_Setnull(link);
		}
		delete link;
	}
	
	void Linklist_Show(LinkList *link)//显示表中元素 
	{
		if(Linklist_Empty(link))	//判空 
		{
			cout <<"表中无元素"  <<endl;
			return; 
		}
		
		while(link->next!=NULL)
		{
			link=link->next;
			cout<<link->data <<"  " ;
		}
		cout << endl;
	}
	
	void Linklist_Order(LinkList *link)//表逆序 
	{
		LinkList *cur,*pre,*next;
		cur=link->next;//cur指向第一个
		next=cur->next;//next指向第二个
		cur->next=NULL;//最后一个指向空
		pre=cur;	//pre指向前一个
		cur=next;	//cur指向当前
		
		while(cur->next!=NULL)
		{
			next=cur->next;//next指向前一个
			cur->next=pre;//链接后一个
			pre=cur;	//pre前移,为下次链接做准备
			cur=next;	//cur指向下一次要更改连接的目标
		}
		cur->next=pre;//最后一个链接上之前的
		link->next=cur;//再把头指针指向更改后的第一个元素
		Linklist_Show(link);
	}

private:
data_t data;
LinkList *next;	
};

int main(int argc, char *argv[])
{
	int i,pos;
    data_t data,new_data;
   
    LinkList *head,*link;
	
	link=head;//调用link,不改变head的值
   	while(1)
   	{
        cout <<"\n\n\t\t\t欢迎使用链表\n\n";
        cout <<"------------------------\n";
        cout <<"\t\t1.创建链表 \n";
        cout <<"\t\t2.插入元素(头插法) \n";
        cout <<"\t\t3.按位置插入元素(后插) \n";
        cout <<"\t\t4.删除元素(按序号) \n";
        cout <<"\t\t5.删除元素(按值) \n";
        cout <<"\t\t6.查询元素(按序号) \n";
        cout <<"\t\t7.查询元素(按值) \n";
        cout <<"\t\t8.更改元素(按值) \n";
        cout <<"\t\t9.显示表中元素\n";
        cout <<"\t\t10.置空表 \n";
        cout <<"\t\t11.删除链表 \n";
        cout <<"\t\t12.链表逆序 \n";
        cout <<"\t\t0.退出 \n";
 
        cout <<"请输入[0~10]\n";
        cin >> i;
 
        switch(i)
        {
            case 1:
            {
            	head=link->Create_Linklist();
            	link=head;
            	break;
            }
            
            case 2:
            {
            	cout <<"请输入要插入的值:\n";
            	cin >> data ;
            	link->Linklist_Insert(link,data);
            	break;
            }
            
            case 3:
            {	
            	cout <<"请输入要插入的位置与要插入的值(以空格隔开)\n";
            	cin >> pos >>data ;
            	link->Linklist_Insert_Pos(link,pos,data);
            	break;
            }
            
            
            case 4:
            {
            	cout <<"请输入要删除的位置\n";
            	cin >> pos ;	
            	link->Linklist_Delete_Pos(link,pos);
            	break;
            }
            
            case 5:
            {
            	cout <<"请输入要删除的值\n";
            	cin >>data ;            
            	link->Linklist_Delete_Key(link,data);
            	break;
            }
            
            case 6:
            {	
            	cout <<"请输入要查询的位置\n";
            	cin >>pos ;	
            	link->Linklist_Find_Pos(link,pos);
            	break;
            }
            
            case 7:
            {	
            	cout <<"请输入要查找的值\n";
            	cin >> data ;  
            	link->Linklist_Find_Key(link,data);
            	break;
            }
            
            case 8:
            {	
            	cout <<"请输入被替换的值与新值(以空格隔开)\n";
            	cin >>data >> new_data ;
            	link->Linklist_Change_Key(link,data,new_data);
            	break;
            }
            case 9:link->Linklist_Show(head);break;
            
            case 10:link->Linklist_Setnull(link);break;
            
            case 11:link->Linklist_free(head);break;
            
            case 12:link->Linklist_Order(link);break;
            
            case 0:exit(0);
        }
    }
    return 0;
} 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++3之static、const、friend关键字 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • 二叉树的各种操作函数

    include source h 满与空的问题 计算个数时 判断rear和front的大小1 2 空一个 void InitQueue Queue u u front 0 u rear 0 int sizeQue Queue u int s
  • 测试中常说的持续集成是什么?有什么好处?

    一 持续集成流程 正式接收开发转过来的包之前 先从 svn 上下载代码 给它做次静态代码检查 然后编译打包 可以在开发的服务器或者自己的服务器运行单元测试文件 单元测试后 没用什么大的 bug 再部署到测试环境中 测试环境部署完成后先做冒烟
  • 15 个高级 Java 多线程面试题及回答

    在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分 如果你想获得任何股票投资银行的前台资讯职位 那么你应该准备很多关于多线程的问题 在投资银行业务中多线程和并发是一个非常受欢迎的话题 特别是电子交易发展方面相关的 他们会问面试
  • 【新手基础】-域内域信息搜集

    查看当前权限 Whomai 本地普通用户 win 2008 user 本地管理员用户 win7 x64 test administrator 域内用户 hacker administrator 获取域id sid 域id是唯一id Whoa
  • 数据仓库进阶 《阿里大数据之路》第二篇 数据模型篇 (完整版)

    第8章 大数据领域建模综述 此文章为学习笔记 有兴趣的小伙伴可以根据以下指引获取更多 学习内容链接如下 视频 一起啃书 阿里大数据之路数据仓库建模基础理论研读 已完结 哔哩哔哩 bilibili 书籍 阿里大数据之路 8 1 为什么需要数据
  • 【C/C++】浮点数的比较

    本文为 C C 学习总结 讲解浮点数的比较 浮点数经过大量运算后会损失精度 对比较操作带来较大困扰 因为 C 中的 操作需要完全相同时才能判定为 true 我们引入一个极小数 eps 修正误差 比较运算符 若一个数 a 落在 b eps b
  • 网络环境下促进有效学习发生的策略

    1 构建良好的网络学习环境 学习者在网络中的学习 必须在一定的 适合学习的环境中进行 构建和谐和 宽松的学习环境是激发学习者有效学习的前提 在这样的环境中 应该有学习者学 习所需要的一些网络资源 如各种教学网站 电子期刊等 也需要有一定的认
  • nginx之proxy_pass代理后端https请求

    本文转载自 https my oschina net foreverich blog 1517128 前言本文解释了怎么对nginx和后端服务器组或代理服务器进行加密http通信 内容提纲前提条件获取SSL服务端证书获取SSL客户端证书配置
  • MySQL Error Code: 2013. Lost connection to MySQL server during query解决

    如果你出现了这个问题 先尝试判断你是哪种情况 你的SQL语句需要执行很久 超过默认的时长 gt 方案1 你的SQL语句很简单 但就是执行不了 gt 方案2 解决方法1 尝试打开设置调整超时时间后重试 解决方法2 如果你在尝试修改空表都发生了
  • 2. Java枚举(enum)

    Java枚举是一个特殊的类 一般表示一组常量 使用enum关键字来定义 各个常量使用逗号 来分割 实例 public enum BizErrorInfo USER NOT FOUND codeValue 1004 message 用户不存在
  • Springboot +mybatis-plus 实现公共字段自动填充

    本文讲述了在SpringBoot 中使用Mybatis Plus如何实现一个自动填充功能 目录 一 应用场景 二 代码实现步骤 1 建数据库表 t user 2 创建spring boot项目集成mybatis plus实现字段自动填充 2
  • 少儿机器人编程主要使用的语言有啥

    少儿机器人编程主要使用的语言 说起孩子的学习 想必家长们都是非常的有发言权的 很多的家长在培养孩子的学习方面也可以说相当的耐心的 他们会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对
  • PHP开源大全

    WordPress PHP开源 博客Blog WordPress是最热门的开源个人信息发布系统 Blog 之一 基于PHP MySQL构建 WordPress提供的功能包括 1 文章发布 分类 归档 2 提供文章 评论 分类等多种形式的RS
  • MySQL数据库数据导出出现1290(secure_file_priv)错误解决方法

    目录 解决方案 测试效果 解决方案 secure file priv是用来限制mysql数据库导出的位置 目录 算是一直安全保护系统 我们可以去通过show variables like secure 这个指令去查看secure file
  • 2021-05-08记录一次最新版小红书逆向细节

    预备工具 ida7 5 piexl 手机 jadx jeb 某书是有TracerPid反调试 先过反调试 这有两个方法 1 Frida hook fopen 过滤 2 修改安卓源码去掉TracerPid 1 Frida hook脚本 fun
  • Python入门到实战(十一)无监督学习、KMeans、KNN、实现图像分割、监督学习VS无监督学习

    Python入门到实战 十一 无监督学习 KMeans KNN 实现图像分割 监督学习VS无监督学习 无监督学习unsupervised learning 特点 应用 K均值聚类 核心流程 核心公式 KMeans VS KNN 实战 KMe
  • 深度遍历 和 广度遍历

    深度dfs 用到了递归 先把根节点 输出根节点 然后遍历根节点的孩子 const fun1 root gt console log root val root children forEach fun1 fun1 tree 广度遍历 每次遍
  • java 集成MinIo

    1 引入maven包 注意jar包冲突
  • 在springboot打包成jar后,无法读取自定义文件的解决办法

    前两天在做springcloud框架下的项目的时候 用到有一个框架之外的文件需要进行读取 当时在eclipse中编码时通过this getClass getResource来获取文件的路径 没有任何的问题 但是在打成jar以后 这是是打成j
  • c++3之static、const、friend关键字

    1 1static 修饰局部变量 延长生命周期 由栈区 gt 静态区 修饰全局变量或函数 限制作用域 只能用于本文件中使用 static 成员变量 1 static成员变量不占class的空间 修饰成员变量 需要在外部单独定义 要加来源 A