C++深度解析教程笔记9-静态成员变量,静态成员函数,二阶构造,友元,函数重载,操作符重载

C++深度解析教程笔记9

  • 第25课 - 类的静态成员变量
    • 实验-数对象个数(失败)
    • 实验-静态变量
    • 小结
  • 第26课 - 类的静态成员函数
    • 实验-修改对象的静态变量数值
    • 实验-利用静态成员函数
    • 实验-静态变量+静态函数实现统计对象个数
    • 小结
  • 第27课 - 二阶构造模式
    • 实验-初始化是否成功
    • 实验-二阶构造例子
    • 实验-二阶构造数组类
    • 小结
  • 第28课 - 友元的尴尬能力
    • 实验-友元
    • 实验-友元不具有传递性
    • 小结
  • 第29课 - 类中的函数重载
    • 实验
    • 实验
    • 实验
    • 小结
  • 第30课 - 操作符重载的概念
    • 实验-友元实现复数相加
    • 实验-操作符重载
    • 实验
    • 小结
  • 第31课 - 完善的复数类
    • 实验
    • 小结

本文学习自狄泰软件学院 唐佐林老师的 C++深度解析教程,图片全部来源于课程PPT,仅用于个人学习记录

第25课 - 类的静态成员变量

成员变量不能在对象间共享,是专属的,可通过对象名访问public成员变量
需求

在这里插入图片描述

实验-数对象个数(失败)

#include <stdio.h>class Test
{
private:int mCount;
public:Test() : mCount(0){mCount++;}~Test(){--mCount;}int getCount(){return mCount;}
};Test gTest;int main()
{Test t1;Test t2;printf("count = %d\n", gTest.getCount());printf("count = %d\n", t1.getCount());printf("count = %d\n", t2.getCount());return 0;
}
/*
期望输出1 2 3,实际输出:
count = 1
count = 1
count = 1
*/

在这里插入图片描述
在这里插入图片描述

实验-静态变量

#include <stdio.h>class Test
{
private:static int cCount;//静态
public:Test(){cCount++;}~Test(){--cCount;}int getCount(){return cCount;}
};int Test::cCount = 0;Test gTest;int main()
{Test t1;Test t2;printf("count = %d\n", gTest.getCount());printf("count = %d\n", t1.getCount());printf("count = %d\n", t2.getCount());Test* pt = new Test();printf("count = %d\n", pt->getCount());delete pt;printf("count = %d\n", gTest.getCount());return 0;
}
/*
count = 3
count = 3
count = 3
count = 4
count = 3*/

小结

类中可以通过static关键定义静态成员变量
静态成员变量
在这里插入图片描述

第26课 - 类的静态成员函数

问题:不能随时获取当前对象的数据,没有安全性,使用了全局变量
在这里插入图片描述

实验-修改对象的静态变量数值

#include <stdio.h>class Test
{
public:static int cCount;
public:Test(){cCount++;}~Test(){--cCount;}int getCount(){return cCount;}
};int Test::cCount = 0;int main()
{printf("count = %d\n", Test::cCount);//count = 0Test::cCount = 1000;//可以修改数值,安全性问题printf("count = %d\n", Test::cCount);//count = 1000return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验-利用静态成员函数

#include <stdio.h>class Demo
{
private:int i;
public:int getI();static void StaticFunc(const char* s);//静态函数static void StaticSetI(Demo& d, int v);//静态函数
};int Demo::getI()
{return i;
}void Demo::StaticFunc(const char* s)
{printf("StaticFunc: %s\n", s);
}void Demo::StaticSetI(Demo& d, int v)
{d.i = v;
}int main()
{Demo::StaticFunc("main Begin...");//不需要对象,通过类直接调用Demo d;Demo::StaticSetI(d, 10);printf("d.i = %d\n", d.getI());Demo::StaticFunc("main End...");return 0;
}
/*
StaticFunc: main Begin...
d.i = 10
StaticFunc: main End...*/

在这里插入图片描述

实验-静态变量+静态函数实现统计对象个数

#include <stdio.h>class Test
{
private:static int cCount;
public:Test(){cCount++;}~Test(){--cCount;}static int GetCount(){return cCount;}
};int Test::cCount = 0;int main()
{printf("count = %d\n", Test::GetCount());Test t1;Test t2;printf("count = %d\n", t1.GetCount());printf("count = %d\n", t2.GetCount());Test* pt = new Test();printf("count = %d\n", pt->GetCount());delete pt;printf("count = %d\n", Test::GetCount());return 0;
}
/*count = 0
count = 2
count = 2
count = 3
count = 2
*/

小结

在这里插入图片描述

第27课 - 二阶构造模式

在这里插入图片描述
在这里插入图片描述

实验-初始化是否成功

#include <stdio.h>class Test
{int mi;int mj;bool mStatus;//记录初始化是否成功
public:Test(int i, int j) : mStatus(false){mi = i;return;//endmj = j;mStatus = true;}int getI(){return mi;}int getJ(){return mj;}int status()//获取状态{return mStatus;}
};int main()
{  Test t1(1, 2);// printf("t1.mi = %d\n", t1.getI());//printf("t1.mj = %d\n", t1.getJ());//不成功if( t1.status() ){printf("t1.mi = %d\n", t1.getI());printf("t1.mj = %d\n", t1.getJ());}return 0;
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

IntArray::IntArray(int len)
{//m_pointer = 0;//new int[len];case1m_pointer = new int[len];//case2if(m_pointer){for(int i=0; i<len; i++){m_pointer[i] = 0;}}m_length = len;
}int main()
{IntArray a(5);a.set(2, 3);    printf("%d\n", a.length());    a.free(); return 0;
}
cyz@cyz-virtual-machine:~/桌面/testcpp$ g++ main.cpp IntArray.cpp
cyz@cyz-virtual-machine:~/桌面/testcpp$ ./a.out
段错误 (核心已转储)
cyz@cyz-virtual-machine:~/桌面/testcpp$ g++ main.cpp IntArray.cpp
cyz@cyz-virtual-machine:~/桌面/testcpp$ ./a.out
5

实验-二阶构造例子

#include <stdio.h>class TwoPhaseCons 
{
private:TwoPhaseCons() // 第一阶段构造函数{  //与系统资源无关的初始化 }bool construct() // 第二阶段构造函数{ //与系统资源相关关的初始化return true; }
public:static TwoPhaseCons* NewInstance(); // 对象创建函数
};TwoPhaseCons* TwoPhaseCons::NewInstance() 
{TwoPhaseCons* ret = new TwoPhaseCons();// 若第二阶段构造失败,返回 NULL    if( !(ret && ret->construct()) ) {delete ret;//删除半成品ret = NULL;}return ret;
}int main()
{TwoPhaseCons* obj = TwoPhaseCons::NewInstance();printf("obj = %p\n", obj);//obj = 0000000002521CB0delete obj;return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验-二阶构造数组类

//h文件 修改
class IntArray
{
private:int m_length;int* m_pointer;IntArray(int len) ;// 第一阶段构造函数bool construct() ;// 第二阶段构造函数IntArray(const IntArray& obj);public:
static IntArray* NewInstance(int length); // 对象创建函数 静态成员函数//IntArray(int len);//构造函数改为私有 作为第一阶段构造函数int length();bool get(int index, int& value);bool set(int index ,int value);~IntArray();
};
//IntArray.cpp
IntArray::IntArray(int len)//第一阶段构造函数
{m_length = len;
}
bool IntArray::construct() // 第二阶段构造函数{ bool ret=true;m_pointer = new int[m_length];//与系统资源相关关的初始化if(m_pointer){for(int i=0; i<m_length; i++){m_pointer[i] = 0;}}else{ret=false;}return ret; }
IntArray* IntArray::NewInstance(int length)// 对象创建函数
{IntArray* ret = new IntArray(length);//new 第一阶段构造函数 // 若第二阶段构造失败,返回 NULL    if( !(ret && ret->construct()) ) {delete ret;//删除半成品ret = 0;}return ret;
}
IntArray::~IntArray()
{delete[]m_pointer;//printf("~IntArray()\n");
}//main.cppIntArray* a = IntArray::NewInstance(5);    printf("a.length = %d\n", a->length());a->set(0, 1);for(int i=0; i<a->length(); i++){int v = 0;a->get(i, v);printf("a[%d] = %d\n", i, v);}delete a;

小结

在这里插入图片描述

第28课 - 友元的尴尬能力

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验-友元

#include <stdio.h>
#include <math.h>class Point
{double x;double y;
public:Point(double x, double y){this->x = x;this->y = y;}double getX(){return x;}double getY(){return y;}friend double func(Point& p1, Point& p2);//友元 实现访问类
//friend double func(Point& p1, Point& p2);//注释后 error: 'double Point::y' is private within this context
};double func(Point& p1, Point& p2)
{double ret = 0;ret = (p2.y - p1.y) * (p2.y - p1.y) +(p2.x - p1.x) * (p2.x - p1.x);ret = sqrt(ret);return ret;
}int main()
{Point p1(1, 2);Point p2(10, 20);printf("p1(%f, %f)\n", p1.getX(), p1.getY());//p1(1.000000, 2.000000)printf("p2(%f, %f)\n", p2.getX(), p2.getY());//p2(10.000000, 20.000000)printf("|(p1, p2)| = %f\n", func(p1, p2));//|(p1, p2)| = 20.124612return 0;
}

在这里插入图片描述

在这里插入图片描述

实验-友元不具有传递性

#include <stdio.h>class ClassC
{const char* n;
public:ClassC(const char* n){this->n = n;}friend class ClassB;//B可以访问C的成员
};class ClassB
{const char* n;
public:ClassB(const char* n){this->n = n;}void getClassCName(ClassC& c){printf("c.n = %s\n", c.n);}friend class ClassA;//A可以访问B的成员
};
//无传递性,A不可以访问C的成员
class ClassA
{const char* n;
public:ClassA(const char* n){this->n = n;}void getClassBName(ClassB& b){printf("b.n = %s\n", b.n);}/*void getClassCName(ClassC& c)//error: 'const char* ClassC::n' is private within this context{printf("c.n = %s\n", c.n);}*/};int main()
{ClassA A("A");ClassB B("B");ClassC C("C");A.getClassBName(B);//b.n = BB.getClassCName(C);//c.n = Creturn 0;
}

小结

在这里插入图片描述

第29课 - 类中的函数重载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>class Test
{int i;
public:Test(){printf("Test::Test()\n");this->i = 0;}Test(int i){printf("Test::Test(int i)\n");this->i = i;}Test(const Test& obj){printf("Test(const Test& obj)\n");this->i = obj.i;}static void func(){printf("void Test::func()\n");}void func(int i){printf("void Test::func(int i), i = %d\n", i);}int getI(){return i;}
};void func()//全局函数1
{printf("void func()\n");
}void func(int i)//全局函数2
{printf("void func(int i), i = %d\n", i);
}int main()
{func();func(1);Test t;        // Test::Test()Test t1(1);    // Test::Test(int i)Test t2(t1);   // Test(const Test& obj)func();        // void func()Test::func();  // void Test::func()func(2);       // void func(int i), i = 2;t1.func(2);    // void Test::func(int i), i = 2t1.func();     // void Test::func()return 0;
}
/*
void func()
void func(int i), i = 1
Test::Test()
Test::Test(int i)
Test(const Test& obj)
void func()
void Test::func()
void func(int i), i = 2
void Test::func(int i), i = 2
void Test::func()*/

在这里插入图片描述

实验

#include <stdio.h>
#include <string.h>char* strcpy(char* buf, const char* str, unsigned int n)
{return strncpy(buf, str, n);
}int main()
{const char* s = "D.T.Software";char buf[8] = {0};//strcpy(buf, s);//报错,放不下字符串strcpy(buf, s, sizeof(buf)-1);//利用重载扩展原有函数的功能printf("%s\n", buf);//D.T.Sofreturn 0;
}

在这里插入图片描述
在这里插入图片描述

实验

在这里插入代码片

小结

在这里插入图片描述

第30课 - 操作符重载的概念

在这里插入图片描述

实验-友元实现复数相加

#include <stdio.h>class Complex 
{int a;int b;
public:Complex(int a = 0, int b = 0){this->a = a;this->b = b;}int getA(){return a;}int getB(){return b;}friend Complex Add(const Complex& p1, const Complex& p2);
};Complex Add(const Complex& p1, const Complex& p2)
{Complex ret;ret.a = p1.a + p2.a;ret.b = p1.b + p2.b;return ret;
}int main()
{Complex c1(1, 2);Complex c2(3, 4);Complex c3 = Add(c1, c2); // c1 + c2printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());//c3.a = 4, c3.b = 6return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验-操作符重载

#include <stdio.h>class Complex 
{int a;int b;
public:Complex(int a = 0, int b = 0){this->a = a;this->b = b;}int getA(){return a;}int getB(){return b;}friend Complex operator + (const Complex& p1, const Complex& p2);
};Complex operator + (const Complex& p1, const Complex& p2)
{Complex ret;ret.a = p1.a + p2.a;ret.b = p1.b + p2.b;return ret;
}int main()
{Complex c1(1, 2);Complex c2(3, 4);Complex c3 = operator+(c1, c2);//Complex c3 = c1 + c2;  printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());//c3.a = 4, c3.b = 6return 0;
}

在这里插入图片描述

实验

#include <stdio.h>class Complex 
{int a;int b;
public:Complex(int a = 0, int b = 0){this->a = a;this->b = b;}int getA(){return a;}int getB(){return b;}Complex operator + (const Complex& p){Complex ret;printf("Complex operator + (const Complex& p)\n");ret.a = this->a + p.a;ret.b = this->b + p.b;return ret;}friend Complex operator + (const Complex& p1, const Complex& p2);
};Complex operator + (const Complex& p1, const Complex& p2)
{Complex ret;printf("Complex operator + (const Complex& p1, const Complex& p2)\n");ret.a = p1.a + p2.a;ret.b = p1.b + p2.b;return ret;
}int main()
{Complex c1(1, 2);Complex c2(3, 4);Complex c3 = c1 + c2; // c1.operator + (c2)printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB());return 0;
}
/*
Complex operator + (const Complex& p)
c3.a = 4, c3.b = 6
*/
编译器优先调用类中的函数,其次才是全局函数

小结

在这里插入图片描述

第31课 - 完善的复数类

在这里插入图片描述
在这里插入图片描述

实验

#ifndef _COMPLEX_H_
#define _COMPLEX_H_class Complex
{
private:double a;double b;
public:Complex(double a=0,double b=0);double getA();double getB();double getmodulus();Complex operator+(const Complex& c);Complex operator-(const Complex& c);Complex operator*(const Complex& c);Complex operator/(const Complex& c);bool operator==(const Complex& c);bool operator!=(const Complex& c);Complex& operator=(const Complex& c);};
#endif // _COMPLEX_H_#include "Complex.h"
#include "math.h"Complex::Complex(double a,double b)
{this->a=a;this->b=b;
}
double Complex::getA()
{return a;
}
double Complex::getB(){return b;
}
double Complex::getmodulus()
{double res=sqrt(a*a+b*b);return res;
}Complex Complex::operator+(const Complex& c)
{double na=a+c.a;double nb=b+c.b;Complex res=Complex(na,nb);return res;
}
Complex Complex::operator-(const Complex& c)
{double na=a-c.a;double nb=b-c.b;Complex res=Complex(na,nb);return res;}
Complex Complex::operator*(const Complex& c)
{double na=a*c.a-b*c.b;double nb=a*c.b+b*c.a;Complex res=Complex(na,nb);return res;}
Complex Complex::operator/(const Complex& c)
{double m=c.a*c.a+c.b*c.b;double na=(a*c.a+b*c.b)/m;double nb=(-a*c.b+b*c.a)/m;Complex res=Complex(na,nb);return res;}bool Complex::operator==(const Complex& c){return a==c.a&&b==c.b;}
bool Complex::operator!=(const Complex& c)
{return !(a==c.a&&b==c.b);}
Complex& Complex::operator=(const Complex& c){if(this!=&c){a=c.a;b=c.b;}return *this;}//main.cpp
#include <stdio.h>
#include "Complex.h"int main()
{Complex a1(1,2);Complex a2(3,4);Complex a3=a1+a2;printf("%f %f\n",a3.getA(),a3.getB());printf("a3.getmodulus()=%f\n",a3.getmodulus());a3=a1-a2;printf("a1-a2 %f %f\n",a3.getA(),a3.getB());a3=a1*a2;printf("a1*a2%f %f\n",a3.getA(),a3.getB());a3=a1/a2;printf("a1/a2%f %f\n",a3.getA(),a3.getB());Complex a4=a1;printf("%f %f\n",a4.getA(),a4.getB());printf("a4==a1 %d  a4!=a1 %d\n",a4==a1,a4!=a1);return 0;
}

在这里插入图片描述

小结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度人脸识别Windows C++离线sdk C#接入

百度人脸识别Windows C离线sdk C#接入 目录 说明 设计背景 • 场景特点&#xff1a; • 客户特点&#xff1a; • 核心需求&#xff1a; SDK 包结构 效果 代码 说明 自己根据SDK封装了动态库&#xff0c;然后C#调用。 功能接口 设计背景 • 场景特点&#xff1a; -…

【渗透入门】XSS

文章目录 XSS漏洞XSS举例XSS类型防御方式 XSS漏洞 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的Web应用程序安全漏洞。XSS漏洞发生在应用程序未能充分过滤用户提供的数据&#xff0c;使得恶意脚本得以在不知情的用户的浏览器中被执行…

ARFoundation系列讲解 - 91 Immersal 简介

一、Immersal 简介 Immersal是一家专注于增强现实(AR)技术的公司,致力于开发和推广空间感知解决方案(简称:大空间技术)。他们的核心产品是一个名为Immersal SDK的开发工具包,通过视觉定位(VPS)能够轻松地在现实世界中实现高精度的定位和增强现实体验。 二、Immersal …

Spring Boot集成Knife4j:实现高效API文档管理

Spring Boot集成Knife4j&#xff1a;实现高效API文档管理 在软件开发过程中&#xff0c;编写和维护接口文档是一项必不可少的任务。随着微服务架构的流行&#xff0c;API文档的重要性日益凸显。然而&#xff0c;传统的手动编写文档方式不仅效率低下&#xff0c;而且容易出错。…

支持前端路由权限和后端接口权限的企业管理系统模版

一、技术栈 前端&#xff1a;iview-admin vue 后端&#xff1a;springboot shiro 二、基于角色的权限控制 1、路由权限 即不同角色的路由访问控制 2、菜单权限 即不同角色的菜单列表展示 3、按钮权限 即不同角色的按钮展示 4、接口权限 即不同角色的接口访问控制 三…

数字化时代的生产革新:数字孪生平台如何助力新质生产力

一.新质生产力 在当今快速发展的科技和信息时代&#xff0c;企业和组织在提高生产效率和质量方面面临着越来越多的挑战和机遇。新质生产力的概念应运而生&#xff0c;强调通过创新和技术进步&#xff0c;不仅提升生产的数量和速度&#xff0c;更重要的是优化生产方式、改善产品…

leetcode热题100.分割等和子集(动态规划)

分割等和子集 Problem: 416. 分割等和子集 思路 我选择使用动态规划的方法来解题。我们需要判断是否可以将数组分割成两个子集&#xff0c;使得这两个子集的和相等。这个问题可以转化为在数组中找到一个子集&#xff0c;使得其和等于数组总和的一半。 解题过程 首先&#xf…

消息队列-RocketMQ

消息队列-RocketMQ 1、RocketMQ是什么?2、RocketMQ有什么优缺点?3、消息队列主要有哪几种消息模型?4、RocketMQ主要使用哪种消息模型?5、RocketMQ的基本架构是怎样的?有哪些核心组件?6、RocketMQ通过什么方式保证消息的可用性和可靠性?7、什么情况下会发生消息丢失?Roc…

设计模式大白话之装饰者模式

想象一下&#xff0c;你走进一家咖啡馆&#xff0c;点了一杯美式咖啡。但是&#xff0c;你可能还想根据自己的口味添加一些东西&#xff0c;比如奶泡、巧克力粉、焦糖酱或是肉桂粉。每次你添加一种配料&#xff0c;你的咖啡就会变得更丰富&#xff0c;同时价格也会相应增加。 在…

图——图的应用02最短路径(Dijkstra算法与Floyd算法详解),拓扑排序及关键路径

前面介绍了图的应用——01最小生成树章节&#xff0c;大家可以通过下面的链接学习&#xff1a; 图——图的应用01最小生成树&#xff08;Prim算法与Kruskal算法详解&#xff09; 今天就讲一下图的其他应用——最短路径&#xff0c;拓扑排序及关键路径。 目录 一&#xff0c…

HG/T 3655-2024 紫外光UV固化木器涂料检测

紫外光UV固化木器涂料是指由活性低聚物、活性稀释剂、光引发剂和其他成分组成的水性、非水性紫外光固化木器涂料&#xff0c;主要用于室内用木质地板、家具、装饰板等木器的装饰与保护。 HG/T 3655-2024紫外光UV固化木器涂料检测项目&#xff1a; 测试指标 测试方法 在容器中…

成都亚恒丰创教育科技有限公司 【插画猴子:笔尖下的灵动世界】

在浩瀚的艺术海洋中&#xff0c;每一种创作形式都是人类情感与想象力的独特表达。而插画&#xff0c;作为这一广阔领域中的璀璨明珠&#xff0c;以其独特的视觉语言和丰富的叙事能力&#xff0c;构建了一个又一个令人遐想连篇的梦幻空间。成都亚恒丰创教育科技有限公司 在众多插…

MYSQL设计索引一般需要考虑哪些因素?

在设计MySQL索引时&#xff0c;确实需要综合考虑多个因素以确保索引的有效性和性能优化。以下是您提到的参考思路的详细扩展&#xff1a; 1. 数据量 数据量大小&#xff1a;通常&#xff0c;当表中的数据量超过一定阈值&#xff08;如几百条记录&#xff09;时&#xff0c;创…

Linux——进程概念详解

一、进程的基本概念 在给进程下定义之前&#xff0c;我们先了解一下进程&#xff1a; 我们在编写完代码并运行起来时&#xff0c;在我们的磁盘中会形成一个可执行文件&#xff0c;当我们双击这个可执行文件时&#xff08;程序时&#xff09;&#xff0c;这个程序会加载到内存…

动手学深度学习6.3 填充和步幅-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;填充和步幅_哔哩哔哩_bilibili 代码实现_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.3. 填充和…

如何在 Ubuntu 14.04 服务器上使用 Nginx 安装和保护 phpMyAdmin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 像 MySQL 这样的关系型数据库管理系统在许多网站和应用程序中都是必不可少的。然而&#xff0c;并非所有用户都习惯通过命令行来管…

oracle数据库,怎么分页查询

项目场景&#xff1a; 使用oracle数据库&#xff0c;怎么分页查询 问题描述 平常使用的最多的是MySQL DB, 用的是 limit 语句&#xff1b;Oracle DB, 没有 limit 语句&#xff1b; 原因分析&#xff1a; 解决方案&#xff1a; SELECT * FROM (SELECT t.*, ROWNUM rn FROM…

java算法day16

java算法day16 112 路径总和404 左叶子之和513 找树左下角的值 112 路径总和 题型判定为自顶向下类型&#xff0c;并且为路径和类型。 那就套模板。 自顶向下就是从上到下处理&#xff0c;那么就是前序遍历的思想。 class Solution {boolean res false;public boolean hasP…

自建Web网站部署——案例分析

作者主页: 知孤云出岫 目录 作者主页:如何自建一个Web网站一、引言二、需求分析三、技术选型四、开发步骤1. 项目初始化初始化前端初始化后端 2. 前端开发目录结构示例代码App.jsHome.js 3. 后端开发目录结构示例代码app.jsproductRoutes.jsProduct.js 4. 前后端连接安装axio…

泛微e-cology WorkflowServiceXml SQL注入漏洞(POC)

漏洞描述&#xff1a; 泛微 e-cology 是泛微公司开发的协同管理应用平台。泛微 e-cology v10.64.1的/services/接口默认对内网暴露&#xff0c;用于服务调用&#xff0c;未经身份认证的攻击者可向 /services/WorkflowServiceXml 接口发送恶意的SOAP请求进行SQL注入&#xff0c;…