当前位置: 首页 > news >正文

网站制作大概费用网站做外链好嘛

网站制作大概费用,网站做外链好嘛,建设政务网站,便宜网站建设成都文章目录 请添加图片描述 [TOC](文章目录) #x1f4dd;引用# #x1f320;引用概念**引用**不是新定义一个变量#xff0c;而是给**已存在变量取了一个别名**#xff0c;编译器不会为引用变量开辟内存空间#xff0c;它和它引用的变量共用同一块内存空间。定义#… 文章目录 请添加图片描述 [TOC](文章目录) 引用# 引用概念**引用**不是新定义一个变量而是给**已存在变量取了一个别名**编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。定义**类型引用变量名(对象名) 引用实体**例如以下代码在变量名前加一个意思是一个引用类型b是a的别名也就是a有了一个外号但还是a本身cppint a 70;int b a; //引用b是a的别名我们接下来看看引用后的地址是否会发生改变例如以下例子cppint main(){ int a 70; int b a; //引用b是a的别名 int c a; //引用c是a的别名 c 80; cout a endl; cout a endl; cout b endl; cout c endl; return 0;}代码运行图在这个代码中定义了一个变量a为70int b a; 这里b是a的引用给a取了一个外号bint c a; 这里c是a的引用又给a取了一个外号是c因此我们对c还是对b进行修改a都会发生改变这是因为**编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间**。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/039ecfab596d41869ff8a7c90e52e714.png)注意**引用类型必须和引用实体是同种类型的**## 引用特性1. 引用**必须在定义时初始化**:引用必须在定义时初始化,不能在之后单独为它赋值。cppint a 10; int ra a; // 正确,ra初始化为aint ra; // 错误,引用必须在定义时初始化2. 一个变量可以有多个引用cppint a 10;int ref1 a; int ref2 a;ref1; // a的值变为11cout a endl; // 输出11ref2--; // a的值变为10cout a endl; // 输出103. 引用一旦引用一个实体再不能引用其他实体引用本质上**就是给原变量添加一个别名,它的内存地址就是原变量的地址**。所以对引用赋值或修改,实际上就是修改原变量。而指针不同,指针可以改变指向的对象:**一级指针**可以改变指向,如p可以从指向a改为指向其他变量**二级指针**可以改变一级指针指向的地址,如pp可以改变p指向的地址而引用更像一个const指针:定义后不能改变指向的对象,就像const指针定义后不能改变指向但可以通过这个“const指针”来修改原对象,就像通过const指针可以修改原对象cppint a 10;int b 20;int ref a; ref b; // 错误!引用ref已经引用a,不能再引用bcout ref endl; // 输出10,ref依然引用a如图ref引用了a这里的值发生改变是因为b赋值给了ref![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/09c2a3f2dc534036b45f7eef60d8744d.png)# 使用场景## 做参数传值与传地址当引用用来做参数时将会对代码进行大大的优化并且具有可读性如当我们看了很多遍的交换了两个数的函数cppvoid Swap(int* a, int* b){ int tmp *a; *a *b; *b tmp;}int main(){ int ra 88; int rb 99; Swap(ra, rb); return 0;}形参是实参的一份临时拷贝所以如果想交换需要传地址不能传值。cppvoid Swap(int a, int b){ int tmp a; a b; b tmp;}int main(){ int ra 88; int rb 99; Swap(ra, rb); return 0;}a和b分别是ra和rb的别名当你调换a和b的纸时其实是修改了ra和rb的地址的值这样的好处就是当你看代码时引用a和b给人一种感觉,就是操作ra和rb本身。这隐藏了底层是通过地址操作原变量ra和rb的实现细节。从使用者的角度看,代码读起来就像直接交换ra和rb,而不是通过**复杂的地址操作实现**。这里使用了引用挺好的不用担心指针的解引用地址相关操作但是前面我们知道引用一旦指向一个实体就无法改变指向例如**有关链表操作**当我们要删除一个节点是不是要改变前面节点的指针让他指向后面节点而引用恰恰不能改变因此**引用也不是完全替代指针的**![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d4134e1aec26472892b5035f8f74c7fe.png)回归正题这里还有一个小注意点作用域的不同因此在Swap函数里取别的名字都可以任由发挥结果都相同。cppvoid Swap(int x, int x){ int tmp x; x y; y tmp;}int main(){ int ra 88; int rb 99; Swap(ra, rb); return 0;}## 传值、传引用效率比较**以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。**cpp#include time.hstruct A { int a[10000]; };void TestFunc1(A a) {}void TestFunc2(A a) {}void TestRefAndValue(){ A a; // 以值作为函数参数 size_t begin1 clock(); for (size_t i 0; i 10000; i) TestFunc1(a); size_t end1 clock(); // 以引用作为函数参数 size_t begin2 clock(); for (size_t i 0; i 10000; i) TestFunc2(a); size_t end2 clock(); // 分别计算两个函数运行结束后的时间 cout TestFunc1(A)-time: end1 - begin1 endl; cout TestFunc2(A)-time: end2 - begin2 endl;}int main(){ TestRefAndValue(); return 0;}**按值传递(TestFunc1):**调用TestFunc1(a)时,会将a进行拷贝,生成一个临时对象**a_copy**。**a_copy**作为参数传递给TestFunc1。TestFunc1内部操作的实际上是a_copy,对a_copy的修改不会影响实参a。TestFunc1返回时,临时对象a_copy会被销毁。TestFunc1以值方式传递结构体A作为参数。这会导致每次调用都会对A进行值拷贝,对于一个包含10000个int成员的大结构体,拷贝开销很大。**按引用传递(TestFunc2):**调用TestFunc2(a)时,不会进行值拷贝,直接传递a的引用。TestFunc2内部操作的仍然是实参a本身。TestFunc2返回时,不需要销毁任何对象。TestFunc2以引用方式传递A。这种方式下,函数内直接操作的就是实参a本身,不会有任何拷贝开销。总结TestFunc1值传递,效率低是因为值拷贝开销大TestFunc2引用传递,效率高是因为避免了值拷贝直接操作的就是实参a本身![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cea37fd6819d40059d37965342ee3719.png)通过上述代码的比较**发现传值和指针在作为传参以及返回值类型上效率相差很大**。# 引用做返回值cppint Count(){static int n 0;n;// ...return n;}我们先看看下面代码会输出什么结果cppint Add(int a, int b){int c a b;return c;}int main(){int ret Add(1, 2);Add(3, 4);cout Add(1, 2) is : ret endl;return 0;}在Vs编译运行图结果是**7**真的是正确吗![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fe90c7c1ead24f92b1fd7df0a2186064.png)问题分析**如果函数返回时,返回的对象已经超出了函数作用域(即已经被销毁),那么不能返回该对象的引用,必须返回值。**在第一个示例中:cppint Add(int a, int b){int c a b;return c;}这里函数返回了局部变量c的引用,但c在函数返回后就已经被销毁了,所以这是一个**未定义行为**,输出结果是**不确定**的。而在第二个示例中:cppint Add(int a, int b){int c a b;return c;}int main(){int ret Add(1, 2);Add(3, 4);cout Add(1, 2) is : ret endl;return 0;}这里同样是返回了局部变量c的引用,但是在main函数中又调用了一次Add函数,这时第一次调用返回的引用ret已经指向了一个不存在的对象,所以输出结果也是未定义的。函数返回引用时必须确保返回的对象在调用者作用域内仍然存在,否则就会产生未定义行为。这是C中函数返回引用需要特别注意的地方。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/921cb60c97c3413da342531e41f3a314.png)答案思考在Visual Studio上运行这段代码,输出结果是:Add(1, 2) is :7这个结果确实是**未定义**行为,但在某些情况下可能会输出7。之所以会出现这种情况,是因为**Visual Studio的编译器在处理这种未定义行为时可能会做一些特殊的优化或处理**,导致在某些环境下能够得到一个**看似合理**的结果。但这种行为是**不可靠**的,因为它依赖于具体的编译器实现细节。在不同的编译器或环境下,输出可能会完全不同。**正确的做法**是要么返回值,要么返回一个在调用者作用域内仍然存在的对象的引用。这样可以确保代码的行为是可预测和可移植的。## 引用和指针的区别1. **语法概念**:- **引用**是变量的别名,没有独立的存储空间,而是和其引用的实体共用同一块内存空间。- **指针**是一个独立的变量,存储了另一个变量的内存地址。2. **声明语法**:- 引用使用符号声明,如int ref x;- 指针使用*符号声明,如int* ptr x;3. **操作方式**:- 引用直接访问和操作其引用的实体,如ref 10;- 指针需要先解引用(*)才能访问其指向的实体,如*ptr 10;4. **Null值**:- 引用不能为空(Null),必须在声明时初始化为一个有效的实体。- 指针可以为空(Null),指向空地址0x0。让我们看看例子来说明引用和指针的区别:假设我们有一个整型变量x值为10。**使用引用:**cppint x 10;int ref x; // 声明引用ref,它是x的别名ref 20; // 通过ref修改x的值cout x x endl; // 输出 x 20ref是x的引用,它们共享同一块内存空间。通过ref修改值,实际上是在修改x的值。 输出x的值为20,因为x的值已经被修改了。**使用指针:**cppint x 10;int* ptr x; // 声明指针ptr,存储x的地址*ptr 20; // 通过ptr解引用并修改x的值cout x x endl; // 输出 x 20ptr是一个指向x的指针,存储了x的内存地址。通过*ptr解引用并修改值,实际上是在修改x的值。输出x的值为20,因为x的值已经被修改了。在**底层实现**上实际是有空间的因为**引用是按照指针方式来实现的**。cppint main(){ int a 10; int ra a; ra 20; int* pa a; *pa 20; return 0;}我们来看下引用和指针的汇编代码对比得出在汇编中**引用**的底层逻辑还是**指针**经过编译转换成汇编还是进行指针的操作![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/be0e447bf42344f2a653f8ca2108e349.png)引用和指针的不同点:1. **引用概念上定义一个变量的别名指针存储一个变量地址**。2. **引用在定义时必须初始化指针没有要求**3. **引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何一个同类型实体**4. **没有NULL引用但有NULL指针**5. 在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32位平台下占4个字节)6. **引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小**7. **有多级指针但是没有多级引用**8. **访问实体方式不同指针需要显式解引用引用编译器自己处理**9. **引用比指针使用起来相对更安全**# 常引用从上述代码中,我们可以得出以下关于常引用的结论:1. **常量引用**:cppconst int a 10;//int ra a; // 该语句编译时会出错a为常量const int ra a;对于常量对象a,我们可以使用常引用const int ra a;来引用它。这样做可以避免对常量进行修改直接使用非常引用int ra a;会在编译时报错,因为不允许对常量进行非常引用。2. **字面量常引用**:cpp// int b 10; // 该语句编译时会出错b为常量const int b 10;我们可以使用常引用const int b 10;来引用字面量常量。这样做可以避免创建临时变量 直接使用非常引用int b 10;会在编译时报错,因为字面量不能被非常引用。3. **类型不匹配的常引用**:cppdouble d 12.34;//int rd d; // 该语句编译时会出错类型不同const int rd d;根据类型不同的变量,如double d 12.34;,我们可以使用常引用const int rd d;来引用它直接使用非常引用int rd d;会在编译时报错,因为类型不匹配。---# 总结![请添加图片描述](https://img-blog.csdnimg.cn/9d50bf7913d741e98c8220ede56599d1.gif) 引用# 引用概念引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。定义类型引用变量名(对象名) 引用实体例如以下代码在变量名前加一个意思是一个引用类型b是a的别名也就是a有了一个外号但还是a本身cppint a 70;int b a; //引用b是a的别名我们接下来看看引用后的地址是否会发生改变例如以下例子cppint main(){ int a 70; int b a; //引用b是a的别名 int c a; //引用c是a的别名 c 80; cout a endl; cout a endl; cout b endl; cout c endl; return 0;}代码运行图在这个代码中定义了一个变量a为70int b a; 这里b是a的引用给a取了一个外号bint c a; 这里c是a的引用又给a取了一个外号是c因此我们对c还是对b进行修改a都会发生改变这是因为编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。注意引用类型必须和引用实体是同种类型的## 引用特性1. 引用必须在定义时初始化:引用必须在定义时初始化,不能在之后单独为它赋值。cppint a 10; int ra a; // 正确,ra初始化为aint ra; // 错误,引用必须在定义时初始化2. 一个变量可以有多个引用cppint a 10;int ref1 a; int ref2 a;ref1; // a的值变为11cout a endl; // 输出11ref2--; // a的值变为10cout a endl; // 输出103. 引用一旦引用一个实体再不能引用其他实体引用本质上就是给原变量添加一个别名,它的内存地址就是原变量的地址。所以对引用赋值或修改,实际上就是修改原变量。而指针不同,指针可以改变指向的对象:一级指针可以改变指向,如p可以从指向a改为指向其他变量二级指针可以改变一级指针指向的地址,如pp可以改变p指向的地址而引用更像一个const指针:定义后不能改变指向的对象,就像const指针定义后不能改变指向但可以通过这个“const指针”来修改原对象,就像通过const指针可以修改原对象cppint a 10;int b 20;int ref a; ref b; // 错误!引用ref已经引用a,不能再引用bcout ref endl; // 输出10,ref依然引用a如图ref引用了a这里的值发生改变是因为b赋值给了ref# 使用场景## 做参数传值与传地址当引用用来做参数时将会对代码进行大大的优化并且具有可读性如当我们看了很多遍的交换了两个数的函数cppvoid Swap(int* a, int* b){ int tmp *a; *a *b; *b tmp;}int main(){ int ra 88; int rb 99; Swap(ra, rb); return 0;}形参是实参的一份临时拷贝所以如果想交换需要传地址不能传值。cppvoid Swap(int a, int b){ int tmp a; a b; b tmp;}int main(){ int ra 88; int rb 99; Swap(ra, rb); return 0;}a和b分别是ra和rb的别名当你调换a和b的纸时其实是修改了ra和rb的地址的值这样的好处就是当你看代码时引用a和b给人一种感觉,就是操作ra和rb本身。这隐藏了底层是通过地址操作原变量ra和rb的实现细节。从使用者的角度看,代码读起来就像直接交换ra和rb,而不是通过**复杂的地址操作实现**。这里使用了引用挺好的不用担心指针的解引用地址相关操作但是前面我们知道引用一旦指向一个实体就无法改变指向例如**有关链表操作**当我们要删除一个节点是不是要改变前面节点的指针让他指向后面节点而引用恰恰不能改变因此**引用也不是完全替代指针的**![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d4134e1aec26472892b5035f8f74c7fe.png)回归正题这里还有一个小注意点作用域的不同因此在Swap函数里取别的名字都可以任由发挥结果都相同。cppvoid Swap(int x, int x){ int tmp x; x y; y tmp;}int main(){ int ra 88; int rb 99; Swap(ra, rb); return 0;}## 传值、传引用效率比较**以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。**cpp#include time.hstruct A { int a[10000]; };void TestFunc1(A a) {}void TestFunc2(A a) {}void TestRefAndValue(){ A a; // 以值作为函数参数 size_t begin1 clock(); for (size_t i 0; i 10000; i) TestFunc1(a); size_t end1 clock(); // 以引用作为函数参数 size_t begin2 clock(); for (size_t i 0; i 10000; i) TestFunc2(a); size_t end2 clock(); // 分别计算两个函数运行结束后的时间 cout “TestFunc1(A)-time:” end1 - begin1 endl; cout “TestFunc2(A)-time:” end2 - begin2 endl;}int main(){ TestRefAndValue(); return 0;}**按值传递(TestFunc1):**调用TestFunc1(a)时,会将a进行拷贝,生成一个临时对象**a_copy**。**a_copy**作为参数传递给TestFunc1。TestFunc1内部操作的实际上是a_copy,对a_copy的修改不会影响实参a。TestFunc1返回时,临时对象a_copy会被销毁。TestFunc1以值方式传递结构体A作为参数。这会导致每次调用都会对A进行值拷贝,对于一个包含10000个int成员的大结构体,拷贝开销很大。**按引用传递(TestFunc2):**调用TestFunc2(a)时,不会进行值拷贝,直接传递a的引用。TestFunc2内部操作的仍然是实参a本身。TestFunc2返回时,不需要销毁任何对象。TestFunc2以引用方式传递A。这种方式下,函数内直接操作的就是实参a本身,不会有任何拷贝开销。总结TestFunc1值传递,效率低是因为值拷贝开销大TestFunc2引用传递,效率高是因为避免了值拷贝直接操作的就是实参a本身![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cea37fd6819d40059d37965342ee3719.png)通过上述代码的比较**发现传值和指针在作为传参以及返回值类型上效率相差很大**。# 引用做返回值cppint Count(){static int n 0;n;// …return n;}我们先看看下面代码会输出什么结果cppint Add(int a, int b){int c a b;return c;}int main(){int ret Add(1, 2);Add(3, 4);cout “Add(1, 2) is :” ret endl;return 0;}在Vs编译运行图结果是**7**真的是正确吗![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fe90c7c1ead24f92b1fd7df0a2186064.png)问题分析**如果函数返回时,返回的对象已经超出了函数作用域(即已经被销毁),那么不能返回该对象的引用,必须返回值。**在第一个示例中:cppint Add(int a, int b){int c a b;return c;}这里函数返回了局部变量c的引用,但c在函数返回后就已经被销毁了,所以这是一个**未定义行为**,输出结果是**不确定**的。而在第二个示例中:cppint Add(int a, int b){int c a b;return c;}int main(){int ret Add(1, 2);Add(3, 4);cout “Add(1, 2) is :” ret endl;return 0;}这里同样是返回了局部变量c的引用,但是在main函数中又调用了一次Add函数,这时第一次调用返回的引用ret已经指向了一个不存在的对象,所以输出结果也是未定义的。函数返回引用时必须确保返回的对象在调用者作用域内仍然存在,否则就会产生未定义行为。这是C中函数返回引用需要特别注意的地方。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/921cb60c97c3413da342531e41f3a314.png)答案思考在Visual Studio上运行这段代码,输出结果是:Add(1, 2) is :7这个结果确实是**未定义**行为,但在某些情况下可能会输出7。之所以会出现这种情况,是因为**Visual Studio的编译器在处理这种未定义行为时可能会做一些特殊的优化或处理**,导致在某些环境下能够得到一个**看似合理**的结果。但这种行为是**不可靠**的,因为它依赖于具体的编译器实现细节。在不同的编译器或环境下,输出可能会完全不同。**正确的做法**是要么返回值,要么返回一个在调用者作用域内仍然存在的对象的引用。这样可以确保代码的行为是可预测和可移植的。## 引用和指针的区别1. **语法概念**:- **引用**是变量的别名,没有独立的存储空间,而是和其引用的实体共用同一块内存空间。- **指针**是一个独立的变量,存储了另一个变量的内存地址。2. **声明语法**:- 引用使用符号声明,如int ref x;- 指针使用*符号声明,如int* ptr x;3. **操作方式**:- 引用直接访问和操作其引用的实体,如ref 10;- 指针需要先解引用(*)才能访问其指向的实体,如*ptr 10;4. **Null值**:- 引用不能为空(Null),必须在声明时初始化为一个有效的实体。- 指针可以为空(Null),指向空地址0x0。让我们看看例子来说明引用和指针的区别:假设我们有一个整型变量x值为10。**使用引用:**cppint x 10;int ref x; // 声明引用ref,它是x的别名ref 20; // 通过ref修改x的值cout x x endl; // 输出 x 20ref是x的引用,它们共享同一块内存空间。通过ref修改值,实际上是在修改x的值。 输出x的值为20,因为x的值已经被修改了。**使用指针:**cppint x 10;int* ptr x; // 声明指针ptr,存储x的地址*ptr 20; // 通过ptr解引用并修改x的值cout x x endl; // 输出 x 20ptr是一个指向x的指针,存储了x的内存地址。通过*ptr解引用并修改值,实际上是在修改x的值。输出x的值为20,因为x的值已经被修改了。在**底层实现**上实际是有空间的因为**引用是按照指针方式来实现的**。cppint main(){ int a 10; int ra a; ra 20; int* pa a; *pa 20; return 0;}我们来看下引用和指针的汇编代码对比得出在汇编中**引用**的底层逻辑还是**指针**经过编译转换成汇编还是进行指针的操作![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/be0e447bf42344f2a653f8ca2108e349.png)引用和指针的不同点:1. **引用概念上定义一个变量的别名指针存储一个变量地址**。2. **引用在定义时必须初始化指针没有要求**3. **引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何一个同类型实体**4. **没有NULL引用但有NULL指针**5. 在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32位平台下占4个字节)6. **引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小**7. **有多级指针但是没有多级引用**8. **访问实体方式不同指针需要显式解引用引用编译器自己处理**9. **引用比指针使用起来相对更安全**# 常引用从上述代码中,我们可以得出以下关于常引用的结论:1. **常量引用**:cppconst int a 10;//int ra a; // 该语句编译时会出错a为常量const int ra a;对于常量对象a,我们可以使用常引用const int ra a;来引用它。这样做可以避免对常量进行修改直接使用非常引用int ra a;会在编译时报错,因为不允许对常量进行非常引用。2. **字面量常引用**:cpp// int b 10; // 该语句编译时会出错b为常量const int b 10;我们可以使用常引用const int b 10;来引用字面量常量。这样做可以避免创建临时变量 直接使用非常引用int b 10;会在编译时报错,因为字面量不能被非常引用。3. **类型不匹配的常引用**:cppdouble d 12.34;//int rd d; // 该语句编译时会出错类型不同const int rd d;根据类型不同的变量,如double d 12.34;,我们可以使用常引用const int rd d;来引用它直接使用非常引用int rd d;会在编译时报错,因为类型不匹配。—# 总结
http://www.dnsts.com.cn/news/110949.html

相关文章:

  • c2c网站建站的标准小程序源码怎么上传
  • 郑州免费做网站青岛高端网站制作公司
  • 兰州seo网站排名wordpress 手机端访问
  • 四川seo整站优化费用推广广告赚钱软件
  • 河间市网站建设公司离我最近的物流公司
  • 建设商业门户网站的重要建网站花钱吗
  • 重庆大渡口网站建设解决方案株洲最新通知今天
  • 韩国时尚网站欣赏深圳网站建设推广平台
  • 你买域名我送网站免费技能培训在哪里报名
  • 东莞外贸网站建设哪家好苏州做网站优化公司哪家好
  • 饰品做商城网站模式金泉网做网站
  • 忘记网站后台账号wordpress cart插件
  • 定制网站本地企业告别厅北京告别厅
  • 唐山市建设局网站网站产品 模块
  • 网站宣传策略国内顶尖网站设计公司
  • 淘客怎么做网站单页网站规划网站建设报价表
  • 网校网站建设企业app商城开发网站建设
  • 做公寓酒店跟网站合作有什么技巧有什么网站做生鲜配送的
  • 天津网站建设是什么做网站公司哪个比较好
  • 南京做南京华美整容网站wordpress漫画主题
  • 新能源网站建设哪家好优化网址
  • 南宁网站建设服务台商网站建设公司黄页
  • 招远网站建设公司地址关于网站建设的电话销售话术
  • 数据库网站开发教程友情链接检索数据分析
  • 网站流量报表佛山房地产新闻
  • 电商网站开发系统架构电商运营培训学费多少
  • 受雇去建设网站类网站东莞网站建设方案维护
  • 梧州单身相亲网站网站建设免费建站源代码
  • 做网站通过什么挣钱静态企业网站模板下载
  • 中小企业网站建设框架建什么类型的网站访问量比较大