C++真的是 C加加
📝个人主页:夏目浅石.
📌博客专栏:C++的故事
🏠学习社区:夏目友人帐.
文章目录
- 前言
- Ⅰ. 函数重载
- 0x00 重载规则
- 0x01 函数重载的原理名字修饰
- Ⅱ. 引用
- 0x00 引用的概念
- 0x01 引用和指针区分
- 0x03 引用的本质
- 0x04 引用的特性
- 0x05 引用的使用场景
- 0x06 常引用
- 0x07 指针和引用区别
- Ⅲ. 结语
前言
亲爱的夏目友人帐的小伙伴们,今天我们继续讲解 C++ 入门的知识 函数重载 和 引用 这里的知识虽然入门,但是却是你后面更加深入学习 C++ 知识的钥匙,所以请跟着夏目学长一起进入 C++ 的世界吧!
Ⅰ. 函数重载
函数重载的定义:
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
我们都知道 C++ 是对 C语言的 “升级版” 所以不难想到:函数重载就是对 C语言 的扩展知识,C语言当中是不允许函数名字是相同的,如果出现则 就会报错,而在 C++ 却是可以的。
0x00 重载规则
如果一个函数想要满足函数重载,则需要满足重载规则(其中一个):
- 参数类型不同
- 参数个数不同
- 参数类型顺序不同
而对于 C++ 函数重载 即 函数名字 相同 是可以存在的。
下面根据上面的三个规则给出具体的例子。
// 参数类型不同
int add(int left , int right)
{return left + right;
}int add(double left , double right)
{return left + right;
}// 参数个数不同
int add(double left , double right , int mid)
{return left + right;
}// 参数类型顺序不同
int add(int left , int right)
{return left + right;
}char add(char right , char left)
{return left + right;
}
值得注意的是 :函数重载需要在同一块命名空间
因为函数重载是根据类型识别的,所以对于相同类型的数据,顺序不同,不构成函数重载,而且编译器无法识别:
// 错误样例 不构成重载
int add(int left , int right)
{return left + right;
}int add(int right , int left)
{return left + right;
}
0x01 函数重载的原理名字修饰
为什么C++支持函数重载,而C语言不支持函数重载呢?
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
从汇编角度来讲:调用函数处会变成 call + add(地址)
的形式,然后通过汇编指令完成调用。
所以对于C语言来说,就是依靠函数名去找函数的,如果函数名相同,则会冲突,因为不知道找哪个函数.
对于C++来说,不同平台就有不同的修饰规则,对于 vs 上比较复杂 所以退而求其次,这里我们讲 Linux 上的:
int add(int left, int right)
{return left + right;
}
对于这个函数,就会被修饰为 _Z3addii
我想这里你肯定看不懂,所以我先给你讲解一下Linux系统下修饰的规则:
Linux 下修饰规则—格式 : _ Z + 函数名称长度 + 函数名 + 类型首字母
下面是验证的例子:
对于相同名字的函数,函数重载就根据参数的类型,顺序,个数,以这些为基准,来区别不同的函数。
而根据上面的验证,我们也知道为什么 返回值不同 和 参数类型相同但顺序不同 为什么不能构成函数重载的原因:
因为对于 参数类型相同但顺序不同,形成的后缀还是一样的 ,并不能区分该调用哪个函数;而对于返回值不同的其他都相同的函数来说,则是因为分不清调用哪个函数,不仅仅是因为函数返回值不在修饰规则内。
Windows 下修饰规则(简单了解):
Ⅱ. 引用
0x00 引用的概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
通俗来讲:别名,又可以说是外号,代称,比如水浒传里几乎是别名最多的地方。李逵,在家称为"铁牛",江湖上人称"黑旋风"。铁牛和黑旋风就是李逵的别名。
#include<iostream>using namespace std;int main()
{int a = 10;int& b = a;// b是a的引用cout << a << endl;cout << b << endl;return 0;
}
0x01 引用和指针区分
我们在学习 C语言 的时候知道 & 是 取地址的意思,所以在这里要给大家讲讲 & 的含义。
& 就是引用,但是& 这个操作符和取地址 & 操作符是重叠的。
所以它们需要不同的场景规范:
当 &b 单独存在时,这时就代表取地址,为取出变量的地址。
但是如果这样:
#include<iostream>using namespace std;int main()
{int a = 10;int& b = a; //引用int* ptr = &a; // 取地址return 0;
}
0x03 引用的本质
我们可以打开调试窗口进行查看a
和b
的地址和值:
我们发现a和b不仅值相等,连地址也是相同的。而这就说明,b 就是 a ,在语法层面上,这里 b 并不是开辟的新空间,而是对原来的 a 取了一个新名称,叫做 b 。
就好比李逵被叫做黑旋风一样,李逵还是李逵,黑旋风也是它;而 a 就是 a ,但是 b 也是 a 。
而如果这时候对 a 或 b 任意一个修改,那么 a 和 b 都会发生修改。
#include<iostream>using namespace std;int main()
{int a = 10;int& b = a; //引用b = 20;cout << b << endl;cout << a << endl;return 0;
}
0x04 引用的特性
1. 引用在定义时必须初始化
// 错误样例
int main()
{int a = 10;int& b;return 0;
}
引用是取别名,所以在定义的时候必须明确是谁的别名。
2. 一个变量可以有多个引用
一个变量也可以有多个别名。
int main()
{int a = 10;int& b = a;int& c = a;int& d = a;return 0;
}
而对于一个起过别名的变量,对它的别名取别名也是可以的。
就好比说有人可能知道李逵也叫铁牛,并不知道他真实姓名,但是他觉得李逵很黑,于是叫他黑旋风,这也没问题,因为这里描述的都是一个人,同理,描述的也是同一个变量。
int main()
{int a = 10;int& b = a;int& c = b;int& d = c;return 0;
}
3. 引用一旦引用一个实体,就不能引用其他实体
int main()
{int a = 10;int& b = a; // 引用int c = 20;b = c;// 赋值操作return 0;
}
引用一旦引用一个实体,就不能引用其他实体,引用是不会发生改变的。
但是对于指针,则是截然不同的:
int main()
{int a = 10;int c = 20;int* p = &a;p = &c;return 0;
}
对于指针来说,指针可以时刻修改:
p原本指向 a , 现在指向 c
但是引用也有局限性,因为引用之后的变量是不可修改引用的,比如链表,节点是要不断更替迭代的,所以还需要指针配合,C++才可以写出一个链表。
0x05 引用的使用场景
1. 做参数
我们知道实参的改变不影响实参,所以这种写法并不能改变值,因为此刻是 传值调用 :
#include<iostream>using namespace std;void Swap(int x,int y)
{int tmp = x;x = y;y = tmp;
}int main()
{int a = 10;int b = 20;cout << "a = " << a << " " << "b = " << b << endl;Swap(a,b);cout << "a = " << a << " " << "b = " << b << endl;return 0;
}
使用引用修改后:
#include<iostream>using namespace std;void Swap(int& x,int& y)
{int tmp = x;x = y;y = tmp;
}int main()
{int a = 10;int b = 20;cout << "a = " << a << " " << "b = " << b << endl;Swap(a,b);cout << "a = " << a << " " << "b = " << b << endl;return 0;
}
x 和 y 分别是 a 和 b 的引用,对 x 和 y 进行修改,就是对 a 和 b 进行修改,所以值也被修改成功了。
它们的地址是完全相同的。而这里这里既不是传值调用,也不是传址调用,而是 传引用调用 。
思考:上面三个函数是否构成函数重载? 构成,但无法调用。
根据函数名修饰规则,传值和传引用的是不一样的,比如会加上 R 做区分。
但是不能同时调用传值和传引用,因为有歧义,因为 调用不明确 ,编译器并不知道调用哪个:
#include<iostream>using namespace std;void Swap(int& x,int& y)
{int tmp = x;x = y;y = tmp;
}void Swap(int x,int y)
{int tmp = x;x = y;y = tmp;
}int main()
{int a = 10;int b = 20;cout << "a = " << a << " " << "b = " << b << endl;Swap(a,b);cout << "a = " << a << " " << "b = " << b << endl;return 0;
}
2. 引用解决二级指针生涩难懂的问题
讲单链表时,我们写的由于是没有头结点的链表,所以修改时,需要二级指针,对于指针概念不清晰的小伙伴们可能比较难理解。
但是学了引用,就可以解决这个问题:
结构定义:
typedef struct SListNode
{int data;struct SListNode* next;
}SLTNode;
原代码:
void SListPushFront(SLTNode** pphead, SLTDateType x)
{SLTNode* newnode = BuyListNode(x);newnode->next = *pphead; *pphead = newnode;
}// 调用
SLTNode* pilst = NULL;
SListPushFront(&plist);
修改后:
void SListPushFront(SLTNode*& pphead, SLTDateType x) // 改
{SLTNode* newnode = BuyListNode(x);newnode->next = *pphead; *pphead = newnode;
}// 调用
SLTNode* pilst = NULL;
SListPushFront(plist); // 改
修改之后的代码里的二级指针被替换成了引用。
而这里的意思就是给一级指针取了一个别名,传过来的是plist,而plist 是一个一级指针,所以会出现 * ,而这里就相当于 pphead 是 plist 的别名。而这里修改 pphead ,也就可以对 plist 完成修改。
但是有时候也会这么写 :
结构定义:
typedef struct SListNode
{int data;struct SListNode* next;
}SLTNode, *PSLTNode;
这里的意思就是将 struct SListNode*
类型重命名为 PSLTNode
。
void SListPushFront(PSLTNode& pphead, SLTDateType x) // 改
{PSLTNode newnode = BuyListNode(x);newnode->next = pphead; pphead = newnode;
}// 调用
PSLTNode plist = NULL;
SListPushFront(plist);
在 typedef
之后,PSLTNode
就是结构体指针,所以传参过去,只需要在形参那边用引用接收,随后进行操作,就可以达成目的。
而形参的改变影响实参的参数叫做输出型参数,对于输出型参数,使用引用十分方便
3.做返回值
//用引用来接收n的引用
#include<iostream>
using namespace std;
int& Count(int x)
{int n = x;n++;// ...return n;
}int main()
{int& ret = Count(10);//随机值cout << ret << endl;Count(20);cout << ret << endl;//随机值return 0;
}
这里打印ret的值是不确定的
如果Count函数结束,栈帧销毁,栈帧没有清理,那么ret的值是侥幸正确的
如果Count函数结束,栈帧销毁,栈帧被清理,那么ret的值是随机值
这里可能是编译器的问题,结果和我们预想的是一样的,但是别的编译器来运行可能就会是随机值
当第一次调用Count函数时返回n的引用。
第二次调用相同的函数,栈帧用的是同一块空间,并且 ret
是 n
的引用的别名,所以出现与传参预期的结果一样,那么当调用其他不同的函数后,那么该栈帧就会被覆盖,则第二次打印ret就会出现随机值了,所以这样使用ret是错误的。
// 正确的做法
#include<iostream>
using namespace std;
int& Count(int x)
{static int n = x;n++;// ...return n;
}int main()
{int& ret = Count(10);cout << ret << endl;Count(20);cout << ret << endl;return 0;
}
而这时 static 修饰的静态变量不委屈了:n不会被销毁,所以就不会产生随机值这一错误了
0x06 常引用
以前学习C语言的时候我们知道:const 修饰的是常变量,不可修改。
#include<iostream>
using namespace std;
int main()
{const int a = 10;int& b = a;return 0;
}
a 本身都不能修改,b 为 a 的引用,那么 b 也不可以修改,这样就没意义了。a 是只读,但是引用 b 具有 可读可写 的权利,该情况为 权限放大 ,所以错误了。
这时,只要加 const 修饰 b ,让 b 的权限也只有只读,使得 权限不变 ,就没问题了:
int main()
{const int a = 10;const int& b = a;return 0;
}
而如果原先变量可读可写,但是别名用 const 修饰,也是可以的,这种情况为 权限缩小 :
对于函数的返回值来说,也不能权限放大,例如:
int func()
{static int n = 0;n++;return n;
}int main()
{int& ret = func();// 错误的return 0;
}
这样也是不行的,因为返回方式为 传值返回 ,返回的是临时变量,具有 常性 ,是不可改的;而引用放大了权限,所以是错误的;这时加 const
修饰就没问题:const int& ret = func()
0x07 指针和引用区别
从语法概念上来说,引用是没有开辟空间的,而指针是开辟了空间的,但是从底层实现上来说,则又不一样:
int main()
{int a = 10;int& r = a;r = 20;int* p = &a;*p = 20;return 0;
}
其实从汇编上,引用其实是开空间的,并且实现方式和指针一样,引用其实也是用指针实现的。
区别汇总:
- 引用概念上定义一个变量的 别名 ,指针存储一个变量 地址
- 引用 在定义时 必须初始化 ,指针最好初始化 ,但是不初始化也不会报错
- 引用在初始化时引用一个实体后 ,就不能再引用其他实体 ,而指针可以在任何时候指向任何一个同类型
- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为 引用类型的大小,但指针始终是 地址空间所占字节个数 (32位平台下占4个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全
Ⅲ. 结语
📌 [ 笔者 ] 夏目浅石.
📃 [ 更新 ] 2023.9.21
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!
📜 参考文献:
B. 比特科技. C/C++[EB/OL]. 2021[2021.8.31]
如果侵权,请联系作者夏目浅石,立刻删除
相关文章:
C++真的是 C加加
📝个人主页:夏目浅石. 📌博客专栏:C的故事 🏠学习社区:夏目友人帐. 文章目录 前言Ⅰ. 函数重载0x00 重载规则0x01 函数重载的原理名字修饰 Ⅱ. 引用0x00 引用的概念0x01 引用和指针区分0x03 引用的本质0x04…...
java学习--day5 (java中的方法、break/continue关键字)
文章目录 day4作业今天的内容1.方法【重点】1.1为什么要有方法1.2其实已经见过方法1.3定义方法的语法格式1.3.1无参无返回值的方法1.3.2有参无返回值的方法1.3.3无参有返回值的方法1.3.4有参有返回值的方法 2.break和continue关键字2.1break;2.2continue; 3.案例关于方法的练习…...
MFC主框架和视类PreCreateWindow()函数学习
在VC生成的单文档应用程序中,主框架类和视类均具有PreCreateWindow函数; 从名字可知,可在此函数中添加一些代码,来控制窗口显示后的效果; 并且它有注释说明, Modify the Window class or styles here by…...
for forin forof forEach map区别
一、总结 相同点:都是串行遍历。不同点: 二、for of循环 设计目的:遍历所有数据结构的统一方法。原理:会调用数据结构的Symbol.iterator方法。 只要数据结构定义了Symbol.iterator属性,就能用for of遍历它的成员。…...
特殊时间(蓝桥杯)
特殊时间 问题描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 2022年2月22日22:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成…...
VUE路由与nodeJS环境搭建
VUE路由 Vue路由是Vue.js提供的路由管理工具,它允许我们在应用程序中实现页面之间的导航,从而使单页面应用程序的开发更加方便。通过Vue路由,我们可以轻松地创建和管理多个视图,并在这些视图之间导航。 Vue路由使用HTML5的Histo…...
抗锯齿的线
抗锯齿的线 右下角的时候h是0,到顶部 h是1,然后中间y相距4个像素,那dy就是0.25 如果让h abs(fract(h - 0.5) - 0.5) 中间一行0.5,第一行 第三行都是0.25,两端都是0 根据插值来看 这里是 如果用h/dy 那么第一行以上࿰…...
如何使用高压放大器驱动高容性负载
使用高压放大器驱动高容性负载是一个具有挑战性的任务,需要仔细考虑电路设计和操作技巧。下面西安安泰Aigtek将为您介绍一些关于如何使用高压放大器驱动高容性负载的方法和注意事项。 首先,让我们了解一下高容性负载。高容性负载通常指电容值较大的负载元…...
kubernetes集群证书过期启动失败问题解决方法
1、问题现象 执行kubectl命令异常报告 [rootk8s-master1 ~]# kubectl get node The connection to the server 192.168.227.131:6443 was refused - did you specify the right host or port? [rootk8s-master1 ~]# 查看etcd的日志,报错信息如下 {"level&…...
nvm使用的注意事项和常用命令。
nvm官网下载地址:nvm文档手册 - nvm是一个nodejs版本管理工具 - nvm中文网 (uihtm.com) 参考网址:(14 封私信 / 80 条消息) 如何通过 nvm 安装多版本 nodejs?npm 安装失败了怎么办? - 知乎 (zhihu.com) nvm目录下,修…...
代码大全阅读随笔(七)
循环控制 循环控制会出现什么样的错误,任何一种答案都可以归结到下面所说的问题之一:忽略或者错误的对循环执行初始化,忽略了对累加变量或者其他与循环有关变量执行初始化,不正确的嵌套,不正确的循环终止,忽…...
用户与权限管理
文章目录 用户与权限管理1. 用户管理1.1 MYSQL用户1.2 登录MySQL服务器1.3 创建用户1.4 修改用户1.5 删除用户1.6 修改密码1. 修改当前用户密码2. 修改其他用户密码 1.7 MYSQL8密码管理 2. 权限管理2.1 权限列表2.2 授予权限的原则2.3 授予权限2.4 查看权限2.5 收回权限 3. 权限…...
mysql集群使用nginx配置负载均衡
参考链接:https://mu-sl.com//archives/mysql%E9%9B%86%E7%BE%A4%E4%BD%BF%E7%94%A8nginx%E9%85%8D%E7%BD%AE%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1 配置文件nginx_tcp.conf 示例 load_module modules/ngx_stream_module.so;stream{upstream tcpssh{hash $remote_…...
蓝桥杯每日一题2023.9.21
蓝桥杯2021年第十二届省赛真题-异或数列 - C语言网 (dotcpp.com) 题目描述 Alice 和 Bob 正在玩一个异或数列的游戏。初始时,Alice 和 Bob 分别有一个整数 a 和 b,有一个给定的长度为 n 的公共数列 X1, X2, , Xn。 Alice 和 Bob 轮流操作࿰…...
知识联合——函数指针数组
前言:小伙伴们又见面啦,今天我们来讲解一个将函数,指针,数组这三个C语言大将整合在一起的知识——函数指针数组。同时来告诉小伙伴们我们上一篇文章的伏笔——函数指针的具体用法。 目录 一.什么是函数指针数组 二.函数指针数组…...
【Nginx26】Nginx学习:日志与镜像流量复制
Nginx学习:日志与镜像流量复制 总算到了日志模块,其实这个模块的指令之前我们就用过了,而且也是是非常常见的指令。相信这一块的学习大家应该不会有什么难度。另一个则是镜像功能,这个估计用过的同学就比较少了,不过也…...
Stability AI发布基于稳定扩散的音频生成模型Stable Audio
近日Stability AI推出了一款名为Stable Audio的尖端生成模型,该模型可以根据用户提供的文本提示来创建音乐。在NVIDIA A100 GPU上Stable Audio可以在一秒钟内以44.1 kHz的采样率产生95秒的立体声音频,与原始录音相比,该模型处理时间的大幅减少…...
华为OD机试 - 计算面积 - 逻辑分析(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…...
Ganache本地测试网+cpolar内网穿透实现公网访问内网
文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网:我们通常说的是互联网&am…...
【每日一题】ARC071D - ### | 前缀和 | 简单
题目内容 原题链接 给定一个长度为 n n n 的数组 a a a 和一个长度为 m m m 的数组 b b b 。 从数组 a a a 中挑出两个数,作为两条平行于 y y y 轴的直线,数组 b b b 中挑出两个数,作为两条平行于 x x x 轴的直线,问这四…...
(Vue2)VueRouter
VueRouter 修改地址栏路径时,切换显示匹配的组件 使用52: 1下载版本3.6.5(Vue3对应版本4.X) npm add vue-router3.6.5 2引入 import VueRouter from vue-router 3安装注册 Vue.use(VueRouter) 4创建路由对象 const route…...
6.文本注释方法
1.单行注释 在 LaTeX 中,可以使用 % 符号进行单行注释。 2.整段的注释 但如果要注释一整段文字,可以使用 comment 宏包或 \iffalse 和 \fi 命令来实现。 2.1 使用 comment 宏包 在导言区使用 \usepackage{comment} 命令加载 comment 宏包。然后&…...
[Linux打怪升级之路]-缓冲区
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习目标&…...
【力扣】13. 罗马数字转整数
题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符数值I1V5X10L50C100D500M1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X II 。 27 写…...
高效时间管理,事无巨细掌握——OmniFocus Pro 3 for Mac最强GTD工具
在快节奏的现代生活中,有效地管理和安排时间变得至关重要。如果您正在寻找一款功能强大的时间管理工具,那么OmniFocus Pro 3 for Mac将是您的最佳选择。作为一款专业的GTD(Getting Things Done)应用程序,它为您提供了一…...
解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 3( Slots )
5.4 Slots 我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props,但组件要如何接收模板内容呢?在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。Slots 可用于将Html内容从父组…...
接口测试之文件上传
在日常工作中,经常有上传文件功能的测试场景,因此,本文介绍两种主流编写上传文件接口测试脚本的方法。 首先,要知道文件上传的一般原理:客户端根据文件路径读取文件内容,将文件内容转换成二进制文件流的格…...
7.Flask-Migrate数据库迁移
基本介绍 flask-migrate是基于Alembic的一个封装,并集成到Flask中 所有的迁移操作其实都是Alembic做的,能跟踪模型的变化,并将变化映射到数据库中 一.安装 pip install flask-migrate二.基本使用 2.1初始化数据库迁移脚本 在Flask应用的根目录下,运行命令 flas…...
信创办公–基于WPS的PPT最佳实践系列 (项目8创建电子相册)
信创办公–基于WPS的PPT最佳实践系列 (项目8创建电子相册) 目录 应用背景操作步骤 应用背景 如果我们想把图片弄成相册,或者弄成一段有音乐的视频分享给朋友。我们可以利用PPT来制作。那我们如何用PPT制作电子相册或视频呢?可以跟…...
JRedis的基本操作,基本数据类型操作
Redis的基本数据类型: stringhashlistsetzset {public static void main(String[] args) {Jedis jedis new Jedis("127.0.0.1", 6379);// stringjedis.set("hello", "word");String hello jedis.get("hello");System.o…...
问鼎电子娱乐下载官方网站/seo百度推广
SDOUG简介 SDOUG会员项目(SDOUG MEMBERSHIP PROGRAM),又称为Oracle山东用户组,简称SDOUG,是由葛云杰、杨云龙、类延良等共同发起,旨在认可和表彰那些在SDOUG技术社区有贡献的人士。这些人的技术娴熟并且乐于分享他们的知识和经验。Oracle…...
学wordpress不需要学DW/seo项目
为了测试其中的 PROVISION 接口,利用了 System.Net.HttpWebRequest 类将《MISC系统短信SP接入指南-接口改造分册》文档中的示例 xml 发送到了 WEB 服务,并从 WEB 服务返回了对应的 Resp 包(也是一段 xml),下…...
营销型网站制作多少钱/推广如何做网上引流
0x00 为什么要学习分布式技术 在软件工程领域中,我们一直非常喜欢谈论各种加工问题,比如“高并发、高可用、高可靠”,或者是“容器化、微服务、异地多活”,相关的技术细节、框架选型,像一张网一样,让人眼花…...
英文网站建设电话咨询/哪里有seo排名优化
问题描述:eclipse在debug模式下,当鼠标移动到某个变量上面时不自动显示该变量对应的值。解决方法:在eclipse中点击 window->preferences->java->editor->hovers, 勾选variable values,(如果combined hover…...
哪个网站能看到学做标书/西安百度竞价托管公司
我们都知道,当您开始使用 Mac 时,一切都会完美运行且运行顺畅。您可以轻松找到所需的一切,而且您的 Mac 速度快如闪电。 但是,一旦您使用它一段时间,它就会变慢,变得杂乱无章,并且使用它不再有…...
网站开发开题报告范文/优化设计三年级上册答案
翻车 题目简介: 翻车 (rollover.cpp/c/pas)【问题描述】 有一天,小武找到了翻车王,给了他n个整数a1,a2,a3,…an,翻车王 需要选择其中的k个数,使得选出的k个数中任意两个的差都可以被m整除。 选出的数可以重复ÿ…...