聲明:專欄中專項小練題目來源牛客網,若有侵權,聯繫博主即刪除;
專項小練(一)
1 字符型變量說明
//\:不是字符,\\纔是
ch = '\';
//ch = 65 對應ASCII中字符A
ch = 62+3;
//空
ch = NULL;
//表示十六進制字符,“十、八、二進制字符”
ch = '\xaa'
2 使用VC編譯成32位可執行程序,**求類的大小
**
C++標準規定類的大小不爲0,空類的大小爲1,當類不包含虛函數和非靜態數據成員時,其對象大小也爲1,所以nLenA和nLenAObject的值爲1;
如果在類中聲明瞭虛函數(不管是1個還是多個),那麼在實例化對象時,編譯器會自動在對象裏安插一個指針指向虛函數表VTable,在32位機器上,一個對象會增加4個字節來存儲此指針,它是實現面向對象中多態的關鍵。因此,LenB和nLenBObject的值爲4;
對於普通繼承,派生類和基類共享虛函數指針,派生類對象的存儲空間=基類存儲空間+派生類特有的非static數據成員的空間,由於t_classA爲空類,t_classB和t_classC共享虛函數指針,因此LenC和nLenCObject的值爲4;
3 關鍵字const和static聲明變量
static變量連接期被分配到了data段,即使是在函數調用中定義也不會在棧中產生,而是在程序加載期就被加入了內存;
const表面含義是個常量,但實際上還是佔據一個內存位置的變量,但是它的值一般實在編譯時期就決定了;
注:static變量內存分配、const
4 關於new的理解
new創建的對象需要使用delete進行釋放;
- new創建對象不一定需要定義初始值;
- new會調用構造函數;
- new可以用來創建對象和對象數組,且調用構造函數;
5 在一個vector中查找匹配值value並刪除
for (std::vector::iterator iter = numbers.begin(); iter != numbers.end(); )
{
if (*iter ==value)
{
iter = numbers.erase(iter);
}
else
{
++iter;
}
}
測試
#include<iostream>
#include<vector>
using namespace std;
int main(){
// vector<int> numbers(10);
vector<int> numbers;
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(4);
for(vector<int>::itertor it = numbers.begin();it!=numbers.end();++it)
cout<<*it<<" "
int value = 2;
for (vector<int>::iterator iter = numbers.begin(); iter != numbers.end(); ++iter)
{
if (*iter ==value)
{
numbers.erase(iter);
cout<<*iter<<endl;
iter--;
cout<<*iter<<endl;
}
}
return 0;
}
1 2 3 4
3
1
在利用迭代器遍歷元素並刪除後,迭代器會自動指向該元素的後一位置;
iter--;//爲了抵消for循環中++iter,沒有遍歷全部元素位置,
迭代器遍歷容器元素,找到元素值爲2對應位置並刪除,自動返回下一個元素的位置,並接着遍歷後續元素;
若value值爲容器的第一個元素,則該程序出錯:
1 2 3 4
2
268468064
修改爲:
for (vector<int>::iterator iter = numbers.begin(); iter != numbers.end(); ++iter)
{
if (*iter ==value)
{
cout<<*iter<<endl;
numbers.erase(iter);
if(iter!=numbers.begin()){
iter--;
cout<<*iter<<endl;
}
}
}
6 類中虛函數、靜態成員函數調用
b->FunctionB();//用法錯誤
虛函數本質上是通過類對象的虛表進行訪問,而且類的成員函數除了虛函數,其他都不存儲在類當中,因此類對象不存在的情況下,無法使用虛函數,其他函數都可以正常訪問(前提是這些函數都沒有存取類對象的成員變量)
重載(overload)和重寫(override)的區別?
重載:是指允許存在多個同名函數,而這些函數的參數表不同;
重寫:是指子類重新定義復類虛函數的方法;
7 繼承中訪問控制
公用(public):訪問權限最高;除派生類外,外部函數也可以直接訪問(無論是成員變量還是成員函數)。;
私有(private):訪問權限最低;只能是該類內部函數互相調用,派生類、外部函數都不能訪問;
保護(protect):訪問權限中間;該類內部函數、派生類都能訪問,外部類、外部函數不能訪問 ;
基類中的private成員在派生類中是不可被訪問的,並不是private的。
8 函數用法
當鍵盤輸入20,程序的運行結果是15
#include <iostream>
#include <vector>
using namespace std;
int main()
{ vector<int> A(10);
int count=0,n;
cout<<"請輸入n的值:";
cin>>n;
A.__________(n);
for(int i=2;i<=n;i++)
if(i%3==0&&i%5==0) A[count++]=i;
for(i=0;i<count;i++)
cout<<A[i]<<" ";
cout<<endl;}
reserve(n)
調用reserve(n)後,若容器的capacity<n,則重新分配內存空間,從而使得capacity等於resize(n);
調整容器的長度大小,使其能容納n個元素。如果n小於容器的當前的size,則刪除多出來的元素。否則,添加採用值初始化的元素;
原來容器大小是10,I=15纔會有A[count++]=15,所以要調整大小;
reserve
std::reverse
template
void reverse (BidirectionalIterator first, BidirectionalIterator last);
Reverses the order of the elements in the range [first,last).
The function calls iter_swap to swap the elements to their new locations.
The behavior of this function template is equivalent to:
大意如下:
反轉範圍內元素的順序[frist,last]
函數調用iter_swap將元素交換到它們的新位置;
此函數模板的功能等效於:
template <class BidirectionalIterator>
void reverse (BidirectionalIterator first, BidirectionalIterator last)
{
while ((first!=last)&&(first!=--last)) {
std::iter_swap (first,last);
++first;
}
}
9 C語言中數據存儲形式
- 負數在內存中存儲的是補碼形式
- 正數在內存中以原碼形式存儲
- 浮點數是採用某種規則轉換後存儲
- char型是直接將其對應的ASCII碼存儲
10 關於printf用法?
int x;
x = printf("I See, Sea in C");
printf("x=%d", x);
//I See, Sea in Cx=15
int printf ( const char * format, … );返回值:
正確返回輸出的字符總數(不包括後面的‘\0’),錯誤返回負值,與此同時,輸入輸出流錯誤標誌將被置值,可由指示器ferror來檢查輸入輸出流的錯誤標誌。
使用printf函數打印一個double類型的數據,要求:輸出爲10進制,輸出左對齊30個字符,4位精度
%-30.4f
-: 左對齊
30: 最小字段寬度
.4: 精確度保留小數4位
f: double精度浮點數
e: 科學計數法
C Primer Plus指出:printf()的轉換說明修飾符可在%和定義轉換髮之間通過插入修飾符對基本的轉換說明加以修改。
用於打印浮點類型的轉換說明符double和long double,但沒有用於float的說明符,因爲在K&R C中float值在被用於表達式中或者被用作參數之前,會被自動轉換爲double類型。一般情況下,ANSI C不會自動將float轉換爲double。
看個例子
/*with.c--字段寬度*/
#include<stdio.h>
#define PAGES 931
int main(void){
printf("*%d*\n",PAGES);
printf("*%2d*\n",PAGES);
printf("*%10d*\n",PAGES);
printf("*%-10d*\n",PAGES);
return 0;
}
程序輸出結果爲
*931*
*931*
* 931*
*931 *
asd
//float.c ---一些浮點數
#include<stdio.h>
int main(void){
const double RENT = 3852.99;//以const方法定義的常量
printf("*%f*\n",RENT);
printf("*%e*\n",RENT);
printf("*%4.2f*\n",RENT);
printf("*%3.1f*\n",RENT);
printf("*%10.3f*\n",RENT);
printf("*%10.3e*\n",RENT);
printf("*%+4.2f*\n",RENT);
printf("*%010.2f*\n",RENT);
return 0;
}
*3852.990000*
*3.852990e+003*
*3852.99*
*3853.0*
* 3852.990*
*3.853e+003*
*+3852.99*
*0003852.99*
+標誌使得結果數字和它的代數符號一起打印,在這裏該符號就是加號符號;0標誌產生前導零以使結果填充整個字段;
請注意,在說明符%010中第一個0是一個標誌,剩餘的數字(10)指定字段寬度。
11 十進制轉八進制方法
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int m=0123, n = 123;//八進制爲0...(0-7)
printf("%o %o\n", m, n);
return 0;
}
12 sizeof和strlen
設語句定義char a[ 80 ]= " 0123\0789 "; ,則sizeof(a)和strlen(a)的值分別爲
char a[80]=" 0123\0789 "; sizeof(a) = 80;
空格 0 1 2 3 \07 8 9 \0 ; strlen(a) = 9;
//64位系統中
const char *str = "123456";
printf("sizeof(str):%d\n",sizeof(str));
printf("strlen(str):%d\n",strlen(str));
/*
sizeof(str):8
strlen(str):6
*/
sizeof(str)讀的是地址大小,在64系統地址爲64位,就8B;32位系統4B,一個字節爲8bit;
sizeof用法查詢對象或類型的大小,得到對象的實際大小;
sizeof(類型);//(1)返回類型的對象表示的字節大小
sizeof(表達式);//(2)返回表達式類型的對象表示的字節大小
注意
取決於計算機架構,字節可能由 8 或更多位構成,準確數作爲 CHAR_BIT 所提供。
sizeof(char) 、 sizeof(signed char) 和 sizeof(unsigned char) 始終返回 1 。
sizeof 不能用於函數類型、不完整類型(含void)或位域左值。
應用 sizeof 到 結構體或聯合體類型運算數時,結果是這種對象中的總字節數,包含內部和尾隨填充。尾隨填充使得若對象在數組中,則此數組中下個元素的對齊要求會得到滿足,換言之, sizeof(T) 返回 T[] 數組中元素的大小。
strlen
13 數據類型和數組結合
#define MAX 255
int main()
{
unsigned char A[MAX], i;
for (i = 0; i <= MAX; i++)
A[i] = i;
unsigned char 類型大小
數組越界
死循環
unsigned char類型的範圍是0-255,所以當循環執行到255時,再加1將變成0,從而再次循環。
C++不進行數組越界檢查
14 字符逆序
int main()
{
char *src = "hello,world";
int len = strlen(src);
char *dest = (char *)malloc(len + 1); //要爲\0分配一個空間
char *d = dest;
char *s = &src[len - 1]; //指向最後一個字符
while ( len-- != 0 )
*d++ = *s--;
*d = 0; //尾部要加\0
printf("%s\n", dest);
free(dest);// 使用完,應當釋放空間,以免造成內存匯泄露
return 0;
}
15 數組指針和指針數組
數組指針:指針變量指向數組
指針數組:數組內每個元素有指針變量,每個元素爲指向某種類的元素;
typedef char T[10] ; //T 爲一個字符數組,這裏爲什麼要加typedef?
T * a ; //a表示指向字符數組的一個指針變量
//等價於:
char (*a)[10];//a爲指針變量,指向一個具有10個元素的字符數組
char *a[10];//a表示一個數組,即數組內存放元素爲指針變量? 每個元素都是指針變量,每個指針指向一個char變量?
In C++, what does “explicit” mean? what does “protected” mean?
answer
c語言中,語句 “if(i=1) i++;” 能編譯通過