【探索C++】C++对C语言的扩展

news2024/11/19 1:48:12
  • (꒪ꇴ꒪ ),Hello我是祐言QAQ
  • 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍
  • 快上🚘,一起学习,让我们成为一个强大的攻城狮!
  • 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,请在评论区指正,感谢🙏


一、 引用

1. 变量名         

        变量名本质上就是一段连续内存空间的名字,相当于一个标记,可以用变量名来申请并命名内存空间,可以借助变量名来使用这个空间。

int a = 10; // 声明一个整数变量a,分配内存空间

2. 引用的概念

        变量名本身为一块内存的引用,C++中的引用其实就是给一个已有的变量再取一个别名(alias)。

int x = 5; int &y = x; // 创建y作为x的引用

3. 语法格式

变量名
类型 &引用名 = 变量名

float f = 3.14;
//取别名的方式,给变量f取一个别名叫a
float &a = f;

4. 规则

        (1)引用没有定义,只是一种关系类型声明,所以不分配内存,声明它和原有某一变量的关系,所以类型要保持一致;

        (2)声明时必须初始化,一经声明,不可更改

        (3)可以对引用再次进行引用;

        (4)只有&前面有类型时,是引用,若没有类型,则是其他意思。

5. 引用作为函数参数

        普通引用在声明的时候必须用其他变量进行初始化,但是作为函数形参的时候,不需要进行初始化(因为这个初始化过程在函数调用的时候)实参给形参做初始化。

void func(int &a)
{
    cout << "a = " << a << endl;
}

6. 引用作为函数返回

        引用作为函数返回的时候,可以将这个函数作为赋值运算的左值(结果为赋值运算的值),需要保证函数返回的引用空间在函数退出的时候,没有被释放(全局变量,堆空间数据,静态局部变量,传入的指针数据)。

int &func(int &a)
{
    return a;
}

int main(int argc, char const *argv[])
{
    int a = 200;
    int b = func(a);
    //int b = func(a) = 300;  //可以作为左值
    cout << b << endl;
    
    return 0;
}

7. 引用的意义

        (1)在很多时候引用可以代替指针使用

        (2)引用在函数传参的使用中对于指针具有更好的可读性和实用性

8. 引用的本质         

        引用在C++中的内部实现是一个常指针:type &name <====> type * const name

        C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。 从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间,这是C++为了实用性而做出的细节隐藏。

9. 指针引用

void func1(int *&a)
{
    a[2] = a[0] + a[4];

}



int main(int argc, char const *argv[])
{
    int *p = new int[5]{10,20,30,40,50};
    
    func1(p);
    
    for (int i = 0; i < 5; ++i)
    {
        cout << p[i] << " ";
    }
    cout << endl;
    
    return 0;
}

10. const引用

const引用的特征

  • const引用有较多使用,它可以防止对象的值被随意更改。
  • const对象的引用必须是const的,将普通引用绑定到const对象是不合法的。
const int a = 20;
// int &b = a;    //不合法的
const int &b = a;
  • const引用可以使用相关类型的对象(常量,非同类型的变量或表达式)初始化,这个是const引用与普通引用最大的区别。
int &m = 20;    //不合法的
const int &m = 20;

(1)const引用的原理:        

        const引用的目的是禁止通过修改引用的值来改变被引用的对象。const引用的初始化特性较为微妙,可以看如下代码:

double d = 20.34;
const int &a = d;
double &b = d;

cout << a << " " << b << endl;
d = 23.34;
cout << a << " " << b << endl;

        输出结果为:

20 20.34
20 23.34

        实际上,const引用使用相关类型对象初始化时发生如下过程:

double d = 20.34;
const int &a = d;
//int tmp = d;
//const int &a = tmp;

二、 默认参数和占位参数

1. 默认参数

        通常情况下,函数在调用的时候,形参从实参那里取得值,对于多次调用同一函数同一实参时,C++给出了更简单的处理方法,给形参给默认值,这样就不用从实参哪里取值了。

默认参数规则:

        (1)只有参数列表的后面部分才可以提供默认参数(从右往左依次带默认参数)。

        (2)一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值。

//int add(int a = 10, int b, int c = 100)    //语法错误,不能跳着带默认参
//int add(int a = 10, int b, int c)    //语法错误,不能从左开始带默认参
int add(int a, int b, int c = 100)    //形参带默认参数
{
    return a+b+c;    
}


int main(int argc, char const *argv[])
{
    cout << add(10, 20, 30) << endl;
    
    return 0;
}

2. 占位参数

        占位参数只有类型声明,没有参数名声明。占位参数在函数里面不能使用,为了以后函数做拓展留下线索。

/占位参数在函数里面能不能使用?不能使用
//占位参数为了以后函数做拓展留下线索
int add(int a, int b, int c, int = 0)    //形参带占位参数,占位参数还带有默认参数
{
    
    return a+b+c;
}

//int add(int a, int b, int = 0, int c = 0)
//占位参数,占位参数可以跟默认参数一起结合使用,前提是默认参要从右到左依次赋值

//int add(int a, int b, int, int c)
//占位参数可以放在任意位置



int main(int argc, char const *argv[])
{
    cout << add(10, 20, 30, 40) << endl;
    
    return 0;
}

三、C++函数重载

1. 函数重载

        函数重载是C++中一种允许你使用相同的函数名定义多个不同参数列表的函数的机制。函数重载的规则如下:

  • 函数名相同;
  • 参数列表不同,可以通过参数个数、参数类型和参数顺序的不同来区分;
  • 返回类型不同的函数不能构成重载。

以下是一些函数重载的示例(这些函数都具有相同的名称func,但参数列表不同,因此构成了函数重载):

        void func(int a) {}

        void func(float f) {}

        void func(int a, float f) {}

        void func(float a, float f) {}

        void func(float a, int f) {}

        void func(double a, char f) {}

        void func(float a, char f, int m) {}

        int func(char a, char f) {}

2. 调用准则

        当调用重载函数时,编译器会根据传递的参数选择最匹配的函数。它会按照以下准则来寻找可行的候选函数:

        (1)严格匹配,找到则调用;

        (2)通过隐式类型转换技术寻找匹配的函数,找到则调用;

        (3)一个函数不能即做重载,又作默认参数的函数,当你少写一个参数时,系统无法确认是重载函数默认参数。

3. 函数重载与函数指针结合

        函数指针可以指向不同参数列表的函数,但在赋值时要注意确保参数匹配。示例:

typedef void (*FUNC1)(int, int, int);
typedef void (*FUNC2)(int, int);

int main() {
    FUNC1 p1 = func; // 调用func(int, int, int)
    FUNC2 p2 = func; // 调用func(int, int)
    
    p1(10, 20, 30);
    p2(10, 20);
    
    return 0;
}

4. 函数重载总结

        函数重载是C++中的一种强大机制,它允许定义多个具有相同名称但参数列表不同的函数。以下是一些函数重载的总结:

  • 函数名相同,参数列表不同即可构成重载;
  • 函数返回值不能作为函数重载的依据;
  • 编译器根据传递的参数选择最匹配的函数。

四、运算符重载

        运算符重载是C++中另一个强大的特性,它允许你自定义数据类型的运算符行为。通过运算符重载,你可以使自定义类型像内置类型一样参与各种运算。

1. 运算符重载的基本原理

        运算符重载的基本原理是为自定义类型定义与运算符相关的函数。例如,如果你想要为自定义的Complex类实现+运算符,可以这样做:

class Complex {
public:
    Complex operator+(const Complex& other) {
        Complex result;
        result.real = this->real + other.real;
        result.imag = this->imag + other.imag;
        return result;
    }
private:
    double real;
    double imag;
};

2. 运算符重载的示例

class Complex {
public:
    Complex operator+(const Complex& other) {
        Complex result;
        result.real = this->real + other.real;
        result.imag = this->imag + other.imag;
        return result;
    }
    
    bool operator==(const Complex& other) {
        return (this->real == other.real) && (this->imag == other.imag);
    }
    
    Complex operator*(const Complex& other) {
        Complex result;
        result.real = this->real * other.real - this->imag * other.imag;
        result.imag = this->real * other.imag + this->imag * other.real;
        return result;
    }
    
    // 其他运算符重载也可以类似定义
private:
    double real;
    double imag;
};

3. 运算符重载的使用

        运算符重载使自定义类型的对象可以像内置类型一样使用运算符。例如:

Complex c1(1.0, 2.0);
Complex c2(3.0, 4.0);
Complex c3 = c1 + c2; // 使用+运算符重载
bool isEqual = (c1 == c2); // 使用==运算符重载
Complex c4 = c1 * c2; // 使用*运算符重载

五、命名空间

1.概念

        所谓namespace,是指标识符的各种可见范围,C++标准程序库当中所有的标识符都被定义在一个名为std的namespace中。

(1)<iostream>和<iostream.h>

        格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的,后缀为.h的头文件C++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h的后缀文件里,C++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h,因此:

        当<iostream.h>使用时,相当于在C中调用库函数,使用的是全局命名空间;

        当<iostream>使用时,该文件没有定义全局命名空间,必须使用using namespace std;这样才能正确使用cin,cout。

(2)由于namespace的概念,使用C++标准程序库中的任何标识符是,可以有三种选择:

用法1:在用的时候加上std:: 比较麻烦

        int a; std::cin >> a; // std::cout << a << std::endl; //

用法2:用的时候打开一部分,建议用的,安全性,命名空间的污染度不高

        using std::cin; using std::cout; using std::endl;

用法3:直接打开全部的,不安全,容易造成命名空间污染,出现重复定义,多次引用,解释如下:

        using namespace std;

        因为标准库非常的庞大,所以程序员在选择的类的名称或函数名 时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问 题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。所以就有了<iostream.h> 和<iostream>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"

2. C++命名空间定义以及使用方法


        在C++中,名称可以是符号常量,变量,宏,函数,枚举,类和对象等等,为了避免在大规模程序的设计中,以及在程序员在使用各种的C++库时,这些标识符的命名发生冲突。
        标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。
        std是C++标准命名空间,C++标准程序库中所有标识符都被定义在std中,比如标准库中的类iostream、vector、map等都定义在该命名空间中,使用时要加上using声明(using namespace std)或者using指示(using std::cin using std::cout using std::endl using std::vector<int>  std::map<int, string>...)

C中的命名空间:
        在C语言中只有一个命名空间,全局作用域
        C语言中所有的全局标识符共享同一个作用域
        标识符之间可能发生冲突
C++中的命名空间:
        命名空间将全局作用域分成不同的部分
        不同命名空间中的标识符可以同名而且不会发生冲突
        命名空间可以相互嵌套
        全局作用域也叫做默认命名空间

(1)C++命名空间的定义
namespace name {...}
namespace {...}        //匿名命名空间,里面的内容只能在当前文件使用
(2)C++命名空间的使用
namespace A{int n;}
1、直接全部(打开)放出来       using namespace A;
2、只打开一部分                using A::n;
3、用到谁就使用谁              A::n;

namespace {int n}
使用默认匿名空间里面的变量      ::n
默认情况下,可以直接使用默认命名空间里面的所有标识符

3. C++命名空间代码实现

#include <iostream>

using namespace std;

namespace A
{
    int a;
}

namespace B
{    
    int a;
    int b;
    int c;
    namespace C     //可以嵌套命名空间
    {
        char name[20];
    }
    struct Stu         //可以嵌套结构体
    {
        int num;
    }d;
    void func(){cout << "123456" << endl;}        //可以嵌套函数
}

namespace     //匿名命名空间,简单点来讲就是全局命名空间
{
    int a;
    int b;
}

namespace     //匿名命名空间可以定义两个,但是里面不用出现相同的标识符
{    
    int d;    
}

//1、直接全部打开,全部裸露出来,但是会造成命名空间污染,不建议
// using namespace B;
// using namespace B::C;

//2、只放出一部分
using B::c;
// using B::C::name;

int main(int argc, char const *argv[])
{
    a = 200;    //默认情况下,可以直接使用默认命名空间里面的所有标识符
    cout << "a = " << a << endl;
    
    ::b = 300;    //使用匿名命名空间里面的标识符
    cout << "b = " << ::b <<  endl;
    
    c = 300;
    cout << "c = " << c << endl;
    
    //3、直接用命名空间::成员名
    B::func();
    
    cin >> B::C::name;
    cout << B::C::name << endl;
        
    return 0;
}

4. 总结

        引入命名空间:在使用某个命名空间中的成员之前,通常需要引入该命名空间。可以使用 using namespace name 来引入整个命名空间,也可以使用 using name::member 来引入特定的成员。

        命名空间的使用:在C++中,<iostream>等标准库头文件通常没有定义在全局命名空间中,因此使用其中的成员时,需要使用 using namespace std; 或者在使用时前缀以 std::,例如 std::cout

        头文件命名规范:为了与C语言区分开,C++标准规定头文件不使用后缀 .h,而是直接使用不带后缀的文件名。

        命名空间的定义:命名空间的定义使用 namespace name {...} 的形式,其中 name 是命名空间的名称,而 {...} 内包含了该命名空间的成员。

        命名空间的嵌套:C++允许嵌套命名空间,这意味着你可以在一个命名空间内再定义另一个命名空间,从而更好地组织和管理代码。

        命名空间是C++中用于避免命名冲突和组织代码的有用工具,它有助于将代码模块化,使代码更具可维护性和可读性。熟练掌握命名空间的使用是C++编程的重要一步。

六、内敛函数

        C++提供了内联函数(inline functions)这一重要特性,它可以帮助程序员优化代码执行效率,减少函数调用的开销。本文将详细介绍内联函数的特点、使用场景以及与宏替换的区别,帮助你更好地理解和利用这一功能,从而实现了真正的内嵌

#include <iostream>

using namespace std;

inline void func(int a)    //内敛函数   
{
    cout << "a = " << a << endl;
}

int main(int argc, char const *argv[])
{
    func(100);    //调用函数有 保护现场 和 恢复现场 这两个过程
    // {
    //     cout << "a = " << a << endl;
    // }
    
    return 0;
}

1.内联函数特点

        (1)内联函数使用 inline 关键字声明,通常与函数定义结合在一起;
        (2)内联函数的代码被编译器直接插入到函数调用的地方,类似于宏替换,减少了函数调用的开销;
        (3)内联函数具有普通函数的特征,包括参数检查和返回类型。


2. 内联函数的优点

        (1)提高程序运行效率,减少了函数调用时的入栈和出栈操作;
        (2)内联函数可以作为类的成员函数,可以访问所在类的保护成员和私有成员。


3. 内联函数的限制

        (1)内联函数的函数体应该相对较小,避免过于复杂的代码;
        (2)不适合包含循环或大量条件判断的函数体;
        (3)不能对内联函数进行取址操作。


4.内联函数与宏替换的区别

        (1)内联在编绎时展开,宏在预编译时展开。 展开的时间不同。

        (2)编译内联函数可以嵌入到目标代码,宏只是简单文本替换。

        (3)内联会做类型,语法检查,而宏不具这样功能。

        (4)宏不是函数,inline函数是函数

        (5)宏定义小心处理宏参数(一般参数要括号起来),否则易出现二义性,而内联定义不会出现。

#include <iostream>

using namespace std;

#define SQ(x) ((x)*(x))

inline int sq(int x)
{
    return x*x;
}


int main(int argc, char const *argv[])
{
    int i = 0;
    for (int i = 0; i < 5; ++i)
    {
        // cout << sq(i+1) << endl;//1 4 9 16 25
        cout << SQ(i+1) << endl;// 1 4 9 16 25
    }
    
    return 0;
}


5.适用场景

        (1)内联函数适用于函数体相对简单且被频繁调用的情况;
        (2)当函数体较大或包含复杂的逻辑时,内联可能不会带来明显的性能提升;
        内联函数是C++中一种用于提高程序性能的重要技术,但需要注意适用场景和代码复杂度,以充分发挥其优势。熟练使用内联函数可以有效地减少函数调用带来的开销,提高程序的运行效率。

七、C++头文件和extern "C"

(1)标准C++的头文件引用

#include //C++的标准输入输出头文件

(2)如果要在C++程序里面用标准C的头文件

//#include <stdio.h>
//#include <stdlib.h>
#include  <cstdio>
#include  <cstdlib>

        注意:不是所有的.h的头文件都是以c开头,去.h尾。

(3)使用C语言的相关函数的时候,头文件的引用方式

extern "C"
{
    #include <sys/types.h>    
    #include <sys/stat.h>      
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
}

        写一个练习吧:设计一个计算圆柱体体积的函数,表面积函数,P值和圆柱体的高都有默认参数。

#include <iostream>

using namespace std;

void func1(int r, int h = 10, float PI = 3.14)	//计算圆柱体体积
{
	cout << "圆柱体的体积:" << r*r*PI*h << endl;
}

void func2(int r, int h = 10, float PI = 3.14)	//计算圆柱体表面积
{
	cout << "圆柱体的表面积:" << (2*r*r*PI)+(2*PI*r*h) << endl;
}

int main(int argc, char const *argv[])
{
	cout << "输入圆柱体的半径跟高" << endl;
	int r, h;
	cin >> r >> h;
	if (h > 0)
	{
		func1(r, h);
		func2(r, h);
	}
	else
	{
		func1(r);
		func2(r);
	}

	return 0;
}

        更多C/C++语言Linux系统数据结构ARM板实战相关文章,关注专栏:

   手撕C语言

            玩转linux

                    脚踢数据结构

                            系统、网络编程

                                     探索C++

                                             6818(ARM)开发板实战

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉🎉🎉感谢关注🎉🎉🎉

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

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

相关文章

30.链表练习题(1)(王道2023数据结构2.3.7节1-8题)

【前面使用的所有链表的定义在第29节】 试题1&#xff1a; 设计一个递归算法&#xff0c;删除不带头结点的单链表L中所有值为x的结点。 首先来看非递归算法&#xff0c;暴力遍历&#xff1a; int Del(LinkList &L,ElemType x){ //此函数实现删除链表中为x的元素LNode *…

oracle分组排序取第一条数据

row_number()over(partition by 分组字段 order by 排序字段) 例&#xff1a;select * from ( select id,dealer_name,row_number()over(partition by dealer_name order by create_time ) r from mr) where r1

欧盟对中反补贴引发恐慌 | 百能云芯

中德汽车产业链紧密交织&#xff0c;欧盟对中国电动汽车反补贴的调查可能对欧洲本土产业造成负面影响。欧盟计划到2035年停售非零碳排放汽车&#xff0c;这为中国电动汽车在欧洲市场寻求机会提供了契机&#xff0c;但中国电动车的快速崛起引发了国际社会的警惕。 欧盟委员会主席…

在比特币上使用可检索性证明支付存储费用

我们为用户开发了一种为云存储付费的新方法。 与亚马逊的 S3 等传统云存储相比&#xff0c;用户不必信任服务器。 我们使用比特币智能合约来确保支付取决于服务器的可检索性证明 (PoR)&#xff0c;该证明只能在数据仍然可用且需要时可以检索的情况下生成。 可检索性证明 (PoR)…

WireShark抓包分析TCP三次握手过程,TCP报文解析

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 使用WireShark工具抓取TCP协议三次握手的数据包&am…

06-数据库检索:如何使用B-树对海量磁盘数据建立索引?

06-数据库检索&#xff1a;如何使用B-树对海量磁盘数据建立索引&#xff1f; 你好&#xff0c;我是陈东。 在基础篇中&#xff0c;我们学习了许多和检索相关的数据结构和技术。但是在大规模的数据环境下&#xff0c;这些技术的应用往往会遇到一些问题&#xff0c;比如说&…

CGAL安装到验证到深入

1、安装CGAL Win10下VS配置CGAL-5.3.1&#xff08;下载、安装、VS属性表配置&#xff09; 测试代码_cgal下载_孙 悟 空的博客-CSDN博客 2、CGAL验证练习 #include <iostream> #include <CGAL/Simple_cartesian.h> typedef CGAL::Simple_cartesian<double> …

800多个看图猜电视剧的含图的ACCESS\EXCEL数据库

虽然说看图猜什么是去年流行的一种手机游戏&#xff0c;但是这种游戏放置在任何年代都算是一种趣味之一&#xff0c;而今天看到一个800多的电视载图猜电视剧的内容&#xff0c;因此就弄下来&#xff0c;毕竟这种数据是永不过期的。 其实&#xff0c;实现迷惑字很简单&#xff0…

柔和舒适的瑜伽垫,设计时尚两面可用

日常健身的时候&#xff0c;瑜伽垫是个很实用的工具&#xff0c;可以大大提升健身时的舒适性&#xff0c;不过在选择瑜伽垫的时候也要注意质量&#xff0c;特别是像厚度、弹力、异味之类的细节&#xff0c;对平时使用的影响都很大。 目前我用的是一款莫比 联名扭蛋兔瑜伽垫&…

2023年前端面试真题之CSS篇

人的一生&#xff0c;总是难免有浮沉。不会永远如旭日东升&#xff0c;也不会永远痛苦潦倒。反复地一浮一沉&#xff0c;对于一个人来说&#xff0c;正是磨练。因此&#xff0c;浮在上面的&#xff0c;不必骄傲&#xff1b;沉在底下的&#xff0c;更用不着悲观。必须以率直、谦…

Knife4jInsight 1.0.0 MVP 版本发布

Knife4jInsight 1.0.0 MVP 版本发布 前言系统用户平台特性主要功能后期计划的功能 平台管理OpenAPI数据源接口文档自动i18n,支持中英双语微服务OpenAPI规范数据源自动注册上报整合开源swagger-ui组件&#xff0c;平台中可进行OpenAPI规范接口设计打通开源注册中心(Nacos\Eureka…

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》许少辉校友——2023学生开学季辉少许

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》许少辉校友——2023学生开学季辉少许

SpringCloud Alibaba - Sentinel

接上文SpringCloud Alibaba - Nacos 1.Sentinel 流量防卫兵 1.1 安装与部署 和Nacos一样&#xff0c;它是独立安装和部署的&#xff0c;下载地址https://github.com/alibaba/Sentinel/releases 下载后的jar放到目录 然后配置 启动并访问,用户名密码都是 sentinel 此时就…

ISP技术概述

原本或许是为了对冲手机系统和APP设计无力感而诞生的拍照功能,现今却成为了众手机厂家除背部设计外为数不多可“卷”的地方,自拍、全景、夜景、小视频等旺盛的需求让这一技术的江湖地位迅速变化。对圈内人士而言,这一波变化带来的后摄、双摄、多摄、暗光、防抖、广角、长焦、…

软件定制开发具有以下特点|APP搭建|小程序

软件定制开发具有以下特点|APP定制|小程序 一、快速响应用户需求 软件定制开发的优势在于&#xff0c;它可以快速响应用户的需求&#xff0c;因为它是在现有软件的基础上进行功能定制、界面定制、服务定制等改造&#xff0c;而不是从零开始进行重新设计与开发&#xff0c;所以…

Spring MVC 请求参数绑定

文章目录 默认⽀持 Servlet API 作为⽅法参数绑定简单类型参数绑定Pojo类型参数绑定⽇期类型参数&#xff08;需要配置⾃定义类型转换器&#xff09;路径变量参数 Spring MVC 是一个用于构建 Web 应用程序的框架&#xff0c;它提供了一种方便的方式来处理 HTTP 请求和响应。在 …

【java】【SpringBoot】【三】开发实用篇 基于SpringBoot整合任意第三方技术

目录 一、热部署 1、手动启动热部署 2、自动启动热部署 3、热部署范围配置 4、关闭热部署 二、配置高级 1、ConfigurationProperties 2、宽松绑定/松散绑定 3、常用计量单位绑定 4、数据校验 三、测试 1、加载测试专用属性 2、加载测试专用配置 3、web环境模拟测…

Delft3D水动力与泥沙运动模拟教程

详情点击公众号链接&#xff1a;Delft3D水动力与泥沙运动模拟教程 前沿 1.Delft3D水动力&#xff0d;泥沙模型的基本原理&#xff1b; 2.Delft3D模型正价曲线网格和边界条件构建方法&#xff1b; 3.Delft3D模型水动力及泥沙模块使用方法&#xff1b; 4.Delft3D模型泥沙运动…

数据库----- 数据库高级

1.2 多表查询分类 将多个表的数据横向的联合起来。 1、 内连接 2、 外连接 a) 左外连接 b) 右外连接 3、 交叉连接 4、 自然连接 1.2.1 内连接【inner join】 语法一&#xff1a;select 列名 from 表1 inner join 表2 on 表1.公共字段表2.公共字段语法二&#xff1a;select …

PMP考试如何报名?麻烦吗?

还是比较麻烦的&#xff0c;PMP考试不是国内的考试&#xff0c;要报两次名&#xff0c;报名条件也很严格&#xff0c;PMP考试报名需要先在PMI网站进行英文报名&#xff0c;英文报名成功后才能在中国国际人才交流基金会网站进行中文报名&#xff0c;具体说明如下。 一、PMP考试…