1. 程式人生 > >C++的基本概念一

C++的基本概念一

一、第一個C++程式

#include <iostream>
using namespace std;

int main()
{
    cout << "hello world!" << endl;
}

    1、副檔名
        C++原始碼的副檔名.cpp、C、cxx、c(需要指定編譯語言)
        自定義的標頭檔案依然保留.h
    2、標頭檔案
        C++標準庫的標頭檔案不帶.h,最常用的是iostream
        C語言中的標頭檔案依然可以繼續使用,stdio.h或cstdio
    3、輸入輸出
        cout<<輸出
        cin>>輸入
        endl換行
        cout和cin不再使用佔位符,它可以自動識別資料型別。
        scanf和printf可以繼續使用。但需要新增標頭檔案
    4、編譯器
        gcc也可以編譯C++的原始碼,但需要新增額外的引數(-x c++)
        g++是編譯C++原始碼的最簡單的編譯器,一般操作沒有預設安裝。
        ubuntu系統的安裝指令:sudo apt-get install g++
        之前的gcc的編譯引數,依然可以繼續使用。
        注意:C++編譯時的錯誤提示不是很精準,一個錯誤可能會產生大量的錯誤提示。
    5、引入了名字空間概念
        using namespace std;//std 名字空間內包含cout、cin、endl等

二、C++中的基本資料型別
    1、C++完全相容C語言中的所有資料型別(C++幾乎相容C語言的所有語法。)。
    2、添加了bool型別、位元組寬度1,數值true(非零值),false(零值)。
    3、在顯示bool變數前,使用boolalpha可以以true或flase的形式顯示bool值。
    4、void* 與其它型別指標的轉換受到限制
        void* 不可以直接給其它型別的指標賦值,必須經過強制轉換。
        任意型別的指標都可以直接給void*賦值。

三、C++中的聯合、列舉、結構
    1、在C++中聯合(union)、列舉(enum)、結構(struct)設計成功後,再使用不需要加關鍵字。
    2、列舉的檢查更為嚴格(C++中的列舉是一種獨立的資料型別)。
    3、結構成員中可以有函式,在函式中可以直接訪問結構的成員。
    4、結構物件可以繼續使用.或->訪問成員、成員函式。
    5、結構中的成員添加了訪問屬性:
        public:開放的,被它修飾過的成員在任何位置都可以訪問
        private:私有的,被它修飾過的成員只能在成員函式中使用
        protected:以後再說。
    6、結構在建立時會自動呼叫一個函式-建構函式(可以有多個,函式過載)。
        a、無返回值
        b、名字與結構相同
        c、引數可以任意
    7、結構在釋放時會自動呼叫一個函式-解構函式。
        a、無返回值、引數
        b、~結構名

總結:

  • 函式過載:在一個結構內,C++允許函式同名,但引數需要可區分化,即同名函式在編譯時,編譯器可以通過引數數量或型別區分同名函式,以實現不同功能。(實際上在編譯結束後,同名函式在可執行檔案中並不同名,可通過nm a.out 檢視)
  • #include <iostream>
    using namespace std;
    void func(int num)
    {
    	cout << num << endl;
    }
    void func(float num)
    {
    	cout << num << endl;
    }
    void func(int num1,int num2)
    {
    	cout << num1 << num2 << endl;
    }
    void func(int num1,float num2)
    {
    	cout << num1 << num2 << endl;
    }
    int main()
    {
    	int a = 50;
    	float b = 3.14;
    	int c = 40;
    	func(a);
    	func(b);
    	func(a,c);
    	func(a,b);
    }

    檢視同名函式編譯後,在可執行檔案中的名字

    >nm /a.out
    ...
    0804864f T _Z4funcf
    08048624 T _Z4funci
    080486b4 T _Z4funcif
    0804867a T _Z4funcii
    ...
  • 函式設定預設值:在對函式進行定義時,只需對函式引數初始化即可,初始化的值,即為預設值。重要的一點,當只有部分引數需要設定預設值時,則被設定預設值的引數應置於引數列表的右邊,沒有設預設值的引數應置於左邊,避免函式傳參出現歧義。
  • #include <iostream>
    using namespace std;
    void func(int num1,int num2 = 10)
    {
    	cout << num1 << num2 << endl;
    }
    int main()
    {
    	func(10);
    	func(20,40);
    }
  • 變數的引用(&):引用即為對映,也可理解為取別名,對映的全部成員共享一個變數,一變全變。重點,引用者在定義時就需要被初始化,而且被引用者也應有確切的值。並且,引用者一旦引用一次,就不會再次引用,相當引用操作前面添加了const。其次,被引用者還可以是常量,但必須使用const修飾。(引用在函式傳參具有指標的效果
  • #include <iostream>
    using namespace std;
    int main()
    {
    	int name = 100;
    	const int & big = 40;
    	cout << big << endl;
    	//const int & bigman = name;
    	int & bigman = name;
    	cout << bigman << endl;
    }

        練習:定義一個函式,計算兩個整數的最大公約數和最小公倍數,最大公約數用返回值返回,最小公倍數用引用返回。

  • #include <iostream>
    using namespace std;
    void swap(int& a,int& b)
    {
    	int c = a;
    	a = b;
    	b = c;
    }
    int func(int a,int b,int& c)
    {
    	int d = 0;
    	//
    	for(c = a < b ? a : b;c >= 1;c--)
    	{
    		if(0 == a%c && 0 == b%c) break;
    	}
    	//
    	for(d = a > b ? a : b;d <= a * b;d++)
    	{
    		if(0 == d%a && 0 == d%b) break;
    	}
    	return d;
    }
    int main()
    {
    	int num1 = 12;
    	int num2 = 18;
    	swap(num1,num2);
    	cout << num1 << " " << num2 << endl;
    
    	int div = 0;
    	int mul = 0;
    	div = func(num1,num2,mul);
    	cout << div << " " << mul << endl;
    }
  • 變數記憶體申請與釋放:new、delete 運算子可以自動呼叫類的建構函式和解構函式,並且new返回的是有型別指標不同於malloc(void*)。注意,使用new對變數的初始化、陣列的初始化、結構的初始化等操作的格式,以及陣列記憶體釋放的delete的格式。
  • int* nump = new int(100);//變數
    int* strp = new int[10]{0,1,2,3,4,5,6,7,8,9};//陣列
    Date* date = new Date(a,b);//類,需要傳參
    delete nump;
    delete date;
    delete[] strp;
  • 資料結構:結構、列舉、聯合(相關格式及用法)
  • union Data
    {
    	int num;
    	char ch[6];
    };
    enum Key
    {
    	key_up = 183,
    	key_down = 184,
    	key_right = 185,
    	key_left = 186
    };
    struct Student
    {
    	char name[20];
    	char sex;
    	int age;
    
    	void show_stu(void)
    	{
    		cout << name << " " << sex << " " << age << endl;
    	}
    };
    
    int main()
    {
    	//聯合
    	Data d;
    	cout << sizeof(d) << endl;
    	//列舉
    	Key k = key_up;
    	cout << k << endl;
    	//結構
    	Student t = {"heheh",'m',20};
    	t.show_stu();
    }