1、一、類(lèi)型、返回值類(lèi)型 二、參數(shù)表、函數(shù)重載
2、一、實(shí)例化 二、實(shí)例化的類(lèi)型或類(lèi)類(lèi)是對(duì)象的藍(lán)圖,對(duì)象是類(lèi)的實(shí)例化
3、const
4、一個(gè) 兩個(gè)
5、一、公有繼承 二、私有繼承、保護(hù)繼承
6、抽象類(lèi)、實(shí)例化對(duì)象
7、函數(shù)模板、類(lèi)模板
8、try、catch、throw
9、流插入運(yùn)算符、流提取運(yùn)算符
10、可以、可以
11、析構(gòu)函數(shù)
程序閱讀題:
#include <iostream>
int m = 10;
void a(int n) {
n = 15 / n;
m = m / 2;
}
int main() {
int n = 3;
a(n);
std::cout << "m=" << m << std::endl;
std::cout << "n=" << n << std::endl;
return 0;
}
這段代碼的功能如下:
- 包含了iostream頭文件以使用輸入輸出流。
- 定義了一個(gè)整型變量m并初始化為10。
- 聲明了一個(gè)函數(shù)a,接受一個(gè)整型參數(shù)n。
- 在函數(shù)a中,將15除以參數(shù)n的值賦給n,然后m除以2的結(jié)果賦給m。
- 在主函數(shù)main中,定義了一個(gè)整型變量n并初始化為3。
- 調(diào)用函數(shù)a,并傳入?yún)?shù)n。
- 使用cout輸出m的值,并換行。
- 使用cout輸出n的值,并換行。
- 返回0,表示程序正常結(jié)束。
代碼的執(zhí)行流程如下: - 聲明一個(gè)整型變量m并初始化為10。
- 定義函數(shù)a,接受一個(gè)整型參數(shù)n。
- 在函數(shù)a中,將15除以參數(shù)n的值賦給n,然后將m除以2的結(jié)果賦給m。
- 在主函數(shù)main中,定義一個(gè)整型變量n并初始化為3。
- 調(diào)用函數(shù)a,并將參數(shù)n的值傳入。
- 使用cout輸出m的值為5,并換行。
- 使用cout輸出n的值為3,并換行。
- 返回0,表示程序正常結(jié)束。
最終輸出結(jié)果為:
m=5
n=3
這段代碼的功能是對(duì)變量m和n進(jìn)行一些計(jì)算操作,并輸出結(jié)果。
答案:m = 5,n = 3; 過(guò)程:a(3); ----> { n = 15/3; m = 10/2; } n是在main()函數(shù)中聲明的,n = 3,所以n = 15/3 = 5,只在函數(shù)a()的作用域中n = 5,但是a()是 void 類(lèi)型,沒(méi)有返回值,因此,回到main()函數(shù)中后,n仍然等于3。而m是全局變量,在整個(gè)程序的任何一個(gè)地方更改m的值,m的值都將改變,因此a()函數(shù)改變m的值后,main()函數(shù)中的m的值也發(fā)生了相應(yīng)的改變。所以 ,調(diào)用a(3)后,在main()函數(shù)中輸出cout<<m<<" "<<n<<endl; 結(jié)果為: 5 3
#include <iostream>
using namespace std;
class PP {
int x, y;
public:
PP() {
x = 3;
y = 5;
}
PP(int i, int j) {
x = i - y - j;
}
void Messages() {
cout << "x=" << x << " y=" << y << endl;
}
};
int main() {
PP* p1 = new PP();
PP p2(3, 4);
p2.Messages();
p1->Messages();
delete p1; // 釋放動(dòng)態(tài)分配的內(nèi)存
return 0;
}
這段代碼的分析過(guò)程如下:
- 包含了iostream頭文件以使用輸入輸出流。
- 使用了
using namespace std
來(lái)避免每次都需要寫(xiě)std::
前綴。 - 聲明了一個(gè)名為PP的類(lèi)。
- 在PP類(lèi)中,定義了私有成員變量x和y。
- 提供了兩個(gè)構(gòu)造函數(shù):一個(gè)無(wú)參構(gòu)造函數(shù),用于初始化x和y的值為3和5;一個(gè)有參構(gòu)造函數(shù),用于將傳入的參數(shù)分別賦值給x和y。
- 定義了一個(gè)名為Messages的成員函數(shù),用來(lái)輸出x和y的值。
- 定義了主函數(shù)main。
- 在主函數(shù)中,通過(guò)使用new關(guān)鍵字動(dòng)態(tài)地創(chuàng)建了一個(gè)PP類(lèi)的對(duì)象p1,并調(diào)用了其無(wú)參構(gòu)造函數(shù)。這里使用了指針p1來(lái)存儲(chǔ)對(duì)象的地址。
- 創(chuàng)建了一個(gè)PP類(lèi)的對(duì)象p2,并調(diào)用了其有參構(gòu)造函數(shù),傳入?yún)?shù)3和4。對(duì)象p2會(huì)在棧上分配內(nèi)存。
- 調(diào)用p2的Messages函數(shù),輸出x和y的值,即輸出"x=3 y=4"。
- 通過(guò)指針p1調(diào)用Messages函數(shù),輸出x和y的值,即輸出"x=3 y=5"。
- 使用delete關(guān)鍵字釋放動(dòng)態(tài)分配的內(nèi)存,即釋放p1指向的對(duì)象的內(nèi)存。
- 返回0,表示程序正常結(jié)束。
最終輸出結(jié)果為:
x=3 y=4
x=3 y=5
該代碼主要展示了類(lèi)的定義與使用。其中,類(lèi)PP包含了兩個(gè)構(gòu)造函數(shù)、兩個(gè)私有成員變量和一個(gè)成員函數(shù)。在主函數(shù)中,通過(guò)對(duì)象和指針?lè)謩e創(chuàng)建并使用了PP類(lèi)的實(shí)例。通過(guò)調(diào)用成員函數(shù)Messages,可以輸出對(duì)象的成員變量x和y的值。最后,通過(guò)delete關(guān)鍵字釋放了通過(guò)new關(guān)鍵字動(dòng)態(tài)分配的內(nèi)存,以避免內(nèi)存泄漏。
分析一下過(guò)程#include <iostream>
using namespace std;
class A {
int a;
public:
A(int aa = 0) : a(aa) {
cout << a << " ";
}
~A() {
cout << "析構(gòu)";
}
};
int main() {
A x[2] = {2};
cout << endl;
return 0;
}
這段代碼的分析過(guò)程如下:
- 包含了iostream頭文件以使用輸入輸出流。
- 使用了
using namespace std
來(lái)避免每次都需要寫(xiě)std::
前綴。 - 聲明了一個(gè)名為A的類(lèi)。
- 在A類(lèi)中,定義了一個(gè)私有成員變量a。
- 提供了一個(gè)構(gòu)造函數(shù)A,其中使用了參數(shù)的默認(rèn)值0,用于初始化a的值。構(gòu)造函數(shù)會(huì)輸出a的值。
- 定義了一個(gè)析構(gòu)函數(shù)~A,用于在對(duì)象被銷(xiāo)毀時(shí)輸出一條提示信息。
- 定義了主函數(shù)main。
- 在主函數(shù)中,創(chuàng)建了一個(gè)名為x的A類(lèi)對(duì)象數(shù)組,數(shù)組大小為2。數(shù)組中的第一個(gè)對(duì)象會(huì)調(diào)用構(gòu)造函數(shù),并將參數(shù)2傳入進(jìn)行初始化。構(gòu)造函數(shù)會(huì)輸出2。數(shù)組中的第二個(gè)對(duì)象會(huì)使用參數(shù)的默認(rèn)值0進(jìn)行初始化。構(gòu)造函數(shù)會(huì)輸出0。
- 在主函數(shù)中,輸出一個(gè)空行。
- 返回0,表示程序正常結(jié)束。
最終輸出結(jié)果為:
2 0 析構(gòu)析構(gòu)
代碼的執(zhí)行過(guò)程如下:
- 主函數(shù)開(kāi)始執(zhí)行。
- 創(chuàng)建一個(gè)名為x的A類(lèi)對(duì)象數(shù)組,數(shù)組大小為2。
- 數(shù)組中的第一個(gè)對(duì)象會(huì)調(diào)用構(gòu)造函數(shù)A(2),因此構(gòu)造函數(shù)會(huì)輸出2。
- 數(shù)組中的第二個(gè)對(duì)象會(huì)使用參數(shù)的默認(rèn)值0進(jìn)行初始化,因此構(gòu)造函數(shù)會(huì)輸出0。
- 在主函數(shù)中,輸出一個(gè)空行。
- 主函數(shù)執(zhí)行完畢,對(duì)象數(shù)組x會(huì)被銷(xiāo)毀,先銷(xiāo)毀第二個(gè)對(duì)象(析構(gòu)函數(shù)輸出"析構(gòu)"),再銷(xiāo)毀第一個(gè)對(duì)象(析構(gòu)函數(shù)輸出"析構(gòu)")。
因此,最終的輸出結(jié)果是"2 0 析構(gòu)析構(gòu)"。(** 析構(gòu)析構(gòu)中間沒(méi)有空?。?!**)
#include <iostream>
using namespace std;
class A {
int a, b;
public:
A() {
a = 0;
b = 0;
}
A(int m) {
a = m;
b = 0;
}
A(int m, int n) {
a = m;
b = n;
}
void print() {
cout << "a=" << a << " b=" << b << endl;
}
};
int main() {
A a, a2(5), a3(5, 15);
a.print();
a2.print();
a3.print();
return 0;
}
修正后的代碼的運(yùn)行結(jié)果為:
a=0 b=0
a=5 b=0
a=5 b=15
代碼的執(zhí)行過(guò)程如下:
- 包含了iostream頭文件以使用輸入輸出流。
- 使用了
using namespace std
來(lái)避免每次都需要寫(xiě)std::
前綴。 - 聲明了一個(gè)名為A的類(lèi)。
- 在A類(lèi)中,定義了兩個(gè)私有成員變量a和b。
- 提供了三個(gè)構(gòu)造函數(shù):
- 默認(rèn)構(gòu)造函數(shù)A(),將a和b都初始化為0。
- 構(gòu)造函數(shù)A(int m),將a初始化為m,b初始化為0。
- 構(gòu)造函數(shù)A(int m, int n),將a初始化為m,b初始化為n。
- 定義了一個(gè)成員函數(shù)print(),用于輸出a和b的值。
- 定義了主函數(shù)main。
- 在主函數(shù)中,分別創(chuàng)建了三個(gè)A類(lèi)對(duì)象a、a2和a3,分別使用了不同的構(gòu)造函數(shù)進(jìn)行初始化。
- 依次調(diào)用a、a2和a3的print()函數(shù),分別輸出a和b的值。
- 返回0,表示程序正常結(jié)束。
因此,最終的運(yùn)行結(jié)果為:
a=0 b=0
a=5 b=0
a=5 b=15
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "generate class A" << endl;
}
~A() {
cout << "destroy class A" << endl;
}
};
class B : public A {
public:
B() {
cout << "generate class B" << endl;
}
~B() {
cout << "destroy class B" << endl;
}
};
int main() {
B b;
return 0;
}
這段代碼定義了兩個(gè)類(lèi)A和B,并在主函數(shù)中創(chuàng)建了一個(gè)B類(lèi)對(duì)象b。類(lèi)A和類(lèi)B都定義了構(gòu)造函數(shù)和析構(gòu)函數(shù),并且類(lèi)B繼承自類(lèi)A。
在程序執(zhí)行過(guò)程中,首先創(chuàng)建了一個(gè)B類(lèi)對(duì)象b。由于B類(lèi)是A類(lèi)的子類(lèi),因此在創(chuàng)建B類(lèi)對(duì)象時(shí),會(huì)先調(diào)用A類(lèi)的構(gòu)造函數(shù),然后再調(diào)用B類(lèi)的構(gòu)造函數(shù)。因此,首先輸出"generate class A",然后輸出"generate class B"。
當(dāng)程序執(zhí)行完畢時(shí),會(huì)先銷(xiāo)毀B類(lèi)對(duì)象b,調(diào)用B類(lèi)的析構(gòu)函數(shù),輸出"destroy class B",然后調(diào)用A類(lèi)的析構(gòu)函數(shù),輸出"destroy class A"。
因此,最終的運(yùn)行結(jié)果為:
generate class A
generate class B
destroy class B
destroy class A
#include <iostream>
using namespace std;
class Base {
int x;
public:
virtual void Set(int b) {
x = b;
cout << "x=" << x << endl;
}
};
class Derived : public Base {
protected:
int y;
public:
void Set(int d) {
y = d;
cout << "y=" << y << endl;
}
};
int main() {
Base Bobj;
Derived Dobj;
Base* p;
p = &Bobj;
p->Set(100);
p = &Dobj;
p->Set(200);
return 0;
}
這段代碼定義了兩個(gè)類(lèi)Base和Derived,并在主函數(shù)中創(chuàng)建了一個(gè)Base類(lèi)對(duì)象Bobj和一個(gè)Derived類(lèi)對(duì)象Dobj。類(lèi)Base和類(lèi)Derived都定義了函數(shù)Set,并且類(lèi)Derived繼承自類(lèi)Base。
在程序執(zhí)行過(guò)程中,首先創(chuàng)建了一個(gè)Base類(lèi)對(duì)象Bobj和一個(gè)Derived類(lèi)對(duì)象Dobj。
接下來(lái),聲明了一個(gè)Base指針變量p,并將p指向Bobj。然后通過(guò)p調(diào)用Set(100)函數(shù),由于Set函數(shù)是虛函數(shù),所以會(huì)根據(jù)指針指向的對(duì)象類(lèi)型調(diào)用相應(yīng)的函數(shù)。這里p指向的是Base類(lèi)對(duì)象Bobj,所以調(diào)用了Base類(lèi)的Set函數(shù),輸出"x=100"。
然后,將p指向Dobj。再次通過(guò)p調(diào)用Set(200)函數(shù),同樣根據(jù)指針指向的對(duì)象類(lèi)型調(diào)用相應(yīng)的函數(shù)。這里p指向的是Derived類(lèi)對(duì)象Dobj,所以調(diào)用了Derived類(lèi)的Set函數(shù),輸出"y=200"。
因此,最終的運(yùn)行結(jié)果為:
x=100
y=200
#include <iostream>
using namespace std;
template <class T>
T min(T x, T y) {
cout << "function1: ";
return (x <= y) ? x : y;
}
int min(int x, int y) {
cout << "function2: ";
return (x < y) ? x : y;
}
int main() {
int i = 5, j = 6;
double d = 1.22, f = 13.21;
cout << min(i, j) << endl;
cout << min(d, f) << endl;
cout << min(d, i) << endl;
return 0;
}
這段代碼定義了一個(gè)函數(shù)模板min
和一個(gè)重載的min
函數(shù)。函數(shù)模板min
可以接受任意類(lèi)型的參數(shù),而重載的min
函數(shù)只接受兩個(gè)int類(lèi)型的參數(shù)。
在主函數(shù)中,創(chuàng)建了兩個(gè)int類(lèi)型的變量i和j,并分別初始化為5和6。還創(chuàng)建了兩個(gè)double類(lèi)型的變量d和f,并分別初始化為1.22和13.21。
接下來(lái),使用cout輸出調(diào)用min(i, j)
的結(jié)果,由于傳入的是兩個(gè)int類(lèi)型的參數(shù),因此調(diào)用的是重載的min
函數(shù),輸出"function2: 5"。
然后,使用cout輸出調(diào)用min(d, f)
的結(jié)果,由于傳入的是兩個(gè)double類(lèi)型的參數(shù),因此調(diào)用的是函數(shù)模板min
,輸出"function1: 1.22"。
最后,使用cout輸出調(diào)用min(d, i)
的結(jié)果,由于傳入的是一個(gè)double類(lèi)型和一個(gè)int類(lèi)型的參數(shù),因此調(diào)用的是函數(shù)模板min
,輸出"function1: 1.22"。
因此,最終的運(yùn)行結(jié)果為:
function2: 5
function1: 1.22
function1: 1.22
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int k = 11;
cout << "k=" << hex << k << endl;
float d = 12.34144;
cout << "d=" << setw(10) << setprecision(5) << setfill('*') << dec<< d << endl;
return 0;
}
給出的代碼是正確的。以下是代碼的執(zhí)行過(guò)程和運(yùn)行結(jié)果:
- 包含了iostream和iomanip頭文件以使用輸入輸出流和格式化輸出的函數(shù)。
- 使用了
using namespace std
來(lái)避免每次都需要寫(xiě)std::
前綴。 - 定義了主函數(shù)
main
。 - 聲明了一個(gè)int類(lèi)型的變量k,并初始化為11。
- 使用cout輸出"k=",然后使用hex表示輸出k的十六進(jìn)制形式,輸出結(jié)果為b。
- 聲明了一個(gè)float類(lèi)型的變量d,并初始化為12.34144。
- 使用cout輸出"d=",然后使用setw(10)表示輸出寬度為10個(gè)字符,使用setprecision(5)表示保留小數(shù)點(diǎn)后5位,使用setfill(‘‘)表示填充字符為’’。
- 使用dec表示以十進(jìn)制格式輸出。
- 最后使用cout輸出d的值,輸出結(jié)果為"*****12.34144"。
因此,最終的運(yùn)行結(jié)果為:
k=b
d=*****12.34144
#include <iostream>
class A {
int x;
public:
A() {
x = 2;
}
void print() {
std::cout << "x = " << x << std::endl;
}
void operator++() {
x += 5;
}
void operator--() {
x -= 2;
}
};
int main() {
A a;
++a;
a.print();
--a;
a.print();
return 0;
}
這段代碼定義了一個(gè)類(lèi) A
,并在 main()
函數(shù)中使用該類(lèi)。
類(lèi) A
包含一個(gè)私有成員變量 x
,默認(rèn)初始化為 2。類(lèi) A
還定義了以下成員函數(shù):
-
print()
函數(shù)用于輸出變量x
的值。 -
operator++()
重載了前置遞增運(yùn)算符,將變量x
的值增加 5。 -
operator--()
重載了前置遞減運(yùn)算符,將變量x
的值減少 2。
在 main()
函數(shù)中,首先創(chuàng)建了一個(gè)類(lèi) A
的對(duì)象 a
,調(diào)用構(gòu)造函數(shù)初始化 x
的值為 2。接著,通過(guò) ++a
將 x
的值增加 5,并調(diào)用 a.print()
輸出結(jié)果。然后,通過(guò) --a
將 x
的值減少 2,并再次調(diào)用 a.print()
輸出結(jié)果。
所以,程序的輸出結(jié)果應(yīng)為:
x = 7
x = 5
代碼邏輯比較簡(jiǎn)單,它主要演示了對(duì)類(lèi) A
進(jìn)行成員函數(shù)重載和對(duì)對(duì)象進(jìn)行遞增和遞減操作的功能。
#include <iostream>
class Base {
int x, y;
public:
Base(int x, int y) : x(x), y(y) {}
void Move(int m, int n) {
x += m;
y += n;
}
void Show() {
std::cout << "Base(" << x << "," << y << ")" << std::endl;
}
};
class Derived : private Base {
int x1, yl;
public:
Derived(int i, int j, int m, int n) : Base(i, j), {x1=m, yl=n;}
void Show() {
std::cout << "Next(" << x1 << "," << yl << ")" << std::endl;
}
void Move{Move(2,3);}
void Show1() {
Base::Show();
Show();
}
};
int main() {
Base b(1, 2);
b.Show();
Derived d(3, 4, 10, 15);
d.Move1();
d.Show();
d.Show1();
return 0;
}
這段代碼定義了兩個(gè)類(lèi) Base
和 Derived
,并在 main
函數(shù)中創(chuàng)建了對(duì)象進(jìn)行測(cè)試。
首先,讓我們逐行分析代碼:
#include <iostream>
這一行代碼包含了標(biāo)準(zhǔn)輸入輸出流庫(kù),使得我們可以使用 std::cout
來(lái)輸出信息。
接下來(lái)是類(lèi) Base
的定義:
class Base {
int x, y;
public:
Base(int x, int y) : x(x), y(y) {}
void Move(int m, int n) {
x += m;
y += n;
}
void Show() {
std::cout << "Base(" << x << "," << y << ")" << std::endl;
}
};
類(lèi) Base
有兩個(gè)私有成員變量 x
和 y
,表示整數(shù)坐標(biāo)。構(gòu)造函數(shù) Base(int x, int y)
用于初始化這兩個(gè)成員變量。成員函數(shù) Move(int m, int n)
將 x
和 y
分別增加 m
和 n
。成員函數(shù) Show()
輸出 x
和 y
的值。
接下來(lái)是類(lèi) Derived
的定義:
class Derived : private Base {
int x1, y1;
public:
Derived(int i, int j, int m, int n) : Base(i, j), x1(m), y1(n) {}
void Show() {
std::cout << "Next(" << x1 << "," << y1 << ")" << std::endl;
}
void Move() {
Base::Move(2, 3);
}
void ShowAll() {
Base::Show();
Show();
}
};
類(lèi) Derived
私有繼承自 Base
,意味著 Derived
類(lèi)中的成員函數(shù)可以訪問(wèn) Base
類(lèi)的公有成員函數(shù)。類(lèi) Derived
有兩個(gè)私有成員變量 x1
和 y1
,表示另外一組整數(shù)坐標(biāo)。構(gòu)造函數(shù) Derived(int i, int j, int m, int n)
初始化基類(lèi) Base
的成員變量,以及派生類(lèi) Derived
自己的成員變量。成員函數(shù) Show()
輸出派生類(lèi)的坐標(biāo)。成員函數(shù) Move()
調(diào)用基類(lèi) Base
的 Move()
函數(shù),并傳遞參數(shù) (2, 3)
來(lái)增加 Base
對(duì)象的坐標(biāo)。成員函數(shù) ShowAll()
先調(diào)用基類(lèi) Base
的 Show()
函數(shù),然后再調(diào)用派生類(lèi) Derived
的 Show()
函數(shù)。
最后是 main
函數(shù):
int main() {
Base b(1, 2);
b.Show();
Derived d(3, 4, 10, 15);
d.Move();
d.Show();
d.ShowAll();
return 0;
}
在 main
函數(shù)中,首先創(chuàng)建了一個(gè) Base
對(duì)象 b
,并調(diào)用其成員函數(shù) Show()
輸出 (1, 2)
。接下來(lái),創(chuàng)建了一個(gè) Derived
對(duì)象 d
,并通過(guò)構(gòu)造函數(shù)進(jìn)行初始化。然后,調(diào)用 d.Move()
函數(shù),使得基類(lèi) Base
的坐標(biāo)增加 (2, 3)
。接著,調(diào)用 d.Show()
輸出派生類(lèi) Derived
的坐標(biāo) (10, 15)
。最后,調(diào)用 d.ShowAll()
函數(shù),先輸出基類(lèi) Base
的坐標(biāo) (1, 2)
,然后輸出派生類(lèi) Derived
的坐標(biāo) (10, 15)
。
根據(jù)代碼的邏輯,以下是程序運(yùn)行后的輸出結(jié)果:
Base(1, 2)
Next(10, 15)
Base(3, 4)
Next(10, 15)
首先,使用 Base
類(lèi)創(chuàng)建對(duì)象 b
,然后調(diào)用 b.Show()
輸出 (1, 2)
。
接著,使用 Derived
類(lèi)創(chuàng)建對(duì)象 d
,并傳入?yún)?shù) (3, 4, 10, 15)
進(jìn)行初始化。然后,調(diào)用 d.Move()
函數(shù),將基類(lèi) Base
的坐標(biāo)增加 (2, 3)
。
接下來(lái),調(diào)用 d.Show()
輸出派生類(lèi) Derived
的坐標(biāo) (10, 15)
。
最后,調(diào)用 d.ShowAll()
函數(shù),先輸出基類(lèi) Base
的坐標(biāo) (3, 4)
,然后輸出派生類(lèi) Derived
的坐標(biāo) (10, 15)
。
請(qǐng)注意,由于類(lèi) Base
的成員函數(shù) Move()
和 Show()
都沒(méi)有聲明為虛函數(shù),因此在通過(guò)基類(lèi)指針或引用調(diào)用這些函數(shù)時(shí)將無(wú)法實(shí)現(xiàn)多態(tài)性。在這個(gè)例子中,直接通過(guò)對(duì)象調(diào)用了相應(yīng)的函數(shù),而不是通過(guò)指針或引用。
程序填空
#include <iostream>
class A {
public:
——————————————————
int x, y;
public:
A(int i, int j) : x(i), y(j) {}
void Show() {
std::cout << "x: " << x << ", y: " << y << std::endl;
}
};
int main() {
A a(1, 2);
a.Show(); // 調(diào)用 Show() 成員函數(shù)輸出對(duì)象的坐標(biāo)信息
return 0;
}
程序設(shè)計(jì)題(共20分)
編寫(xiě)一個(gè)輸出學(xué)校教師和后勒職員信息的程序。設(shè)計(jì)基類(lèi)People,屬性包括“工號(hào)”和“姓名”:派生類(lèi)教師類(lèi)Teacher和后勒職員類(lèi)worker中分別新增屬稚“職稱(chēng)”和“工齡”,并設(shè)計(jì)主函數(shù)進(jìn)行測(cè)試。要求:
1,定義構(gòu)造函數(shù)和輸出成員函數(shù):
2.使用擴(kuò)充繼承實(shí)現(xiàn)派生類(lèi)人員信息的輸出。
根據(jù)你的需求,我為你提供了一個(gè)滿(mǎn)足要求的 C++ 程序示例:
#include <iostream>
#include <string>
// 基類(lèi) People
class People {
protected:
int id; // 工號(hào)
std::string name; // 姓名
public:
People(int id, const std::string& name)
: id(id), name(name) {}
// 輸出成員函數(shù)
void display() const {
std::cout << "工號(hào): " << id << std::endl;
std::cout << "姓名: " << name << std::endl;
}
};
// 派生類(lèi) Teacher
class Teacher : public People {
private:
std::string title; // 職稱(chēng)
public:
Teacher(int id, const std::string& name, const std::string& title)
: People(id, name), title(title) {}
// 輸出成員函數(shù)(覆蓋基類(lèi)的 display 函數(shù))
void display() const {
People::display(); // 先調(diào)用基類(lèi)的 display 函數(shù)
std::cout << "職稱(chēng): " << title << std::endl;
}
};
// 派生類(lèi) Worker
class Worker : public People {
private:
int workYears; // 工齡
public:
Worker(int id, const std::string& name, int workYears)
: People(id, name), workYears(workYears) {}
// 輸出成員函數(shù)(覆蓋基類(lèi)的 display 函數(shù))
void display() const {
People::display(); // 先調(diào)用基類(lèi)的 display 函數(shù)
std::cout << "工齡: " << workYears << "年" << std::endl;
}
};
int main() {
People p(1, "張三");
p.display();
std::cout << std::endl;
Teacher t(2, "李四", "教授");
t.display();
std::cout << std::endl;
Worker w(3, "王五", 5);
w.display();
std::cout << std::endl;
return 0;
}
在這個(gè)程序中,定義了一個(gè)基類(lèi) People
,以及兩個(gè)派生類(lèi) Teacher
和 Worker
,并實(shí)現(xiàn)所需的構(gòu)造函數(shù)和輸出成員函數(shù)?;?lèi) People
包含工號(hào)和姓名屬性,并提供了 display
函數(shù)用于輸出成員信息。派生類(lèi) Teacher
和 Worker
分別新增了職稱(chēng)和工齡屬性,并通過(guò)覆蓋 display
函數(shù)實(shí)現(xiàn)了派生類(lèi)成員信息的輸出。
在 main
函數(shù)中,創(chuàng)建了一個(gè)基類(lèi) People
的對(duì)象 p
,以及兩個(gè)派生類(lèi)對(duì)象 Teacher
和 Worker
的對(duì)象 t
和 w
。分別調(diào)用它們的 display
函數(shù),輸出各自的成員信息。
程序輸出結(jié)果為:
工號(hào): 1
姓名: 張三
工號(hào): 2
姓名: 李四
職稱(chēng): 教授
工號(hào): 3
姓名: 王五
工齡: 5年
當(dāng)你運(yùn)行這個(gè)程序時(shí),它將創(chuàng)建一個(gè)基類(lèi) People
的對(duì)象 p
,并使用構(gòu)造函數(shù)初始化工號(hào)為1,姓名為"張三"。然后調(diào)用 display
函數(shù)輸出該對(duì)象的成員信息:
工號(hào): 1
姓名: 張三
接下來(lái),程序創(chuàng)建一個(gè)派生類(lèi) Teacher
的對(duì)象 t
,并使用構(gòu)造函數(shù)初始化工號(hào)為2,姓名為"李四",職稱(chēng)為"教授"。由于 Teacher
類(lèi)中覆蓋了基類(lèi) People
的 display
函數(shù),所以在調(diào)用 t.display()
時(shí)會(huì)先調(diào)用基類(lèi)的 display
函數(shù),輸出工號(hào)和姓名,然后再輸出職稱(chēng):
工號(hào): 2
姓名: 李四
職稱(chēng): 教授
然后,程序創(chuàng)建一個(gè)派生類(lèi) Worker
的對(duì)象 w
,并使用構(gòu)造函數(shù)初始化工號(hào)為3,姓名為"王五",工齡為5年。同樣地,由于 Worker
類(lèi)中覆蓋了基類(lèi) People
的 display
函數(shù),所以在調(diào)用 w.display()
時(shí)會(huì)先調(diào)用基類(lèi)的 display
函數(shù),輸出工號(hào)和姓名,然后再輸出工齡:
工號(hào): 3
姓名: 王五
工齡: 5年
這樣,程序通過(guò)擴(kuò)充繼承實(shí)現(xiàn)了輸出不同類(lèi)的人員信息,并且派生類(lèi)中新增的屬性也得以正確輸出。
這個(gè)程序示例展示了面向?qū)ο缶幊讨械睦^承和多態(tài)的概念?;?lèi) People
定義了所有人員共有的屬性和行為,而派生類(lèi) Teacher
和 Worker
在繼承基類(lèi)的同時(shí)增加了各自獨(dú)有的屬性,并通過(guò)覆蓋基類(lèi)的函數(shù)實(shí)現(xiàn)了特定的行為。這種設(shè)計(jì)使得我們可以在統(tǒng)一的接口下操作不同類(lèi)型的對(duì)象,并根據(jù)對(duì)象的實(shí)際類(lèi)型調(diào)用對(duì)應(yīng)的函數(shù)。
在這個(gè)程序中,我們使用了面向?qū)ο缶幊痰娜筇匦灾唬?strong>繼承。通過(guò)繼承,派生類(lèi)可以從基類(lèi)繼承屬性和方法,并且可以添加自己的額外屬性和方法。這使得我們可以利用代碼的復(fù)用性,避免重復(fù)編寫(xiě)相似的代碼。
在示例中,Teacher
類(lèi)和 Worker
類(lèi)分別是基類(lèi) People
的派生類(lèi)。它們繼承了 People
類(lèi)中的成員變量 id
和 name
,并分別新增了屬于自己的成員變量 title
和 workYears
。
為了實(shí)現(xiàn)繼承,我們使用了 public
訪問(wèn)修飾符來(lái)指定派生類(lèi)對(duì)基類(lèi)成員的訪問(wèn)權(quán)限。具體來(lái)說(shuō),在 Teacher
類(lèi)和 Worker
類(lèi)的定義中,我們使用 : public People
將它們聲明為公有繼承關(guān)系。
此外,在 Teacher
類(lèi)和 Worker
類(lèi)中,我們還覆蓋(override)了基類(lèi) People
中的 display
函數(shù)。通過(guò)使用相同的函數(shù)名稱(chēng)和簽名,派生類(lèi)可以重寫(xiě)(override)基類(lèi)中已經(jīng)存在的函數(shù),并且通過(guò)關(guān)鍵字 override
明確表明這是對(duì)基類(lèi)函數(shù)的重寫(xiě)。在派生類(lèi)中,我們先調(diào)用基類(lèi)的 display
函數(shù),然后再在輸出中添加額外的信息,實(shí)現(xiàn)了對(duì)派生類(lèi)的特定輸出。
這個(gè)示例還展示了多態(tài)(polymorphism)的概念。多態(tài)允許我們通過(guò)基類(lèi)指針或引用來(lái)操作派生類(lèi)對(duì)象,以達(dá)到統(tǒng)一的接口。在 main
函數(shù)中,我們創(chuàng)建了基類(lèi) People
的對(duì)象 p
,以及派生類(lèi) Teacher
和 Worker
的對(duì)象 t
和 w
。然后,我們分別調(diào)用它們的 display
函數(shù),盡管它們的類(lèi)型不同,但由于多態(tài)性,它們都會(huì)調(diào)用正確的成員函數(shù)來(lái)輸出各自的信息。
總結(jié)起來(lái),繼承和多態(tài)是面向?qū)ο缶幊讨蟹浅V匾母拍?。它們提供了代碼的組織和重用的機(jī)制,使得程序更加靈活和可擴(kuò)展。通過(guò)繼承,我們可以構(gòu)建出更豐富的類(lèi)層次結(jié)構(gòu),通過(guò)多態(tài),我們可以以統(tǒng)一的方式操作不同類(lèi)型的對(duì)象。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-511419.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-511419.html
到了這里,關(guān)于西安石油大學(xué)期末考試C++真題解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!