查漏補缺(C++筆試)(更新中)
1.動態連結庫與靜態連結庫的區別:
解:動態連結是指在生成可執行檔案時不將所有程式乃至的函式連結到一個檔案,因為有許多函式在作業系統帶的dll檔案中,當程式執行時直接從作業系統中找。而靜態連結就是把所有乃至的函式全部連結到.exe檔案中。
動態連結是隻建立一個引用的介面,而真正的程式碼和資料存放在另外的可執行模組中,在執行時再裝入。而靜態連結是把所有的程式碼和資料都複製到本模組中,執行是就不在需要庫了。
靜態連結庫與動態連結庫的相同點:(1)、共享程式碼;(2)、程式碼封裝。靜態連結庫與動態連結庫的區別:(1)、靜態連結庫被包含在宿主程式中,而動態連結庫則是在需要時動態的裝載和解除安裝DLL檔案;(2)、靜態連結庫中不能再包含其它動態或者靜態連結庫,而動態連結庫中則可再包含。
2. 指令 用途
# 空指令,無任何效果
#include 包含一個原始碼檔案
#define 定義巨集
#undef 取消已定義的巨集
#if 如果給定條件為真,則編譯下面程式碼
#ifdef 如果巨集已經定義,則編譯下面程式碼
#ifndef 如果巨集沒有定義,則編譯下面程式碼
#elif 如果前面的#if給定條件不為真,當前條件為真,則編譯下面程式碼
#endif 結束一個#if……#else條件編譯塊
#error 停止編譯並顯示錯誤資訊
3.const與#define相比有什麼不同
解:C++語言可以用const定義常量,也可以用#define定義常量,但是前者比後者有更多的優點:
(1)、const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換中可能會產生意料不到的錯誤。
(2)、有些整合化的除錯工具可以對const常量進行除錯,但是不能對巨集常量進行除錯。
4.mutable關鍵字:
mutable的中文意思是“可變的,易變的”,跟constant(既C++中的const)是反義詞。在C++中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在一個const函式中。我們知道,如果類的成員函式不會改變物件的狀態,那麼這個成員函式一般會宣告成const的。但是,有些時候,我們需要在const的函式裡面修改一些跟類狀態無關的資料成員,那麼這個資料成員就應該被mutalbe來修飾。
5.程式與執行緒的區別
程式是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,它是系統進行資源分配和排程的一個獨立單位。例如,使用者執行自己的程式,系統就建立一個程式,併為它分配資源,包括各種表格、記憶體空間、磁碟空間、I/O裝置等,然後,該程式被放入到程式的就緒佇列,程式排程程式選中它,為它分配CPU及其它相關資源,該程式就被執行起來。
執行緒是程式的一個實體,是CPU排程和分派的基本單位,執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器、一組暫存器和棧),但是它可與同屬一個程式的其他的執行緒共享程式所擁有的全部資源。
在沒有實現執行緒的作業系統中,程式既是資源分配的基本單位,又是排程的基本單位,它是系統中併發執行的單元。而在實現了執行緒的作業系統中,程式是資源分配的基本單位,但執行緒是排程的基本單位,執行緒是系統中併發執行的單元。
具體而言,引入執行緒,主要有以下4個方面的優點:
(1)易於排程。
(2)提高併發性。通過執行緒可以方便有效地實現併發。
(3)開銷小。建立執行緒比建立程式要快,所需要的開銷也更少。
(4)有利於發揮多處理器的功能。通過建立多執行緒,每個執行緒都在一個處理器上執行,從而實現應用程式的並行,使每個處理器都得到充分執行。
需要注意的是,儘管執行緒與程式二者很相似,但也存在著很大的不同,區別如下:
(1)一個執行緒必定屬於也只能屬於一個程式;而一個程式可以擁有多個執行緒並且至少擁有一個執行緒。
(2)屬於一個程式的所有執行緒共享該執行緒的所有資源,包括開啟的檔案、建立的Socket等。不同的程式互相獨立。
(3)執行緒又被稱為輕量級程式。程式有程式控制塊,執行緒也有執行緒控制塊。但執行緒控制塊比程式控制塊小得多。執行緒間切換代價小,程式間切換代價大。
(4)程式是程式的一次執行,執行緒可以理解為程式中一段程式片段的執行。
(5)每個程式都有獨立的記憶體空間,而執行緒共享其所屬程式的記憶體空間。
6.const的作用
(1)欲阻止一個變數被改變,可以使用const關鍵字。在定義該const變數時,通常需要對它進行初始化,因為以後就沒有機會再去改變它了;
(2)對指標來說,可以指定指標本身為const,也可以指定指標所指的資料為const,或二者同時指定為const;
(3)在一個函式宣告中,const可以修飾形參,表明它是一個輸入引數,在函式內部不能改變其值;
(4)對於類的成員函式,若指定其為const型別,則表明其是一個常函式,不能修改類的成員變數;
(5)對於類的成員函式,有時候必須指定其返回值為const型別,以使得其返回值不為“左值”。
7.static的作用
(1)函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值;
(2)在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問;
(3)在模組內的static函式只可被這一模組內的其它函式呼叫,這個函式的使用範圍被限制在宣告它的模組內;
(4)在類中的static成員變數屬於整個類所擁有,對類的所有物件只有一份拷貝;
(5)在類中的static成員函式屬於整個類所擁有,這個函式不接收this指標,因而只能訪問類的static成員變數。
8.編寫類String的建構函式、解構函式和賦值函式,已知類String的原型為:
class String
{
public:
String(constchar*str= NULL); // 普通建構函式
String(constString &other); // 拷貝建構函式
~String(void); // 解構函式
String &operate =(const String &other); // 賦值函式
private:
char*m_data;// 用於儲存字串
};
解答:
//普通建構函式
String::String(constchar*str)
{
if(str==NULL)
{
m_data=newchar[1]; // 得分點:對空字串自動申請存放結束標誌'\0'的空
//加分點:對m_data加NULL 判斷
*m_data='\0';
}
else
{
int length =strlen(str);
m_data=newchar[length+1]; // 若能加 NULL 判斷則更好
strcpy(m_data,str);
}
}
// String的解構函式
String::~String(void)
{
delete []m_data; // 或deletem_data;
}
//拷貝建構函式
String::String(const String &other) // 得分點:輸入引數為const型
{
int length =strlen(other.m_data);
m_data=newchar[length+1]; //加分點:對m_data加NULL 判斷
strcpy(m_data,other.m_data);
}
//賦值函式
String & String::operate =(const String&other) // 得分點:輸入引數為const型
{
if(this==&other) //得分點:檢查自賦值
return*this;
delete []m_data; //得分點:釋放原有的記憶體資源
int length =strlen( other.m_data );
m_data=newchar[length+1]; //加分點:對m_data加NULL 判斷
strcpy( m_data,other.m_data );
return*this; //得分點:返回本物件的引用
}
9.關於volatile關鍵字:
volatile的本意是“易變的”,volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如作業系統、硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。
一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。
下面是volatile變數的幾個例子:
(1). 並行裝置的硬體暫存器(如:狀態暫存器)
(2). 一箇中斷服務子程式中會訪問到的非自動變數(Non-automaticvariables)
(3). 多執行緒應用中被幾個任務共享的變數
相關文章
- [筆記](更新中)CSP-S 2024 查漏補缺筆記
- C++灰灰的日常查漏補缺C++
- Typescript 查缺補漏TypeScript
- JavaScript Promise查缺補漏JavaScriptPromise
- Flutter查漏補缺1Flutter
- C++ Primer 查漏補缺 —— C++ 中的各種初始化C++
- [學習筆記]TypeScript查缺補漏(一):類筆記TypeScript
- iOS 查漏補缺 - PerformSelectoriOSperformSelector
- ROS灰灰的日常查漏補缺ROS
- shell基礎知識查缺補漏
- C# 執行緒查漏補缺C#執行緒
- asp.net core 2.0 查缺補漏ASP.NET
- 前端面試查漏補缺--(十三) 記憶體洩漏前端面試記憶體
- 前端面試查漏補缺--(十五) Event Loop前端面試OOP
- 前端面試查漏補缺--(八) 前端加密前端面試加密
- SLAM 灰灰restudy及查漏補缺—octomapSLAMREST
- 技術棧查漏補缺——架構師架構
- 【查漏補缺】那些漏掉的面試知識面試
- C# 執行緒同步查漏補缺C#執行緒
- 前端面試查漏補缺--(十) 前端鑑權前端面試
- [學習筆記]TypeScript查缺補漏(二):型別與控制流分析筆記TypeScript型別
- Redis基礎你掌握多少了?來查漏補缺?Redis
- 前端面試查漏補缺--(九) HTTP與HTTPS前端面試HTTP
- 前端面試查漏補缺--(四) 前端本地儲存前端面試
- 前端面試查漏補缺--(二) 垃圾回收機制前端面試
- 圖片載入利器之Picasso(五)查漏補缺
- 「查缺補漏」高頻考點瀏覽器面試題瀏覽器面試題
- 「查缺補漏」鞏固你的Redis知識體系Redis
- 前端面試查漏補缺--(十四) 演算法及排序前端面試演算法排序
- 前端面試查漏補缺--(六) 瀏覽器快取前端面試瀏覽器快取
- 前端面試查漏補缺--(一) 防抖和節流前端面試
- [查漏補缺]正規表示式匹配演算法演算法
- Go語言學習查缺補漏ing Day8Go
- Go語言學習查缺補漏ing Day6Go
- Go語言學習查缺補漏ing Day7Go
- Go語言學習查缺補漏ing Day3Go
- Go語言學習查缺補漏ing Day4Go
- Go語言學習查缺補漏ing Day5Go