目錄
1、面向對象
頭文件和靜態庫,不提供代碼分享給其他人
頭文件 – 申明
類中 - 實現
new/delete
malloc/free
2、命名空間 - 避免類名衝突
創建:
Namespace yx {
}
使用:
yx::類名
using namespace yx;
3、類的繼承 – 可以直接訪問父類定義的方法
this指針
4、構造方法和析構方法
構造方法 – 初始化操作 – new創建指針對象
析構方法 – 刪除當前類的對象 - 值對象在代碼塊執行完畢後刪除或者指針對象delete
創建值對象時會先調用構造方法再調用析構方法
5、執行父類的構造方法
Man::Man(int age):yx::People::People(age, 1) { }
6、執行父類的方法
在子類方法中寫一個方法,調用父類的方法
void Man::sayHello() {
yx::People::sayHello();
}
直接在main函數中使用時,可以直接指定使用子類方法或者父類方法
Man *m = new Man(21);
m -> People::sayHello();
7、實函數、虛函數、純虛函數、函數重寫
虛函數 – 函數重寫 – 動態綁定 – 將基類函數使用virtual聲明
純虛函數 – 基類中方法定義而不實現,由子類實現 – “virtual” “=0”
virtual void eat() = 0;
8、純虛類
抽象類 – 在類中包含純虛函數,那麼這個類就叫做抽象類
純虛類 – 類中的所有成員方法都是虛函數 – 相當於Java中的接口
9、函數重載 – 函數名稱一樣,參數不同
C++中的字符串是string類型
C中的字符串是char*類型
轉換:
string name = "yx";
(char *)name.c_str()
string str = "Hello ";
str += name; //字符串連接
10、運算符重載
void operator+=(Point p) {
add(p);
}
Point p = Point(10, 10);//值對象
p += Point(13, 13);
Point *p = new Point(6,6); //指針對象
(*p) += Point(2,2); //都是通過值進行重載
11、僞函數 – 實際上是一個類或者結構體
重載“()”,將僞函數作爲變量來傳遞,通過這種方式將類當做一個函數來對待,方便
void hello(){
printf("Hello\n");
}
class Hello{
public:
void operator()(){
printf("Hello Cpp\n");
}
};
int main() {
hello();
Hello h;
h();
return 0;
}
12、函數指針
函數指針是指向函數的指針變量,即本質是一個指針變量
指向函數的指針包含了函數的地址,可以通過它來調用函數。聲明格式如下:
類型說明符 (*函數名)(參數)
例如:void (*fptr)();
指針函數是指帶指針的函數,即本質是一個函數。函數返回類型是某一類型的指針
類型標識符 *函數名(參數表)
例如:int *f(x,y);
首先它是一個函數,只不過這個函數的返回值是一個地址值。指針函數一定有函數返回值,而且在主調函數中,函數返回值必須賦給同類型的指針變量
#include <iostream>
#include <stdio.h>
using namespace std;
class Object;
typedef void(Object::*SayHi)();
class Object {
public:
// void (Object::*sayhi)();
SayHi sayhi;
};
class Hello:public Object{
public:
Hello(){
// sayhi = (void (Object::*)())(&Hello::helloSayHi);
sayhi = (SayHi)(&Hello::helloSayHi);
(this->*sayhi)();
}
void helloSayHi(){
printf("Hello CPP\n");
}
};
int main() {
Hello *h = new Hello();
delete h;
return 0;
}
應用:延時執行某個方法的代碼
#include <iostream>
#include <thread>
#include <unistd.h>
class Object;
typedef void(Object::*SayHi)();
typedef void(Object::*CallaterHandler)();
void threadFunc(Object *target,CallaterHandler handler,int delay){
sleep(delay);
(target->*handler)();
}
void callater(Object *target,CallaterHandler handler,int delay){
std::thread t(threadFunc,target,handler,delay);
t.join();
}
#define CH(fp) (CallaterHandler)(&fp)
class Object {
public:
SayHi sayHi;
};
class Hello:public Object {
public:
Hello(){
// sayHi = (SayHi)(&Hello::HelloSayHi);
//
// (this->*sayHi)();
callater(this, CH(Hello::HelloSayHi), 3);
}
void HelloSayHi(){
printf("Hello CPP\n");
}
};
int main(int argc, const char * argv[])
{
Hello *h = new Hello();
delete h;
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}
13、引用
值傳遞 – 執行內存拷貝 – 消耗時間
引用傳遞 – 不執行內存拷貝 – 程序運行高效
也可以使用指針
14、友元類
將類聲明爲友元,來訪問另一個類的私有成員
friend class B
15、標準庫容器的基本用法
#include <iostream>
#include <list>
#include <string>
#include <map>
using namespace std;
int main() {
list<string> l;
l.push_back("Hello");
l.push_back("World");
list<string>::iterator it;
for (it = l.begin();it != l.end();it++){
cout<<*it<<endl;
}
map<string,string> m;
m.insert(pair<string,string>("a","A"));
m.insert(pair<string,string>("b","B"));
cout << m.at("a") << endl;
m["d"] = "D"; //C++重載了[]運算符
cout << m.at("d") << endl;
return 0;
}
16、字符串常用操作
字符串連接:重載了運算符+=
字符串與其他類型連接:
stringstream ss;
ss<<"A ";
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string str;
str+="a ";
str+="b";
cout << str <<endl;
stringstream ss;
ss<<"A ";
ss<<200;
ss<< "B "<<"C"<<100;
cout<<ss.str();//c++語言字符串
cout<<ss.str().c_str();//c語言字符串
return 0;
}
17、文件操作
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main() {
// ofstream of("data.txt");//寫
// of<<"Hello Cpp\n";
// of.close();
ifstream inf("data.txt");//讀
// char c;
// inf >> c;
stringbuf sb;
inf >> &sb;
// cout << c;
cout << sb.str();
// cout << "Hello, World!" << endl;
return 0;
}