memcpy
void * memcpy ( void * destination, const void * source, size_t num );
二進位拷貝
strcpy
char * strcpy ( char * destination, const char * source );
不能用於string,可用於char *和char []
strcat
char * strcat ( char * destination, const char * source );
Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a new null-character is appended at the end of the new string formed by the concatenation of both in destination. Pointer to the destination array, which should contain a C string, and be large enough to contain the concatenated resulting string.
strcat
1 /* strcat example */
2 #include <stdio.h>
3 #include <string.h>
4
5 int main ()
6 {
7 char str[80];
8 strcpy (str,"these ");
9 strcat (str,"strings ");
10 strcat (str,"are ");
11 strcat (str,"concatenated.");
12 puts (str);
13 return 0;
14 }
C風格字串、字元數組、string
char *str1 = "Hello"; //只可通過str1[]讀取字元,不可以更改 sizeof大小:4 strlen大小:5
char str2[] = "Hello"; //可以通過str2[]讀取、更改字元 sizeof大小:6 strlen大小:5
string str3("Hello"); //可以通過str3[]讀取、更改字元 sizeof大小:32,類似vector容器,預分配空間,可以動態增長。 不可作為strlen參數。
代碼
注意:sizeof計算的時候的不同點:指標的大小,字元數組的大小,string的大小。
sizeof計算的時候把最後的'\0'也計算,但是字元長度strlen不計算Null 字元。
指標常量、常量指標
指標常量不能指向記憶體中的另一位置。int * const p;
常量指標為指向常量的指標。不可通過它改變所指資料,但可以將它指向記憶體中其他位置。const int *p;
標頭檔的作用
現在有檔案:file1.cpp file2.cpp file3.cpp,file2和file3都include file1.cpp,那麼,如果file1.cpp檔案被修改,那麼所有include file1的檔案,都必須要重新編譯,如file2.cpp和file3.cpp。
如果有了file1.cpp對應的標頭檔file1.h,file2.cpp和file3.cpp都include file1.h,那麼,如果file1.cpp被修改,則只需要重新編譯file1.cpp單個檔案。其他檔案都不必重新編譯。
無名對象和臨時對象
無名對象,直接調用建構函式產生。如,Student& st = Student("Liang Liang"); 無名對象和臨時對象不同,無名對象和普通定義的對象具有同樣的生存周期。所以,可以適當的作為函數參數,初始化引用等用途。
臨時對象,則在語句結束後即被銷毀。使用時候需要特別注意。
變數和指標的組合聲明
int* a, b, c;
只有a是int *指標類型,b、c均為int變數。
指標初始化
全域指標變數的預設初始值是NULL。而對於non-static局部指標變數p,必須顯示的指定其初值,否則p的初始值是不可預測的,並不是NULL。所以,不管指標變數是全域的還是局部的,是靜態還是非靜態,應當在聲明的同時,進行初始化。要麼賦予它有效地址,要麼置為NULL。
多維陣列、一維數組
聲明數組時必須指定數組的大小。指定大小方法有二:一是顯示指定,如int a[10];,二是隱式指定,如int b[] = {1,2,3,4,5,6};,編譯器根據初始值個數自動計算數組大小。除此之外,兩種方法可以結合,如int c[10] = {1,2};,數組大小為10,初始值個數小於數組大小,後面的元素被初始化為0。
當數組作為函數的形參:雖然在形參表中被聲明為數組,但在函數內部,總被轉化為合適的指標。一維數組被轉化為元素類型的指標,二維數組被轉換為指向一維數組的指標,以此類推。在函數體內,對其sizeof的結果為機器字長,32位機器為4。形參表中,如果是多維陣列,必須指定除第一維外所有維的元素個數。
當數組不作為函數形參的時候,sizeof(數組名)的結果,是 數組長度*數組元素大小。
數組傳遞預設的是地址傳遞。如果想進行值傳遞數組,可以把數組封裝到struct或者class。
動態分配的多維陣列的刪除和一維數組一樣,採用delete[] array_name;。不需要更多的[]符號。因為編譯器總是會將數組的大小存放在某個地方,以便刪除的時候去讀取。
可執行程式組成
可執行程式由指令、資料、地址組成。當CPU訪問記憶體單元時,不論是讀取還是寫入,首先必須把記憶體單元的地址載入到地址匯流排(AB)上,同時將記憶體電路的讀寫控制設定為有效,然後記憶體單元中的資料就通過資料匯流排(DB)“流”向了接受的寄存器中,或者反向從記憶體流向寄存器。此即,記憶體讀寫的周期。
reinterpret_cast
The reinterpret_cast operator changes one data type into another. It should be used to cast between incompatible pointer types. 比如,用於int*和char*的轉化,無符號整形unsigned int 和指標之間的轉化。等等。
記住,void*轉化為int*等,需要用static_cast。
C風格構造類型對象、數組構造和析構
C風格構造類對象一般指struct結構體,C風格中struct不支援成員方法。所以C中又稱為POD:Plain Old Data。對於它對象的初始化可以採用一種特別的方法。如,Student st = {"WangBaoCai"}; 對象中其他的成員欄位初始化為0(泛指的0,有預設建構函式的對象採用預設建構函式)。也可以在大括弧中指定所有的成員初值。POD對象中不能定義成員方法,包括建構函式和解構函式。一旦定義了成員方法,它就不再是POD類型,也就不能採用上述初始化的特別方法了。
定義數組時候,數群組成員的初始化:內建類型不初始化,數組元素的值為為定義,或者說是隨機值。物件類型的採用預設建構函式初始化,數組元素類型必須提供預設建構函式,不然得顯式提供初始化式。數組到達末尾範圍,析構的時候從數組末端元素開始析構。
代碼
class Person{
public:
//Person(){} 如果去掉注釋符號,則不再為POD類型
string name;
int age;
string school;
};
void main(){
int array[3]={0}; //後面元素自動初始化為0
for(int i=0; i<3; i++)
cout << array[i] << endl;
cout << endl;
{
Base arr[3];
arr[0].ival = 0;
arr[1].ival = 1;
arr[2].ival = 2;
}
//Person xiehua = {"xiehua", 26, "DLUT"};
Person xiehua = {"xiehua"};
cout << endl << xiehua.name << endl;
cout << xiehua.age << endl;
cout << xiehua.school << endl;
cout << "MAIN OVER" << endl; getchar();
}
結果:
private成員的訪問
現有Base類,含有private成員string str,在其public成員函數fun(Base& b)的方法體中,可以直接存取private成員:b.str。
非法的拷貝建構函式
class A中的拷貝建構函式必須為A(const A& a),或者去掉const。絕對不能寫成A(A a),因為這將導致無限的遞迴調用拷貝建構函式中,所以C++編譯器在編譯時間會提示錯誤:錯誤的建構函式類型。