wordpress網(wǎng)站搭建教程視頻山東濰坊疫情最新消息
文章目錄
- 筆試強(qiáng)訓(xùn)12
- 一、選擇題
- 1-5題
- 6-10題
- 二、編程題
- 題目一
- 題目二
- 筆試強(qiáng)訓(xùn)13
- 一、選擇題
- 1-5題
- 6-10題
- 二、編程題
- 題目一
- 題目二
- 筆試強(qiáng)訓(xùn)14
- 一、選擇題
- 1-5題
- 6-10題
- 二、編程題
- 題目一
- 題目二
筆試強(qiáng)訓(xùn)12
一、選擇題
1-5題
引用:是一個(gè)別名,與其被引用的實(shí)體公用一份內(nèi)存空間,編譯器不會(huì)給引用變量單獨(dú)開辟新的空間。A錯(cuò)誤
故選A。
A:析構(gòu)函數(shù)可以在類內(nèi)定義也可以在類外定義
B:一個(gè)類中只有一個(gè)析構(gòu)函數(shù),但可以有多個(gè)構(gòu)造函數(shù)
C:析構(gòu)函數(shù)和類名相同,不過是前面多一個(gè)~而已。
D:析構(gòu)函數(shù)沒有參數(shù)
故選B
運(yùn)算符重載基礎(chǔ)知識不做解釋
選A。
第一行MyClass c1,會(huì)調(diào)用一次構(gòu)造函數(shù),而MyClass *c2,則不會(huì)調(diào)用,在c2調(diào)用new的時(shí)候才會(huì)調(diào)用構(gòu)造函數(shù)
第二行new了一個(gè)MyClass對象,分配空間的同時(shí)會(huì)調(diào)用構(gòu)造函數(shù)
第三行,引用不會(huì)調(diào)用構(gòu)造函數(shù)
故一共調(diào)用了兩次構(gòu)造函數(shù)。
故選B。
類是面向?qū)ο蟮?#xff0c;C中的結(jié)構(gòu)體是面向過程的,二者不一樣,A錯(cuò)誤。
故選A。
6-10題
A:一個(gè)類可以有很多個(gè)對象,如果把類設(shè)置成單例模式的話,那這個(gè)類就只能實(shí)例化一個(gè)對象了。故A錯(cuò),選A
BCD都是類和對象的一些常識,可以記一記。
我們知道,在C++中delete的作用是先調(diào)用對應(yīng)的析構(gòu)函數(shù),然后再釋放空間,在本題中,在析構(gòu)函數(shù)中調(diào)用delete,而delete又會(huì)調(diào)用析構(gòu)函數(shù),析構(gòu)函數(shù)又會(huì)調(diào)用delete,delete又會(huì)調(diào)用析構(gòu)函數(shù),如此一來就停不下來了,會(huì)引發(fā)無窮遞歸調(diào)用,最終就會(huì)導(dǎo)致棧溢出,程序崩潰。
下圖中我們也是可以看到,調(diào)用堆棧說已經(jīng)超出了VS支持的最多堆棧幀數(shù)。
但是呢,本題答案并不選B,而是C,無法編譯通過,因?yàn)轭}目中有一句this=NULL,C++中this指針是const修飾的,不可以被更改的,所以就會(huì)導(dǎo)致無法編譯通過。
故選C。
C正確,不加解釋
類中的每個(gè)非靜態(tài)成員函數(shù)都有一個(gè)隱含的this指針
A:普通的函數(shù)沒有隱含的this指針,因?yàn)樗皇穷惖某蓡T函數(shù)。
B:被static修飾的靜態(tài)成員函數(shù)沒有隱含的this指針,故靜態(tài)成員函數(shù)不能訪問類中的非靜態(tài)的成員變量。
C:友元函數(shù)不是類的成員函數(shù),友元函數(shù)沒有this指針,也不會(huì)受到訪問限定符的限制。
D:是類的成員函數(shù),且不被static修飾,故有隱含的this指針。
故選D。
堆上的都是動(dòng)態(tài)分配的,棧上的既可以動(dòng)態(tài)分配,也可以靜態(tài)分配。
故C錯(cuò)誤。選C。
二、編程題
題目一
題目鏈接:
二進(jìn)制插入
提交代碼:
class BinInsert {
public:int binInsert(int n, int m, int j, int i) {// write code herereturn n | (m<<j);}
};
運(yùn)行結(jié)果:
題目二
題目鏈接:
查找組成一個(gè)偶數(shù)最接近的兩個(gè)素?cái)?shù)
提交代碼:
#include <iostream>
#include <cmath>
using namespace std;bool isprime(int sum) {for (int i = 2; i <= sqrt(sum); i++) {if (sum % i == 0)return false;}return true;
}
int main() {int sum, half, i;while (cin >> sum) {half = sum / 2;for (half; half >= 2; half--) {if (isprime(half) && isprime(sum - half))break;}cout << half << endl << sum - half << endl;}
}
// 64 位輸出請用 printf("%lld")
運(yùn)行結(jié)果:
筆試強(qiáng)訓(xùn)13
一、選擇題
1-5題
父類的公有成員在派生類中的權(quán)限取決于公有繼承還是私有繼承還是保護(hù)繼承。
第一次通過A調(diào)用display,顯示0.然后通過A調(diào)用change和display,顯示2…之后B調(diào)用change和display,顯示1.
故選C。
A錯(cuò)誤:派生類重寫的基類虛函數(shù)必須參數(shù)個(gè)數(shù)類型順序都相同
B正確:內(nèi)聯(lián)函數(shù)不能是虛函數(shù)。虛表里要存的是虛函數(shù)的地址,而inline是會(huì)把函數(shù)展開的,沒有地址的,所以內(nèi)聯(lián)函數(shù)不能是虛函數(shù)。
C錯(cuò)誤:派生類不是必須重新定義基類的虛函數(shù),定義不定義都可以。
D錯(cuò)誤:虛函數(shù)的調(diào)用是需要通過this指針調(diào)用對象的信息,才能調(diào)用對象的虛表,而static函數(shù)沒有this指針故D錯(cuò)誤。
故選B
在派生類對象初始化的時(shí)候會(huì)先調(diào)用基類的構(gòu)造函數(shù),再調(diào)用派生類的構(gòu)造函數(shù)。由于要1遵守先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu)。所以最后會(huì)先調(diào)用派生類的析構(gòu)函數(shù),再調(diào)用基類的構(gòu)造函數(shù)。
AB:沒有定義,編譯器會(huì)自動(dòng)產(chǎn)生,所以還是會(huì)調(diào)用
D錯(cuò)誤
故選C。
A正確:聲明純虛函數(shù)的類不能實(shí)例化,繼承它的派生類必須重寫該函數(shù),才能實(shí)例化對象,否則,派生類也不能實(shí)例化出對象來。
B錯(cuò)誤:聲明純虛函數(shù)的類是抽象類,不叫虛基類。解決菱形繼承的時(shí)候,如下圖所示,類A才是虛基類。
C錯(cuò)誤:子類的必須重寫父類的虛函數(shù),錯(cuò)誤的,想實(shí)現(xiàn)多態(tài)就重寫,不想就不重寫。
D錯(cuò)誤:純虛函數(shù)也可以是有實(shí)現(xiàn)的函數(shù)
故選A
6-10題
A錯(cuò)誤:是一個(gè)常量指針,但不是p的值不可以修改,而是p指向的內(nèi)容不可以修改。
B錯(cuò)誤:64位下指針大小是8字節(jié),32位下指針大小是4字節(jié),故大小是8,
C錯(cuò)誤:這倆都會(huì)展開,效率其實(shí)差不多。
D正確:重載是靜態(tài)多態(tài),是編譯時(shí)確定的,虛函數(shù)是動(dòng)態(tài)多態(tài)是運(yùn)行時(shí)綁定的。
靜態(tài)多態(tài)有兩種實(shí)現(xiàn)方式:
- 函數(shù)重載:包括普通函數(shù)的重載和成員函數(shù)的重載
- 函數(shù)模板的使用
故只有一個(gè)正確故選A。
當(dāng)父類指針指向子類對象的時(shí)候即,Base* p=new Derive,當(dāng)delete p的時(shí)候,只會(huì)調(diào)用父類的析構(gòu)函數(shù),這樣就會(huì)導(dǎo)致子類的資源沒釋放造成資源泄露了。如果父類的析構(gòu)函數(shù)定義成虛函數(shù)的話,就會(huì)和子類的析構(gòu)函數(shù)構(gòu)成重載,這樣delete p的時(shí)候就會(huì)根據(jù)多態(tài),調(diào)用子類的析構(gòu)函數(shù),子類的析構(gòu)函數(shù)又會(huì)自動(dòng)調(diào)用父類的析構(gòu)函數(shù)1,就不會(huì)造成資源泄露。
故選A。
B錯(cuò)誤,顯然還有運(yùn)算符重載:
故選B。
5調(diào)用構(gòu)造函數(shù)實(shí)例化一個(gè)對象,通過拷貝構(gòu)造賦值給形參b,但編譯器會(huì)優(yōu)化,這里直接把5構(gòu)造出來的對象當(dāng)b了,省了一次拷貝構(gòu)造,然后返回b,這里編譯器又會(huì)直接優(yōu)化,最后b析構(gòu),temp析構(gòu)。故最后會(huì)調(diào)用一次構(gòu)造兩次析構(gòu)。
故選A。
選B,不多解釋了。
二、編程題
題目一
題目鏈接:
參數(shù)解析
提交代碼:
#include<iostream>
#include<string>
#include<vector>
using namespace std;void cmdLineParse(const string& str) {string tmp = "";vector<string> svec;bool flag = false; //用于判斷是否處于字符串的狀態(tài)for (int i = 0; i < str.size(); ++i) {if (str[i] == '"') { //判斷是否是字符串的起始或者結(jié)束flag = !flag; //說明處于了字符串的狀態(tài)} else if (str[i] == ' ' &&!flag) { //判斷參數(shù)的分隔或者是否為字符串的內(nèi)容svec.push_back(tmp);tmp = "";} else { //正常的參數(shù)內(nèi)容tmp += str[i]; //xcopy}}svec.push_back(tmp); //追加最后一個(gè)參數(shù)cout << svec.size() << endl;for (int i = 0; i < svec.size(); ++i)cout << svec[i] << endl;
}int main() {string str;while (getline(cin, str)) {cmdLineParse(str);}return 0;
}
運(yùn)行結(jié)果:
題目二
題目鏈接:
跳石板
提交代碼:
#include<iostream>
#include<vector>
#include<limits.h>
#include<math.h>
using namespace std;void get_div_num(int v, vector<int>& a) {for (int i = 2; i <= sqrt(v); ++i) {if (v % i == 0) {a.push_back(i);if (v / i != i)a.push_back(v / i);}}
}int Jump(int n, int m) {vector<int> step(m + 1, INT_MAX); //int_max表示不可達(dá)到step[n] = 0; //當(dāng)前位置初始化for (int i = n; i < m; ++i) {if (step[i] == INT_MAX)continue;vector<int> a;
//獲取i的約數(shù),并保存get_div_num(i, a);for (int j = 0; j < a.size(); ++j) {if (a[j] + i <= m && step[a[j] + i] != INT_MAX) {
//需要挑選一個(gè)最小值step[a[j] + i] = step[a[j] + i] < step[i] + 1 ? step[a[j] + i] : step[i] + 1;} else if (a[j] + i <= m) {step[a[j] + i] = step[i] + 1;}}}return step[m] == INT_MAX ? -1 : step[m];
}int main() {int n, m, min_step;while (cin >> n >> m) {min_step = Jump(n, m);cout << min_step << endl;}return 0;
}
運(yùn)行結(jié)果:
筆試強(qiáng)訓(xùn)14
一、選擇題
1-5題
this指針的作用就是實(shí)例化出很多對象,保證A的對象中可以通過this指針找到A的數(shù)據(jù)成員,而不是其他對象的數(shù)據(jù)。
故選D。
引用和const修飾的必須在初始化列表中初始化。
static const可以在類外初始化。
故選F。
A:不能重載下面的運(yùn)算符:
- sizeof sizeof 運(yùn)算符。
- . 成員運(yùn)算符。
- .* 成員指針運(yùn)算符。
- :: 作用域解析運(yùn)算符。
- ?: 條件運(yùn)算符。
B正確
C錯(cuò)誤:析構(gòu)函數(shù)可以是虛函數(shù),構(gòu)造函數(shù)不行
D錯(cuò)誤:函數(shù)重載返回值不一定得相同
故選B。
A正確,6大默認(rèn)函數(shù)編譯器會(huì)自動(dòng)生成
B錯(cuò)誤:析構(gòu)函數(shù)只能有一個(gè)
C錯(cuò)誤: 析構(gòu)函數(shù)可以為virtual,但不能重載
D錯(cuò)誤:可以利用一個(gè)static成員函數(shù)new并返回該類的指針,這樣就可以創(chuàng)建了
故選A。
優(yōu)先用組合,而不是繼承故C錯(cuò)誤
選C。
6-10題
A錯(cuò)誤:如果子類沒有重寫父類的虛函數(shù),或者父類壓根沒有虛函數(shù)的話,即使子類父類中的函數(shù)一摸一樣,那父類指針調(diào)用的也是父類的函數(shù),即使該父類指針指向的是子類對象。
C:錯(cuò)誤,重載和子類一點(diǎn)關(guān)系都沒有
D:錯(cuò)誤a是個(gè)指針,調(diào)用的時(shí)候應(yīng)該a->
而不是a.
故全錯(cuò),選B。
父類指針指向子類對象, i初始值為1.之后pb調(diào)用func1函數(shù),由于該函數(shù)不是虛函數(shù),所以調(diào)用的是父類的func1,i*=10,i變成10,之后調(diào)用了func2,func2是虛函數(shù),構(gòu)成多態(tài)了,調(diào)用的是子類的func2,i+=2,i變成12。
故最后輸出12,選C。
void func(B0 ptr);這里形參不是父類的指針,也不是父類的引用,所以不會(huì)發(fā)生多態(tài),所以輸出的都是B0::display()
故選A。
A:構(gòu)造函數(shù)不能為虛函數(shù)A錯(cuò)
B:析構(gòu)函數(shù)可以被定義為虛函數(shù)B正確
C:內(nèi)斂成員函數(shù)沒有地址,虛表中要存函數(shù)的地址的,沒地址沒辦法構(gòu)成多態(tài),所以不能定義為虛函數(shù)
D:靜態(tài)成員函數(shù)沒有this指針,而多態(tài)需要用this指針找對應(yīng)的資源,故D錯(cuò)誤。
故選B。
考察的是構(gòu)造函數(shù)先調(diào)用父類構(gòu)造函數(shù),再調(diào)用子類構(gòu)造函數(shù)。由此可以得出再構(gòu)造D的時(shí)候會(huì)先構(gòu)造B,B構(gòu)造的時(shí)候要先構(gòu)造A,A構(gòu)造完構(gòu)造B,B構(gòu)造完構(gòu)造C,由于這里是virtual繼承,所以A只有一份,C構(gòu)造完構(gòu)造D,綜上選A。
二、編程題
題目一
題目鏈接:
計(jì)算日期到天數(shù)轉(zhuǎn)換
提交代碼:
#include <iostream>
using namespace std;bool isLeap(int year) {return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int get(int year, int month, int day) {int mon[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int res = 0;if (month == 1) return day;for (int i = 0; i < month - 1; i++) {res += mon[i];}if (isLeap(year) && month > 2) res += 1;return res + day;
}int main() {int year, month, day;while (cin >> year >> month >> day ) {cout << get(year, month, day);}
}
運(yùn)行結(jié)果:
題目二
題目鏈接:
幸運(yùn)的袋子
提交代碼:
#include <cstddef>
#include<vector>
#include <iostream>
#include<algorithm>
using namespace std;int getLuckyPacket(int x[], int n, int pos, int sum, int multi) {int count = 0;for (int i = pos; i < n; i++) {sum += x[i];multi *= x[i];if (sum > multi) {count += 1 + getLuckyPacket(x, n, i + 1, sum, multi);} else if (x[i] == 1) {count += getLuckyPacket(x, n, i + 1, sum, multi);} else {break;}sum -= x[i];multi /= x[i];while (i < n - 1 && x[i] == x[i + 1]) {i++;}}return count;
}
int main() {int n;while (cin >> n) {int x[n];for (int i = 0; i < n; i++) {cin >> x[i];}sort(x, x + n);
//從第一個(gè)位置開始搜索cout << getLuckyPacket(x, n, 0, 0, 1) << endl;}return 0;
}
運(yùn)行結(jié)果: