六千字C++階段總結第一部分,收藏夾預定,適合C/C++入門系統學習

第一部分 C++基礎入門

目錄

第一部分 C++基礎入門

 

1,C++初始

1.1變量

1.2常量

1.3關鍵字

1.4標識符命名規則

2,數據類型

2.1整型

2.2sizeof關鍵字

2.3實型(浮點型)

2.4字符型

2.5轉義字符

2.6字符串類型

2.7布爾類型

3,運算符

3.1算術運算符

3.2賦值運算符

3.3比較運算符

3.4邏輯運算符

4,程序流程結構

4.3跳轉語句

5,數組

5.1一維數組

5.2二維數組

6,函數

6.1函數的定義

6.2函數的調用

6.3值傳遞

6.4函數的常見樣式

6.5函數的聲明

6.6函數的分文件編寫

7,指針

7.1指針變量的定義和使用

7.2指針所佔內存空間

7.3空指針和野指針

7.4const修飾指針

7.5指針和數組

7.6指針和函數

7.7指針,配合數組和函數

8,結構體

8.1結構體的定義和使用

8.2結構體數組

8.3結構體指針

8.4結構體嵌套結構體

8.5結構體做函數參數

8.6結構體中const使用場景


1,C++初始

1.1變量

作用:給一段指定的內存空間起名,方便操作這段內存。

語法:數據類型  變量名=初始值

int a=10;

1.2常量

作用:用於記錄程序中不可更改的數據

兩種方式

  • #define 宏定義:#define 常量名 常量值(通常在文件上方定義,表示一個常量)
  • const修飾的變量:const 數據類型 常量名=常量值(通常在變量定義前加上關鍵字const,修飾該變量爲常量,不可更改)

#define a 10

const int b=10;

1.3關鍵字

作用:關鍵字是C++中預先保留的單詞(標識符)

在定義變量或者常量的時候,不要用關鍵字,否則會產生歧義

int   char   long   if   case   const   define   

1.4標識符命名規則

作用:C++規定給標識符(常量,變量)命名時,遵循一定的規則

  • 標識符不能是關鍵字
  • 標識符只能由字母,數字,下劃線組成
  • 第一個字母必須是字母或下滑線
  • 標識符中字母區分大小寫

int int=10;(錯誤)

int a=10;  int a1=10;  int a1_=10;(正確)      int a*=10(錯誤)

int b1=10; int _1=10;  (正確)       int _1=10(錯誤)

int c=10不代表此時C=10

2,數據類型

在創建一個變量或者常量時,必須要指出相應的數據類型,否則無法給變量分配內存(數據類型就是爲了分配合適的空間)

2.1整型

作用:整型變量表示的是整數類型的數據

C++中能夠表示整型的類型有以下幾種方式,區別在於所佔內存空間不同

short(短整型)  2字節    -2^15——2^15-1
int(整型) 4字節          -2^31——2^31-1
long(長整型)  windows爲4,linux下32位4,64位8  -2^31——2^31-1
long long(長長整型)  8字節  -2^63——2^63-1

(1字節 = 二進制8位 / 十進制3位 / 十六進制2位)

2.2sizeof關鍵字

作用:利用sizeof關鍵字可以統計數據類型所佔內存大小

語法:sizeof(數據類型/變量)

int a=10;

可以得出:sizeof(int)=4,sizeof(a)=4

2.3實型(浮點型)

作用:用於表示小數

浮點型變量分爲兩種

  • 單精度float
  • 雙精度double
float 4字節 7位有效數字
double 8字節 15-16位有效數字

有效數字是指在一個數中,從該數的第一個非零數字起,直到末尾數字稱爲有效數字,如0.123的有效數字是123。

float a=3.14f;(float類型定義的數據最好後面加上f,這樣和double形成區別)

科學計數法

float a=1e2;  //1*10^2

float b=1e-2;  //1*0.1^2

2.4字符型

作用:字符型變量用於顯示單個字符

語法:char ch='a';(用單引號,單引號內只能有一個字符,不能是字符串)

  • C和C++中字符型變量只佔1個字節
  • 字符型變量並不是把字符本身放到內存中存儲,而是將對應的ASCLL編碼放到儲存單元

主要就記住A=65,a=97

2.5轉義字符

作用:用於表示一些不能顯示出來的ASCLL字符

現階段我們常用的轉義字符有:\n(技術太差,我就用這一個);\\(想要輸出'\',就需要用\\;cout<<"\\");\t正常8位

2.6字符串類型

作用:用於表示一串字符

兩種風格:

C風格字符串:char 變量名[]="字符串值"

C++風格字符串:string 變量名=“字符串值”(需要加上#include<string>頭文件)

char a[]="abcdef";

string b="abcdef";

2.7布爾類型

作用:布爾數據類型代表真或假的值

bool類型只有兩個值(只要是非0的值都代表真)

  • true——真(本質是1)
  • false——假(本質是0)

bool類型只佔1個字節大小

注意:使用bool類型的時候,初始化時一定要賦初值,不然輸出結果爲204。因爲程序在Debug模式下,未對變量初始化,寫入內存的是0xcc ,所以最後顯示的結果爲204。如果已經賦初值,則結果纔是1或者0。

3,運算符

作用:用於執行代碼的運算

算數運算符 用於處理四則運算
賦值運算符 用於將表達式的值賦給變量
比較運算符 用於表達式的比較,並返回一個真值或假值
邏輯運算符 用於根據表達式的值返回真值或假值

3.1算術運算符

作用:用於處理四則運算(除了正常的正負加減乘,下面介紹一些常用的)

  • “ / ”   除(兩個數相除,取整數部分,且除數不爲零

int  a=10,b=5,c=3;  可以得出a/b=2,a/c=3;

  • “ % ”   取模(兩個數相除,取餘數部分

int  a=10,b=5,c=3;  可以得出a%b=0,a%c=1;

  • “ ++ ”   前置遞增(先自增,後運算)

int a=10,b;  b=++a;   則b=11,a=11;

  • “ ++ ”   後置遞增(先運算,後自增)

int a=10,b;  b=a++;   則b=10,a=11;

  • “ -- ”   前置遞減(先自增,後運算)

int a=10,b;  b=--a*2;   則b=18,a=9;

  • “ -- ”   後置遞減(先運算,後自增)

int a=10,b;  b=a--*2;   則b=20,a=9;

3.2賦值運算符

作用:用於將表達式的值賦給變量

運算符 術語 示例 結果
= 賦值 a=b a=b
+= 加等於 a+=b a=a+b
-= 減等於 a-=b a=a-b
*= 乘等於 a*=b a=a*b
/= 除等於 a/=b a=a/b
%= 模等於 a%=b a=a%b

3.3比較運算符

作用:用於表達式的比較,並返回一個真值或假值

int a=1,b=2;      
運算符 術語 示例 結果
== 相等於 a==b 0
!= 不等於 a!=b 1
< 小於 a<b 1
> 大於 a>b 0
<= 小於等於 a<=b 1
>= 大於等於 a>=b 0

3.4邏輯運算符

作用;用於根據表達式的值返回真值(1)或假值(0)

運算符 術語 示例 結果
! !a 如果a爲假,則!a爲真,如果a爲真,則!a爲假
&& a&&b 如果a和b都爲真,則結果爲真,否則爲假
|| a||b 如果a和b有一個爲真,則結果爲真,二者都爲假時,結果爲假

4,程序流程結構

最基本的三種結構:順序結構,選擇結構,循環結構

  • 順序結構:程序按順序執行,不發生跳轉
  • 選擇結構:依據條件是否滿足,有選擇的執行相應功能
  • 循環結構:依據條件是否滿足,循環多次執行某段代碼

4.1選擇結構

4.1.1if語句

作用:執行滿足條件的語句

if語句的三種形式

  • 單行格式if語句(滿足條件則執行語句,不滿足則結束):(一條語句)

#include<iostream>
using namespace std;
int main()
{
	int a;
	cout << "輸入a的值:";
	cin >> a;
	if (a > 5)
	{
		cout << "a大於5"<<endl;
	}
	system("pause");
	return 0;
}
  • 多行格式if語句( if(條件) {條件滿足執行的語句} else{條件不滿足執行的語句}):(兩條語句)

#include<iostream>
using namespace std;
int main()
{
	int a;
	cout << "輸入a的值:";
	cin >> a;
	if (a > 5)
	{
		cout << "a大於5"<<endl;
	}
	else
	{
		cout << "a小於等於5"<<endl;
	}
	system("pause");
	return 0;
}
  • 多條件if語句( if(條件1) {條件1滿足執行的語句} else if(條件2) {條件2滿足執行的語句}...else {都不滿足執行語句):(n條語句)

#include<iostream>
using namespace std;
int main()
{
	int a;
	cout << "輸入a的值:";
	cin >> a;
	if (a > 15)
	{
		cout << "a大於15"<<endl;
	}
	else if (a>10)
	{
		cout << "a大於10,小於等於15"<<endl;
	}
	else if (a>5)
	{
		cout << "a大於5,小於等於10" << endl;
	}
	else
	{
		cout << "a小於等於5" << endl;
	}
	system("pause");
	return 0;
}

嵌套if語句:在if語句中,可以嵌套使用if語句,達到更精確的條件判斷

#include<iostream>
using namespace std;
int main()
{
	int a;
	cout << "輸入a的值:";
	cin >> a;
	if (a > 15)
	{
		cout << "a大於15"<<endl;
	}
	else if (a>10)
	{
		if (a > 13)
		{
			cout << "a大於13,小於等於15" << endl;
		}
		else
		{
			cout << "a大於10,小於等於13" << endl;
		}
	}
	else if (a>5)
	{
		cout << "a大於5,小於等於10" << endl;
	}
	else
	{
		cout << "a小於等於5" << endl;
	}
	system("pause");
	return 0;
}

4.1.2三目運算符

作用:通過三目運算符實現簡單的判斷

語法:表達式a  ?  表達式b:表達式c         (如果表達式a的值爲真,則執行b返回b的值;a爲假,則執行c返回C的值)

int a=10,b=5,c;     c=(a>b? a:b);   則c等於a的值,等於10;

int a=10,b=5;         (a>b ?  a:b)=20;則a=20,b=5;

4.1.3 switch語句

語法:

switch ( 變量表達式 )

{

        case 常量1 :語句;break;

        case 常量2 :語句;break;

        ...

        case 常量n:語句;break;

        default :語句;break;

}

#include<iostream>
using namespace std;
int main()
{
	int a;
	cout << "輸入級別:";
	cin >> a;
	switch (a)
	{
	case 3:
		cout << "優秀!";
		break;
	case 2:
		cout << "良好!";
		break;
	case 1:
		cout << "及格!";
		break;
	default:
		cout << "差!";
		break;
	}
	system("pause");
	return 0;
}

4.2循環結構

4.2.1 while循環語句

作用:滿足循環條件,執行循環語句

語法:while(循環條件){循環語句}          :先條件,後語句

(只要循環條件爲真,就執行循環語句)

#include<iostream>
using namespace std;
int main()
{
	int a = 1;
	while (a <= 10)
	{
		cout << a << endl;
		a++;
	}
	system("pause");
	return 0;
}

4.2.2 do.....while循環語句

作用:滿足循環條件,執行循環語句

語法:do{循環語句} while(循環條件);          :先語句,後條件

(與while不同的是,會先執行一次循環語句,再判斷條件)

#include<iostream>
using namespace std;
int main()
{
	int a = 1;
	do{
		cout << a << endl;
		a++;
	} while (a <= 10);
	system("pause");
	return 0;
}

4.2.3for循環語句

作用:滿足循環條件,執行循環語句

語法:for(起始表達式;條件表達式;末尾循環體){循環語句;}                  :表達式中間用分號隔開

#include<iostream>
using namespace std;
int main()
{
	int i;
	for (i = 1; i <= 10; i++)
	{
		cout << i << endl;
	}
	system("pause");
	return 0;
}

4.2.4嵌套循環

作用:在嵌套裏面嵌套一層循環

eg:輸出一個10*10的星星方格

#include<iostream>
using namespace std;
int main()
{
	int i;
	for (i = 1; i <= 10; i++)
	{
		for (int j = 1; j <= 10; j++)
		{
			cout<<" * ";
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

4.3跳轉語句

4.3.1break語句

作用:用於跳出選擇結構或者循環結構

break使用的時機:

  • 出現在switch條件語句中,作用終止case並跳出switch
  • 出現在while循環語句中,作用是跳出當前的循環語句
  • 出現在嵌套循環中,跳出最近的內層循環語句

4.3.2continue語句

作用:在循環語句中,跳過本次循環中餘下尚未執行的語句,繼續執行下一次循環

4.3.3goto語句(不推薦)

作用:可以無條件跳轉語句

語法:goto 標記;(如果標記的名稱存在,執行到goto語句時,會跳轉到標記的位置)

#include<iostream>
using namespace std;
int main()
{
	cout << "aaaa" << endl;
	cout << "bbbb" << endl;
	goto AL;
	cout << "cccc" << endl;
	cout << "dddd" << endl;
	AL:
	cout << "eeee" << endl;
	system("pause");
	return 0;
}

5,數組

數組就是一個集合,裏面存放了相同類型的數據元素

  1. 數組中的每個元素都是相同的數據類型
  2. 數組是由連續的內存位置組成的

5.1一維數組

5.1.1一維數組的定義方式

三種定義方式

  • 數據類型 數組名[數組長度];
  • 數據類型 數組名[數組長度]={值1,值2,......};
  • 數據類型 數組名[  ]={值1,值2,......};                  //系統會根據元素的個數,自己計算出數組的大小
#include<iostream>
using namespace std;
int main()
{
	int a[5];
	for (int i=0; i < 5; i++)
	{
		cout << a[i];
	}
	cout << endl;

	int b[5] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < 5; i++)
	{
		cout << b[i];
	}
	cout << endl;

	int c[] = { 1, 2, 3, 4, 5 };       //自己會計算出數組的大小
	cout << endl; for (int i = 0; i < 5; i++)
	{
		cout << c[i];
	}
	cout << endl;

	system("pause");
	return 0;
}

5.1.2一維數組組名

一維數組名稱的用途:

  • 可以統計整個數組在內存中的長度
  • 可以獲取數組在內存中的首地址
#include<iostream>
using namespace std;
int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	cout << "數組長度爲" << sizeof(a) << endl;
	cout << "數組個數爲" << sizeof(a) / sizeof(int) << endl;

	cout << "a的地址爲" << a << endl;
	cout << "a[0]的地址爲" << &a[0] << endl;

	system("pause");
	return 0;
}

5.2二維數組

就是在一維數組上多加了一個維度

5.2.1二維數組的定義方式

四種方法

  • 數據類型 數組名[行數][列數];
  • 數據類型 數組名[行數][列數]={{值1,值2},{值3,值4}};(推薦,更加直觀)
  • 數據類型 數組名[行數][列數]={值1,值2,值3,值4};
  • 數據類型 數組名[    ][列數]={值1,值2,值3,值4};                   (此處也是系統會根據元素個數,自動算出行數大小)
#include<iostream>
using namespace std;
int main()
{
    //數據類型 數組名[行數][列數];
	int a[2][2];
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			cout << a[i][j];
		}
	}
	cout << endl;

    //數據類型 數組名[行數][列數]={{值1,值2},{值3,值4}};(推薦,更加直觀)
	int b[2][2] = { { 1, 2 }, { 3, 4 } };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			cout << b[i][j];
		}
	}
	cout << endl;
    
    //數據類型 數組名[行數][列數]={值1,值2,值3,值4};
	int c[2][2] = { 1, 2, 3, 4 };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			cout << c[i][j];
		}
	}
	cout << endl;


    //數據類型 數組名[    ][列數]={值1,值2,值3,值4};     
	int d[][2] = { 1, 2, 3, 4 };
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			cout << d[i][j];
		}
	}
	cout << endl;

	system("pause");
	return 0;
}

5.2.2二維數組組名

  • 查看二維數組所佔內存空間
  • 獲取二維數組首地址
#include<iostream>
using namespace std;
int main()
{
	int a[2][2] = { { 1, 2 }, { 3, 4 } };
	cout << "二維數組長度爲" << sizeof(a) << endl;
	cout << "二維數組個數爲" << sizeof(a) / sizeof(int) << endl;
	cout << "二維數組第一行個數爲" << sizeof(a[0]) / sizeof(int) << endl;
	cout << "二維數組的行數爲" << sizeof(a) / sizeof(a[0]) << endl;

	cout << "a的地址爲" << a << endl;
	cout << "第一數的地址爲" << &a[0][0] << endl;
	cout << "第一行的首地址爲" << &a[0] << endl;
	cout << "第二行的首地址爲" << &a[1] << endl;

	system("pause");
	return 0;
}

6,函數

作用:將一段經常使用的代碼封裝起來,減少重複代碼

6.1函數的定義

  1. 返回值類型
  2. 函數名
  3. 參數列表
  4. 函數體語句
  5. return表達式

eg:返回值類型     函數名(參數列表)

      {   函數體;

          return表達式(根據返回類型確定是否有)

      }

int add(int a, int b)
{
    return a + b;
}

6.2函數的調用

功能:使用定義好的函數

語法:函數名(參數)

#include<iostream>
using namespace std;

int add(int a, int b)
{
	return a + b;
}
int main()
{
	int a = 1, b = 2;
	cout << "a+b=" << add(a, b) << endl;
	system("pause");
	return 0;
}

6.3值傳遞

  • 值傳遞就是函數調用時實參將數值傳入給形參

  • 如果形參發生變化,並不會影響形參

#include<iostream>
using namespace std;

void add(int a, int b)
{
	a = 3;
	b = 4;
	cout << "add函數中a=" << a << endl;
	cout << "add函數中b=" << b << endl;
}
int main()
{
	int a = 1, b = 2;
	add(a, b);
	cout << "main函數中a=" << a << endl;
	cout << "main函數中b=" << b << endl;
	system("pause");
	return 0;
}

6.4函數的常見樣式

四種樣式:

  • 無參無返
  • 有參無返
  • 無參有反
  • 有參有反
#include<iostream>
using namespace std;

void wuwu()
{
	cout << "無參無返" << endl;
}

void youwu(int a)
{
	a = 10;
	cout << "有參無返" << endl;
}

int wuyou()
{
	int a = 11;
	return a;
}

int youyou(int a)
{
	a = 12;
	return a;
}

int main()
{
	int a=0;
	wuwu();
	youwu(a);
	a=wuyou();
	cout << "有參無返a=" << a << endl;
	a = youyou(a);
	cout << "有參有返a=" << a << endl;

	system("pause");
	return 0;
}

6.5函數的聲明

作用:告訴編譯器函數名稱及如何調用函數,函數的實際主體可以單獨定義

  • 函數的聲明可以多次,但是函數的聲明只能有一次

void add(int a, int b);

void add(int a, int b);錯誤,只能聲明一次

6.6函數的分文件編寫

作用:讓代碼結構更加清晰

  1. 創建後綴爲.h的頭文件
  2. 創建後綴爲.cpp的頭文件
  3. 在頭文件中寫函數的聲明
  4. 在源文件中寫函數的定義

7,指針

作用:可以通過指針間接訪問內存

  • 內存編號是從0開始記錄的,一般用十六進制數字表示
  • 可以利用指針變量保存地址

7.1指針變量的定義和使用

定義語法:數據類型 *變量名

int a=10;

int *p;   //定義

p=&a;    //指針保存a的地址

指針的使用

&:取地址運算符;(&a即代表取得了a的地址)

*:間接尋址運算符;(*p即代表顯示p這個地址所存的數值)

所以p此時就等於a的地址,*p就代表把p這個地址存的數顯示出來,即*p=a=10;

7.2指針所佔內存空間

sizeof(int *);        //等於4

sizeof(char *);          //等於4

sizeof(double *);            //等於4

不論什麼類型的指針,所佔的內存空間大小都是4

7.3空指針和野指針

空指針:指針變量指向內存中編號爲0的空間

用途初始化指針變量,但是空指針指向的內存不可訪問

野指針:指針變量指向非法的內存空間

    int *q = NULL;
    cout << *q;          //錯誤空指針p不可訪問

    int *p=(int *)3000;
    cout << *p;           //p爲野指針,也不可訪問

7.4const修飾指針

三種情況:

  • 常量指針(指針的指向可以修改,但是指針的值不能修改)   即常量表示(const)在指針(*)前:const *
  • 指針常量(指針的指向不能修改,但是指針的值可以修改)   即指針(*)在常量表示(const)前:*const
  • 修飾指針又修飾常量     const * const

int n = 10,m = 20;

int const *a = &n;
//*a = m;     //錯誤常量指針,指針的值不能改變
a = &m;

int * const b = &n;
*b = m;
//b = &m;    //錯誤指針常量,指針的指向不能更改

int const * const c = &n;

7.5指針和數組

作用:利用指針訪問數組中元素

#include<iostream>
using namespace std;

int main()
{
	int b[3] = { 1, 2, 3 };     //指針
	int *a = b;
	cout << "第一個元素爲" << *a << endl;
	a++;
	cout << "第一個元素爲" << *a << endl;
	a++;
	cout << "第一個元素爲" << *a << endl;
	system("pause");
	return 0;
}

7.6指針和函數

作用:利用指針作爲函數參數,可以修改實參的值

#include<iostream>
using namespace std;

void change(int *a,int *b)
{
	int swap = *a;
	*a = *b;
	*b = swap;
}
int main()
{
	int a = 1, b = 2;
	change(&a, &b);
	cout << a << "   " << b << endl;
	system("pause");
	return 0;
}

7.7指針,配合數組和函數

#include<iostream>
using namespace std;

void change(int *a,int len)
{
	for (int i = 0; i < len; i++)
	{
		*a = i + 4;
		a++;
	}
}
int main()
{
	int a[3] = { 1, 2, 3 };
	int len = sizeof(a) / sizeof(int);
	change(a,len);
	int *p = a;
	for (int i = 0; i < sizeof(a) / sizeof(int); i++)
	{
		cout << *p << endl;
		p++;
	}
	system("pause");
	return 0;
}

8,結構體

屬於用戶自定義的數據類型,允許用戶存儲不同的數據類型

8.1結構體的定義和使用

語法:struct 結構體名{結構體列表成員};

三種創建變量的方式:

  • struct 結構體名 變量名
  • struct 結構體名 變量名={成員1值,成員2值}
  • 定義結構體時順便創建變量
#include<iostream>
#include<string>
using namespace std;

struct Student
{
	int age;
	string name;
}s;
int main()
{
	Student s1;
	s1.age = 10;
	s1.name = "張三";
	cout << s1.age << "  " << s1.name << endl;

	Student s2 = { 11, "李四" };
	cout << s2.age << "  " << s2.name << endl;

	s.age = 13;
	s.name = "黎明";
	cout << s.age << "  " << s.name << endl;

	system("pause");
	return 0;
}

8.2結構體數組

作用:將自定義的結構體放入到數組中方便維護

語法:struct 結構體名 數組名[元素個數]={{},{},{}};

8.3結構體指針

作用:利用指針訪問結構體中的成員

可以看我另一篇博客:鏈接如下

https://blog.csdn.net/qq_46423166/article/details/106274521

8.4結構體嵌套結構體

作用結構體的成員可以是另一個結構體

#include<iostream>
#include<string>
using namespace std;

struct Sorce
{
	int math;
	int english;
};

struct Student
{
	int age;
	string name;
	Sorce sorce;
}s;
int main()
{
	Student s1;
	s1.age = 10;
	s1.name = "張三";
	s1.sorce.english = 80;
	s1.sorce.math = 90;
	cout << s1.age << endl;
	cout << s1.name << endl;
	cout << s1.sorce.english << endl;
	cout << s1.sorce.math << endl;
	system("pause");
	return 0;
}

8.5結構體做函數參數

作用:將結構體作爲參數向函數中傳遞(和普通的函數傳參區別不大)

兩種傳參方式

  • 值傳遞
  • 地址傳遞

void show(Student s1)       //值傳遞;形參變,實參不變

void change(Student *s2)       //地址傳遞;形參變,實參變

8.6結構體中const使用場景

作用:用const來防止誤操作

當結構體作爲參數時,值傳遞是將實參的數據拷貝一份放到形參中,佔用內存大,效率低;

所以推薦使用地址傳遞,但是爲了防止地址傳遞時,實參被改變,所以引用const來防止被改變

void show(const Student *s1) 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章