C&C++專項小練(一)

聲明:專欄中專項小練題目來源牛客網,若有侵權,聯繫博主即刪除;

專項小練(一)

1 字符型變量說明

//\:不是字符,\\纔是
ch = '\';
//ch = 65 對應ASCII中字符A 
ch = 62+3;
//空
ch = NULL;
//表示十六進制字符,“十、八、二進制字符”
ch = '\xaa'

EOF

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++;” 能編譯通過

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