3.C++語言知識點總結
1.封裝:將記錄包起來讓其自己去幹。
2.抽象:記錄一下這些傢伙的屬性,比如都是人。
3.繼承:生下來的兒子跟父親一個鳥樣。
4.多型:兒子除了含有父親的內容外,還有自己的特徵。
5.標頭檔案中不加“.h”。
6.加上名稱空間 using namespace std; //後期考慮到C++主要用在大型程式設計,可以不加,但是一些呼叫的型別要用std::xxoo的形式。
7.cin>>i;輸入(面板輸入到i) cout<<xxoo<<endl;輸出 ;
cin.peek()的返回值是一個char型的字元,其返回值是指標指向的當前字元,但它只是觀測指標停留在當前位置並不後移;
cin.get()用來從指定的輸入流中提取一個字元(包括空白字元);
#include<iostream> using namespace std; int main(){ int sum=0; int c; while(cin>>c){ sum+=c; while(cin.peek()==' '){ //遮蔽空格 //探測並不移除 cin.get();//獲得並移除 } if(cin.peek()=='\n'){ break; } } cout<<sum<<endl; return 0; } 執行結果: 11 11 22 11 55
8.ungetc(ch,stdin);//將變數ch中存放的字元退回給stdin輸入流(其中ch=getchar();面板輸入的字元被ch賦予,為了使其重新回到面板中可以使用該句)
9.建構函式:物件可以使用的函式。比如:in.open()
10.可以加std::cin.ignore(100,‘\n’);std::cin.get();//暫停結束,直到任意輸入一字元再結束(這裡的ignore()表示忽略100個字元,除非是\n就不忽略)
11.函式過載:將函式的作用重新定義
12.區域性變數需要初始化為0
13.在string str;時,由於cin>>str會由於遇到空格便結束,所以要改為getline(cin,str);//表示用cin的方式輸入一串東西給str
14."&"表示獲得變數的地址
15.用‘ ’括起來的表示為單個字元
16.int *p1=&myInt,這裡表示的指標是存地址
*p1=233;這裡表示的是解引用,給地址在p1中的記憶體位置賦值233
17.如果函式形式為swap(int *p,int*q),傳入的引數應該為地址swap(&p,&q)
形式為swap(int &p,int &q)時,直接傳入引數就行,即為swap(p,q)
18.用typedef來為一個型別定義建立一個別名:typedef int* intPointer,意思就是說,intPointer=int*
19.類 class Myfirstclass
{
};//要求類名的第一個字母採用大寫,同時在類宣告末尾必須有一個分號,類主要由裡面的變數還有函式組成
20.queue(模板類)佇列:需要元素型別
eg:queue<int> q1;//表示q1是一個佇列
queue的基本操作:
入隊:q.push(x);將x接到佇列的末端
出隊:q.pop();彈出佇列的第一個元素,並不會返回其值
訪問隊首元素:q.front();即最早被壓入佇列的元素
訪問隊尾元素:q.back();即最後被壓入佇列的元素
判斷佇列空:q.empty();當佇列空時,返回true
訪問佇列中元素的個數:q.size();
21.構造器
class Car
{
Car(void);//建構函式名字與類名一樣
};
Car::Car(void){
}//定義建構函式內容
22.析構器
class Car
{
Car(void);
~Car();//解構函式,避免記憶體洩漏,可在解構函式中加內容 Car::~Car()
{
}
23.繼承:
class Animal
{
public:
std::string mouth;
void eat();
};
class pig:public Animal
{
void sleep();
};//繼承父類的所有內容,並可以擁有自己的內容
void Animal::eat()
{
}//對函式內容進行填充
24. public:允許任何程式碼訪問
protected:允許這個類本身還有它的子類訪問
private:允許這個類本身訪問
25.在類裡面加 friend class xxoo,表示另一個類xxoo可以呼叫這個類裡面的東西
26.直接建立一個指標並讓它指向新分配的記憶體塊
int *pointer=new int;
*pointer=110;//將記憶體塊存進去內容
std::cout<<*pointer;
delete pointer;//要求每一個new都是需要一個delete,避免佔用太多死記憶體,導致記憶體洩漏
27.在基類中宣告函式為虛擬函式(在函式前加virtual),這樣在子類中對函式進行過載後,在後期呼叫時,即使用基類型別定義子 類的建構函式如:
Parent *child=new Child("xxoo");//建構函式為Child,開闢了一個新記憶體空間放著建構函式,並向建構函式中輸 入引數,但是由於是定義的指標型別是基類的,所以預設的記憶體塊中的同名函式引用的是父類的,沒辦法體現出函式的重 載,所以在基類中將後期要過載的函式變為虛擬函式,這樣就能使得成功呼叫過載函式
28.抽象方法:就使27中的虛擬函式=0,eg:virtual void play()=0;表示該函式沒有內容定義,告訴編輯器不用查詢裡面的內容
29.基類中的解構函式應該寫為虛擬函式,是為了子類中的解構函式能被正確呼叫,然後再呼叫基類中的解構函式,解構函式都是 在main()中所有程式碼執行結束後再呼叫的。
30.在進行多繼承時,為了防止子類的兩個基類中都含有相同的屬性(此時兩個基類可能是從同一個基類中繼承而來得的),在 原基類繼承更高階的基類中應該使用虛繼承:
class Teacher:virtual public Preson
{
};
class Student:virtual public Person
{
};
class Teachstudent:public Teacher,public Student
{
};//可以避免該類中含有兩份Person內的屬性
31.動態陣列:int *x=new int[10];//x地址指向新開闢的整形陣列的頭地址
賦值方式為:x[1]=...;x[2]=...;
delete[] x;//刪除開闢出來的陣列空間
32.模板定義:
template<class T>//模板定義某種模糊型別為T
void swap(T &a,T&b)//模糊型別引用
{
T temp=a;
a=b;
b=temp;
}
int main()
{
int i1=100;
int i2=200;
swap(i1,i2);
std::string s1="JJJ";
std::string s2="rrr";
swap(s1,s2);
return 0;
}
33.模板定義後的類進行初始化
template <class T>
class Myclass
{
Myclass();//建構函式
void swap(T &a,T &b);//模糊型別引用的成員函式
};
Myclass<T>::Myclass()
{
}//類模板定義後的建構函式初始化需要加<T>