C++ 模板詳解(二)

轉載:http://www.cnblogs.com/gw811/archive/2012/10/25/2736224.html

四、類模板的默認模板類型形參


  1、可以為類模板的類型形參提供默認值,但不能為函數模板的類型形參提供默認值。函數模板和類模板都可以為模板的非類型形參提供默認值。

  2、類模板的類型形參默認值形式為:template<class T1, class T2=int> class A{};為第二個模板類型形參T2提供int型的默認值。

  3、類模板類型形參默認值和函數的默認參數一樣,如果有多個類型形參則從第一個形參設定了默認值之后的所有模板形參都要設定默認值,比如template<class T1=int, class T2>class A{};就是錯誤的,因為T1給出了默認值,而T2沒有設定。

  4、在類模板的外部定義類中的成員時template?后的形參表應省略默認的形參類型。比如template<class? T1, class T2=int> class A{public: void h();}; 定義方法為template<class T1,class T2> void A<T1,T2>::h(){}

定義類模板類型形參:

?演示實例1:

  TemplateDemo.h

復制代碼
 1 #ifndef TEMPLATE_DEMO_HXX
 2 #define TEMPLATE_DEMO_HXX
 3 
 4 template<class T> class A{
 5     public:
 6         T g(T a,T b);
 7         A();
 8 };
 9 
10 #endif
復制代碼

  TemplateDemo.cpp

復制代碼
 1 #include<iostream.h>
 2 #include "TemplateDemo.h"
 3 
 4 template<class T> A<T>::A(){}
 5 
 6 template<class T> T A<T>::g(T a,T b){
 7     return a+b;
 8 }
 9 
10 void main(){
11     A<int> a;
12     cout<<a.g(2,3)<<endl;
13 }
復制代碼

  運行結果: ? ? ? 5

?  類模板的默認模板類型形參示例1:

  TemplateDemo03.h

復制代碼
 1 #ifndef TEMPLATE_DEMO_03
 2 #define TEMPLATE_DEMO_03
 3 //定義帶默認類型形參的類模板。這里把T2默認設置為int型。
 4 template<class T1,class T2=int> class CeilDemo{
 5     public:
 6         int ceil(T1,T2);
 7 };
 8 //在類模板的外部定義類中的成員時template 后的形參表應省略默認的形參類型。
 9 template<class T1,class T2> 
10 int CeilDemo<T1,T2>::ceil(T1 a,T2 b){
11     return a>>b;
12 }
13 
14 #endif
復制代碼

  TemplateDemo03.cpp

復制代碼
1 #include<iostream.h>
2 #include "TemplateDemo03.h"
3 
4 void main(){
5     CeilDemo<int> cd;
6     cout<<cd.ceil(8,2)<<endl;
7 }
復制代碼

  運行結果:       2 

  在類模板的外部定義類中的成員時template 后的形參表應省略默認的形參類型,如果沒有省略,不會出現編譯錯誤而是提出警告:
復制代碼
1 --------------------Configuration: TemplateDemo03 - Win32 Debug--------------------
2 Compiling...
3 TemplateDemo03.cpp
4 g:\c++\cdaima\templatedemo03\templatedemo03.h(12) : 
5 warning C4519: default template arguments are only allowed on a class template; ignored
6 
7 TemplateDemo03.obj - 0 error(s), 1 warning(s)
復制代碼

?

  原作者:類模板類型形參默認值和函數的默認參數一樣,如果有多個類型形參則從第一個形參設定了默認值之后的所有模板形參都要設定默認值,比如template<class T1=int, class T2>class A{};就是錯誤的,因為T1給出了默認值,而T2沒有設定。

實例測試如下:

  類模板的默認模板類型形參示例2:

?  TemplateDemo03.h?

復制代碼
 1 #ifndef TEMPLATE_DEMO_03
 2 #define TEMPLATE_DEMO_03
 3 
 4 template<class T1=int,class T2,class T3> class CeilDemo{
 5     public:
 6         int ceil(T1,T2,T3);
 7 };
 8 
 9 template<class T1,class T2,class T3> 
10 int CeilDemo<T1,T2,T3>::ceil(T1 a,T2 b,T3 c){
11     return a+b+c;
12 }
13 
14 #endif
復制代碼

  TemplateDemo03.cpp?

復制代碼
1 #include<iostream.h>
2 #include "TemplateDemo03.h"
3 
4 void main(){
5     CeilDemo<int,int> cd;
6     cout<<cd.ceil(2,3,4)<<endl;
7 }
復制代碼

  運行結果:        9  

  上例中我們看到,雖然多個類型形參則從第一個形參T1設定了默認值為int類型,但后面的兩個并沒有設定默認值。我們在聲明對象的時候指明了T2和T3的類型都為int類型,編譯、運行沒有任何警告和錯誤。但并不能否定原作者是錯的,這只是一個特例,看下面的示例:

類模板的默認模板類型形參示例3:

  TemplateDemo03.h

復制代碼
 1 #ifndef TEMPLATE_DEMO_03
 2 #define TEMPLATE_DEMO_03
 3 
 4 template<class T1=int,class T2,class T3> class CeilDemo{
 5     public:
 6         double ceil(T1,T2,T3);
 7 };
 8 
 9 template<class T1,class T2,class T3> 
10 double CeilDemo<T1,T2,T3>::ceil(T1 a,T2 b,T3 c){
11     return a+b+c;
12 }
13 
14 #endif
復制代碼

  TemplateDemo03.cpp

復制代碼
1 #include<iostream.h>
2 #include "TemplateDemo03.h"
3 
4 void main(){
5     CeilDemo<double,double> cd;
6     cout<<cd.ceil(2,3.1,4.1)<<endl;
7 }
復制代碼

  編譯錯誤:

復制代碼
 1 --------------------Configuration: TemplateDemo03 - Win32 Debug--------------------
 2 Compiling...
 3 TemplateDemo03.cpp
 4 g:\c++\cdaima\templatedemo03\templatedemo03.h(12) : 
 5 error C2244: 'CeilDemo<T1,T2,T3>::ceil' : unable to resolve function overload
 6 g:\c++\cdaima\templatedemo03\templatedemo03.cpp(6) : 
 7 error C2065: 'cd' : undeclared identifier
 8 g:\c++\cdaima\templatedemo03\templatedemo03.cpp(6) : 
 9 error C2228: left of '.ceil' must have class/struct/union type
10 Error executing cl.exe.
11 
12 TemplateDemo03.obj - 3 error(s), 0 warning(s)
復制代碼

  從上面的例子我們可以看出,當我們試圖把T2和T3定義為double類型就會出現錯誤(T1默認定義的是int類型)。那是不是我們按照作者所說把T2和T3也設定為默認值double,是否還會出現錯誤?看下面的示例:

類模板的默認模板類型形參示例4:

  TemplateDemo03.h

復制代碼
 1 #ifndef TEMPLATE_DEMO_03
 2 #define TEMPLATE_DEMO_03
 3 
 4 template<class T1=int,class T2=double,class T3=double> class CeilDemo{
 5     public:
 6         double ceil(T1,T2,T3);
 7 };
 8 
 9 template<class T1,class T2,class T3> 
10 double CeilDemo<T1,T2,T3>::ceil(T1 a,T2 b,T3 c){
11     return a+b+c;
12 }
13 
14 #endif
復制代碼

  TemplateDemo03.cpp

復制代碼
1 #include<iostream.h>
2 #include "TemplateDemo03.h"
3 
4 void main(){
5     CeilDemo<int,double,double> cd;
6     cout<<cd.ceil(2,3.1,4.1)<<endl;
7 }
復制代碼

  編譯錯誤:

復制代碼
--------------------Configuration: TemplateDemo03 - Win32 Debug--------------------
Compiling...
TemplateDemo03.cpp
g:\c++\cdaima\templatedemo03\templatedemo03.h(12) : 
error C2244: 'CeilDemo<T1,T2,T3>::ceil' : unable to resolve function overload
g:\c++\cdaima\templatedemo03\templatedemo03.cpp(6) : 
error C2065: 'cd' : undeclared identifier
g:\c++\cdaima\templatedemo03\templatedemo03.cpp(6) : 
error C2228: left of '.ceil' must have class/struct/union type
Error executing cl.exe.TemplateDemo03.obj - 3 error(s), 0 warning(s)
復制代碼

  從結果我們可以看出,和上例是一樣的錯誤。從實例中我們可以總結如下:類模板如果有多個類型形參,如果使用類型形參默認值則盡量放在參數列表的末尾,而且默認的參數類型必須相同。如果從第一個形參設定了默認值之后的所有模板形參都要設定和第一個形參同類型的默認值。(聲明:本人也是剛接觸C++,以上只是我經過實例演示對原作者提出的一些質疑,可能我的示例有不到之處,還望大神們不吝賜教,共同完善此博客,給像我一樣的菜鳥提供一個學習的平臺!)

?

  接下來驗證不能為函數模板的類型形參提供默認值”

?類模板的默認模板類型形參示例5:

?  TemplateDemo04.cpp

復制代碼
 1 #include<iostream.h>
 2 
 3 template<class T1,class T2,class T3>
 4 T1 sum(T1 a,T2 b,T3 c=int){
 5     return a+b+c;
 6 } 
 7 
 8 void main(){
 9     cout<<sum<double,double>(1.1,2.1,3)<<endl;
10 }
復制代碼

  編譯錯誤:

復制代碼
1 --------------------Configuration: TemplateDemo04 - Win32 Debug--------------------
2 Compiling...
3 TemplateDemo04.cpp
4 g:\c++\cdaima\templatedemo04\templatedemo04.cpp(4) : 
5 error C2062: type 'int' unexpected
6 Error executing cl.exe.
7 
8 TemplateDemo04.obj - 1 error(s), 0 warning(s)
復制代碼

  更改之后的TemplateDemo.cpp

復制代碼
 1 #include<iostream.h>
 2 
 3 template<class T1,class T2,class T3>
 4 T1 sum(T1 a,T2 b,T3 c){
 5     return a+b+c;
 6 } 
 7 
 8 void main(){
 9     cout<<sum<double,short,int>(1.1,3,257)<<endl;
10 }
復制代碼

  運行結果:   261.1     

?

  ?原作者演示實例如下:

復制代碼
 1 類模板非類型形參示例
 2 //模板的聲明或定義只能在全局,命名空間或類范圍內進行。即不能在局部范圍,函數內進行,比如不能在main函數中聲明或定義一個模板。
 3 //類模板的定義
 4 template<class T>class A{public:T g(T a, T b); A();};  //定義帶有一個類模板類型形參T的類A
 5 template<class T1,class T2>class B{public:void g();}; //定義帶有兩個類模板類型形參T1,T2的類B
 6 //定義類模板的默認類型形參,默認類型形參不適合于函數模板。
 7 template<class T1,class T2=int> class D{public: voidg();}; //定義帶默認類型形參的類模板。這里把T2默認設置為int型。
 8 //template<class T1=int, class T2>class E{}; //錯誤,為T1設了默認類型形參則T1后面的所有形參都必須設置認默值。
 9 
10 //以下為非類型形參的定義
11 //非類型形參只能是整型,指針和引用,像double,String, String **這樣的類型是不允許的。但是double &,double *對象的引用或指
12 針是正確的。
13 template<class T1,int a> class Ci{public:void g();}; //定義模板的非類型形參,形參為整型
14 template<class T1,int &a>class Cip{public:void g();}; 
15 template<class T1,A<int>* m> class Cc{public:void g();}; //定義模板的模板類型形參,形參為int型的類A的對象的指針。
16 template<class T1,double*a>class Cd{public:void g();};  //定義模板的非類型形參,形參為double類型的引用。
17 class E{}; template<class T1,E &m> class Ce{}; //非類型模板形參為對象的引用。
18 //以下非類型形參的聲明是錯誤的。
19 //template<class T1,A m>class Cc{}; //錯誤,對象不能做為非類型形參,非類型模板形參的類型只能是對象的引用或指針。
20 //template<class T1,double a>class Cc{}; //錯誤,非類型模板的形參不能是double類型,可以是double的引用。
21 //template<class T1,A<int> m>class Cc{}; //錯誤,非類型模板的形參不能是對象,必須是對象的引用或指針。這條規則對于模板型參
22 也不例外。
23 //在類模板外部定義各種類成員的方法,
24 //typeid(變量名).name()的作用是提取變量名的類型,如int a,則cout<<typeid(a).name()將輸出int
25 template<class T>   A<T>::A(){cout<<"class A goucao"<<typeid(T).name()<<endl;} //在類模板外部定義類的構造函數的方法
26 template<class T> T A<T>::g(T a,T b){cout<<"class A g(T a,T b)"<<endl;} //在類模板外部定義類模板的成員
27 template<class T1,class T2>  voidB<T1,T2>::g(){cout<<"class g f()"<<typeid(T1).name()<<typeid(T2).name()<<endl;}
28 //在類外面定義類的成員時template后面的模板形參應與要定義的類的模板形參一致
29 template<class T1,int a>     voidCi<T1,a>::g(){cout<<"class Ci g()"<<typeid(T1).name()<<endl;}
30 template<class T1,int &a>    voidCip<T1,a>::g(){cout<<"class Cip g()"<<typeid(T1).name()<<endl;} 
31 //在類外部定義類的成員時,template后的模板形參應與要定義的類的模板形參一致
32 template<class T1,A<int> *m> voidCc<T1,m>::g(){cout<<"class Cc g()"<<typeid(T1).name()<<endl;}
33 template<class T1,double* a> voidCd<T1,a>::g(){cout<<"class Cd g()"<<typeid(T1).name()<<endl;}
34 
35 //帶有默認類型形參的模板類,在類的外部定義成員的方法。
36 //在類外部定義類的成員時,template的形參表中默認值應省略
37 template<class T1,class T2>  voidD<T1,T2>::g(){cout<<"class D g()"<<endl;}
38 //template<class T1,class T2=int> void D<T1,T2>::g(){cout<<"class D k()"<<endl;} //錯誤,在類模板外部定義帶有默認類型的形
39 參時,在template的形參表中默認值應省略。
40 //定義一些全局變量。
41 int e=2;  doubleed=2.2; double*pe=&ed;
42 A<int> mw; A<int> *pec=&mw; E me;
43 
44 //main函數開始
45 int main()
46 { // template<class T>void h(){} //錯誤,模板的聲明或定義只能在全局,命名空間或類范圍內進行。即不能在局部范圍,函數內進行。
47 //A<2> m; //錯誤,對類模板不存在實參推演問題,類模板必須在尖括號中明確指出其類型。
48 //類模板調用實例
49 A<int> ma; //輸出"class A goucao int"創建int型的類模板A的對象ma。
50 B<int,int> mb; mb.g(); //輸出"class B g() int int"創建類模板B的對象mb,并把類型形參T1和T2設計為int
51 //非類型形參的調用
52 //調用非類型模板形參的實參必須是一個常量表達式,即他必須能在編譯時計算出結果。任何局部對象,局部變量,局部對象的地址,局部
53 變量的地址都不是一個常量表達式,都不能用作非類型模板形參的實參。全局指針類型,全局變量,全局對象也不是一個常量表達式,不能
54 用作非類型模板形參的實參。
55 //全局變量的地址或引用,全局對象的地址或引用const類型變量是常量表達式,可以用作非類型模板形參的實參。
56 //調用整型int型非類型形參的方法為名為Ci,聲明形式為template<class T1,int a> class Ci
57 Ci<int,3>//正確,數值R是一個int型常量,輸出"class Ci g() int"
58 const int a2=3; Ci<int,a2> mci1; mci1.g(); //正確,因為a2在這里是const型的常量。輸出"class Ci g() int"
59 //Ci<int,a> mci; //錯誤,int型變量a是局部變量,不是一個常量表達式。
60 //Ci<int,e> mci; //錯誤,全局int型變量e也不是一個常量表達式。
61 //調用int&型非類型形參的方法類名為Cip,聲明形式為template<class T1,int &a>class Cip
62 Cip<int,e> mcip;  //正確,對全局變量的引用或地址是常量表達式。
63 //Cip<int,a> mcip1; //錯誤,局部變量的引用或地址不是常量表達式。
64 //調用double*類型的非類形形參類名為Cd,聲明形式為template<class T1,double *a>class Cd
65 Cd<int,&ed> mcd; //正確,全局變量的引用或地址是常量表達式。
66 //Cd<int,pe> mcd1; //錯誤,全局變量指針不是常量表達式。
67 //double dd=3.3; //錯誤,局部變量的地址不是常量表達式,不能用作非類型形參的實參
68 //Cd<int,&e> mcd;  //錯誤,非類型形參雖允許一些轉換,但這個轉換不能實現。
69 
70 //調用模板類型形參對象A<int> *的方法類名為Cc,聲名形式為template<class T1,A<int>* m> class Cc
71 Cc<int,&mw> mcc; mcc.g(); //正確,全局對象的地址或者引用是常量表達式
72 //Cc<int,&ma> mcc;  //錯誤,局部變量的地址或引用不是常量表達式。
73 //Cc<int,pec> mcc2;  //錯誤,全局對象的指針不是常量表達式。
74 
75 //調用非類型形參E&對象的引用的方法類名為Ce。聲明形式為template<class T1,E &m> class Ce
76 E me1; //Ce<int,me1> mce1; //錯誤,局部對象不是常量表達式
77 Ce<int,me> mce;  //正確,全局對象的指針或引用是常量表達式。
78 //非類型形參的轉換示例,類名為Ci
79 //非類型形參允許從數組到指針,從函數到指針的轉換,const修飾符的轉換,提升轉換,整值轉換,常規轉換。
80 const short s=3; Ci<int,s> mci4?//正確,雖然short型和int不完全匹配,但這里可以將short型轉換為int型
復制代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384337.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++類對象的創建方式

對象創建限制在堆或棧 c類對象的創建方式對象創建限制在堆或棧C 中的類的對象的建立模式如何將類限制在堆上呢&#xff1f;C 中的類的對象的建立模式 C 中的類的對象的建立模式分為兩張&#xff1a;靜態建立&#xff0c;動態建立 靜態建立&#xff1a;由編譯器為對象在棧空間…

C++ 模板詳解(一)

轉載&#xff1a;http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C模板 模板是C支持參數化多態的工具&#xff0c;使用模板可以使用戶為類或者函數聲明一種一般模式&#xff0c;使得類中的某些數據成員或者成員函數的參數、返回值取得任意類型。 模板是一種對類…

劍指Offer09. 用兩個棧實現隊列

class CQueue { public:stack<int> stack1,stack2;CQueue() {//初始化棧while(!stack1.empty()){stack1.pop();}while(!stack2.empty()){stack2.pop();}}void appendTail(int value) {stack1.push(value);}int deleteHead() {if(stack2.empty()){while(!stack1.empty()){…

rk3588 之啟動

目錄 uboot版本配置修改編譯 linux版本配置修改編譯 啟動sd卡啟動制作spi 燒錄 參考 uboot 版本 v2024.01-rc2 https://github.com/u-boot/u-boot https://github.com/rockchip-linux/rkbin 配置修改 使用這兩個配置即可&#xff1a; orangepi-5-plus-rk3588_defconfig r…

C++引用詳解

轉載&#xff1a;http://www.cnblogs.com/gw811/archive/2012/10/20/2732687.html 引用的概念 引用&#xff1a;就是某一變量&#xff08;目標&#xff09;的一個別名&#xff0c;對引用的操作與對變量直接操作完全一樣。 引用的聲明方法&#xff1a;類型標識符 &引用名目標…

劍指Offer03.數組中重復的數字

找出數組中重復的數字。 在一個長度為 n 的數組 nums 里的所有數字都在 0&#xff5e;n-1 的范圍內。數組中某些數字是重復的&#xff0c;但不知道有幾個數字重復了&#xff0c;也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。 示例 1&#xff1a; 輸入&…

C++ 模板全特化中的函數特化

轉載&#xff1a;http://blog.csdn.net/rain_qingtian/article/details/15815251 [cpp] view plaincopy print?#include <iostream> using namespace std; template<typename T> bool isLess(T x, T y) { cout << "general version\n&q…

c++面向對象總結

c面向對象總結什么是面向對象&#xff1f;面向對象的三大特性重寫和重載的區別隱藏和重寫&#xff0c;重載的區別什么是多態&#xff1f;多態如何實現什么是面向對象&#xff1f;面向對象的三大特性 面向對象&#xff1a;對象是指具體的某一個事物&#xff0c;這些事物的抽象就…

類模板static成員的使用

轉載&#xff1a;http://blog.csdn.net/ljq32/article/details/7911390 1. 與普通類的static成員一樣&#xff0c;類內部聲明一次&#xff0c;類外部定義一次&#xff0c;定義時可以設置也可以不設置初始值; 2. 類模板內部聲明與普通類的static成員一致&#xff1a; [html] vi…

Linux網絡編程服務器模型選擇之循環服務器

轉載&#xff1a;http://www.cnblogs.com/lizhenghn/p/3617608.html 在網絡程序里面&#xff0c;通常都是一個服務器處理多個客戶機&#xff0c;為了出個多個客戶機的請求&#xff0c;服務器端的程序有不同的處理方式。本節開始介紹Linux下套接字編程的服務器模型選擇&#xff…

劍指Offer04. 二維數組中的查找

在一個 n * m 的二維數組中&#xff0c;每一行都按照從左到右遞增的順序排序&#xff0c;每一列都按照從上到下遞增的順序排序。請完成一個高效的函數&#xff0c;輸入這樣的一個二維數組和一個整數&#xff0c;判斷數組中是否含有該整數。 相當于二叉搜索樹,左孩子比根節點小&…

Linux網絡編程服務器模型選擇之并發服務器(上)

轉載&#xff1a;http://www.cnblogs.com/lizhenghn/p/3617666.html 與循環服務器的串行處理不同&#xff0c;并發服務器對服務請求并發處理。循環服務器只能夠一個一個的處理客戶端的請求&#xff0c;顯然效率很低。并發服務器通過建立多個子進程來實現對請求的并發處理。并發…

劍指Offer10- II. 青蛙跳臺階問題

一只青蛙一次可以跳上1級臺階&#xff0c;也可以跳上2級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如計算初始結果為&#xff1a;1000000008&#xff0c;請返回 1。 示例 1&#xff1a; 輸入&a…

Linux網絡編程服務器模型選擇之并發服務器(下)

轉載&#xff1a;http://www.cnblogs.com/lizhenghn/p/3618986.html 前面兩篇文章&#xff08;參見&#xff09;分別介紹了循環服務器和簡單的并發服務器網絡模型&#xff0c;我們已經知道循環服務器模型效率較低&#xff0c;同一時刻只能為一個客戶端提供服務&#xff0c;而且…

劍指Offer05. 替換空格

請實現一個函數&#xff0c;把字符串 s 中的每個空格替換成"%20"。 示例 1&#xff1a; 輸入&#xff1a;s “We are happy.” 輸出&#xff1a;“We%20are%20happy.” class Solution { public:string replaceSpace(string s) {int count0;int lens.size();stri…

Linux網絡編程服務器模型選擇之IO復用循環并發服務器

轉載&#xff1a;http://www.cnblogs.com/lizhenghn/p/3619091.html 在前面我們介紹了循環服務器&#xff0c;并發服務器模型。簡單的循環服務器每次只能處理一個請求&#xff0c;即處理的請求是串行的&#xff0c;效率過低&#xff1b;并發服務器可以通過創建多個進程或者是線…

數據結構(六)二叉樹的遍歷(遞歸非遞歸方法)

數據結構&#xff08;六&#xff09;二叉樹的遍歷&#xff08;遞歸非遞歸方法&#xff09; 一、遞歸方法 1.先序遍歷 void PreOrder(BiTree T) {visit(T);PreOrder(T->LChild)PreOrder(T->RChild) }2.先序遍歷 void PreOrder(BiTree T) {PreOrder(T->LChild)visit…

memcpy/memset函數的c語言實現

轉載&#xff1a;http://blog.csdn.net/u011118276/article/details/46742341 1、memcpy 頭文件&#xff1a;#include <string.h> 函數原型&#xff1a;void *memcpy(void *dest, const void *src, size_t n) 功能&#xff1a;將指針src指向的內存空間的n個字節復制到des…

計算機網絡(一)計算機網絡體系

計算機網絡&#xff08;一&#xff09;計算機網絡體系一、計算機網絡概述概念功能組成分類二、體系結構和參考模型ISO/OSI模型物理層網絡層傳輸層會話層表示層應用層OSI參考模型與TCP/IP參考模型OSI參考模型與TCP/IP參考模型不同5層參考模型一、計算機網絡概述 概念 計算機網…

計算機網絡(二)物理層

計算機網絡&#xff08;二&#xff09;物理層一、通信基礎物理層接口特性1.機械特性2.電氣特性3.功能特性4.規程特性典型的數據通信模型三種通信方式1.單工通信2.半雙工通信/雙向交替通信3.全雙工通信/雙向同時通信數據傳輸方式串行傳輸并行傳輸同步傳輸異步傳輸二、數據交換方…