指標常量(pointer to const):不能修改指向變數的值,int const *p
常量指標(const pointer):不能改變指向,不能指向常量,int *const p
指向常量的常量指標(const pointer to const):不能改變指向,可以指向常量,const int *const p
其中常量是指不能修改。
主要區別:
(1)作用域;
(2)引數列表。
不能過載的情況:
(1)函式只有返回值不同;
(2)語意不明,函式引數列表出現多個匹配。
建構函式:(類間按照繼承順序構造,成員間按宣告順序)
(1)虛擬基類的建構函式;
(2)非虛擬基類的建構函式;
(3)設定虛函式表指標值;
(4)成員物件的建構函式;
(5)類本身的建構函式。
析構函式:由於採用函式棧的形式,因此,析構順序與構造順序相反。
(1)#:返回字串
(2)##:表示子串連線
例如:#define conn(x,y) x##y
(3)#@:返回const char
定義和性質區別
指標:指標是乙個變數,儲存的是乙個記憶體位址,指向記憶體的乙個儲存單元;通過指標獲取這個指標指向的記憶體中的值稱為解引用;引用:是原變數的乙個別名(同義詞),引用跟原來的變數實質上是同乙個東西,它儲存著所指物件的儲存位址,並且使用的時候會自動解引用。int a = 1; int *p = &a;int &s = a;
其中,p是指標變數,該指標變數指向整型變數a的儲存單元,即p的值是a儲存單元的位址;s是整型變數a的引用,a與b在記憶體中占用同一儲存單元
引用不可以為空,當被建立的時候必須初始化,而指標可以是空值,可以在任何時候被初始化。
指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)
作為引數傳遞時,指標需要被解引用才可以向物件進行操作,而直接對引用的修改都會改變引用所指向的物件。
指標的值可以為空,但是引用的值不能為null,並且引用在定義的時候必須初始化;
指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了。
sizeof(引用)得到的是所指向的變數(物件)的大小,而sizeof(指標)得到的是指標本身的大小;
如果返回動態記憶體分配的物件或者記憶體,必須使用指標,引用可能引起記憶體洩漏;
可以有const指標,但是沒有const引用;
指標和引用的自增(++)運算意義不一樣。
作為函式引數的區別
函式使用指標傳遞引數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的位址。
// 函式定義
void
swap_int
(int
*a,int
*b)void
test_int
(int
*p)// 傳指標
void
test_cite
(int
&a)//傳引用
void
test_int_cite
(int
*&p)
// 傳指標的引用
intmain()
*a和*b實際上是取儲存實參的記憶體單元裡的資料,即是對實參進行改變可以達到目的。
test_int函式傳遞的是位址,只不過傳遞的是指標的位址(變數的位址)。當把指標作為引數進行傳遞時,也是將實參的乙個拷貝傳遞給形參,即上面程式main函式中的p和test函式中使用的p不是同乙個變數,儲存2個變數p的單元也不相同(只是2個p指向同乙個儲存單元),那麼在test_int函式中對p進行修改,並不會影響到main函式中的p的值。如果要想達到也同時修改的目的的話,就得使用引用了.
引用作為函式引數進行傳遞時,實質上傳遞的是實參本身,即傳遞進來的不是實參的乙個拷貝,因此對形參的修改其實是對實參的修改,所以在用引用進行引數傳遞時,不僅節約時間,而且可以節約空間。
如果需要同步修改主函式和函式體中的指標變數,就得使用引用。
三種建立類物件的方式:
1、 new建立類物件
new建立類物件需要類指標接收
2、不用new,直接使用類定義申明
3、類指標+new
(1)先定義類指標,在new之前並未為該類物件分配任何記憶體空間,因此如果未經過物件初始化則不需要delete釋放;
(2)再使用的時候new。
#include
classa~
a()}
;int
main()
建構函式返回值的問題(???)
如果乙個函式的返回值是引用型別(陣列,物件或者函式)的資料,那麼這個函式作為建構函式用new運算子執行構造時,運算的結果將被它的返回值取代,這時候,建構函式體內的this值丟失了,取而代之的是被返回的物件;
題目描述:給定一字串,從中找出重複出現的字元,並返回首次重複的下標。
python:
def
find_char_in_string
(str):
""" characters are stored in dictionary
format of dictionary :
dict_char =
"""dict_char =
for i, char in
enumerate
(str):
if char in dict_char:
dict_char[char][0
]+=1 dict_char[char]
else
: dict_char.update(
)# dict_char[char] = [1, i]
return dict_char
if __name__ ==
'__main__'
: s =
'&acs1234^3123$%^&$#'
d = find_char_in_string(s)
for key, value in d.items():
if value[0]
>1:
print
("{}:{}"
.format
(key, value[2]
))
c++:
#include
#include
#include
#include
using
namespace std;
void
count_char_in_string
(string s, map<
char
, vector<
int>>
&m));}
else}}
intmain()
面試題目總結一
面試是需要時間準備的,如果茫然的就去,很容易碰釘子。即使你做過的專案,細問也有不會的。一 nand flash相關驅動知識 mtd memory technology device 記憶體技術裝置 linux層次結構為 裝置節點 裝置層 字元裝置mtdchar.c和塊裝置mtdblk.c 原始裝置層...
面試題目總結
1.char p和char p的區別。1 char getstring void void main 2 char getstring void void main 為什麼 1 輸出的是亂碼,2 能夠輸出 hello world?hello world 作為靜態字串實際上儲存在文字常量區 參見 棧和...
面試題目總結
二叉樹相關面試題目 結點資料結構 typedef struct treenode 1.二叉樹的前序遍歷 遞迴void preorder treenode root vector res 非遞迴 vectorpreorder treenode root else 2.二叉樹中序遍歷 遞迴void mi...