C/C++小小知識點

來源:互聯網
上載者:User

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++編譯器在編譯時間會提示錯誤:錯誤的建構函式類型。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.