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(); }