第一讲:C++语言面向对象的的特性:封装,抽象,继承,多态。
第四讲:读取文件的类ifstream,写入文件的类ofstream,都是来自一个头文件fstream。
常见的几种打开模式:
ios::in --打开一个可读文件
ios::out --打开一个可写入文件
ios::binary -- 以二进制的形式打开一个文件
ios::app --写入的所有数据将被追加到文件的末尾
ios:: trunk --删除文件原来已存在的内容
第六讲:方法(函数)的重载只是对参数的不同来区别不同的方法,对于返回值的不同是方法的覆盖。
第七讲:对于string对象的一些常用的方法:
截取字符串:substr();
比较字符串:compare();
添加字符串:insert();
替换字符串:replace();
搜索字符串:find();
第八讲:数据的地址在内存中存储时是对齐的,操作系统是32位就以4k的方式对齐,64位的就是以8k的方式对齐。比如int型的地址存放在0123的位置,然后定义了char的存放到45的位置(内存中字符是以ASCII形式存放),在定义一个int型的则存放到9 10 11 12的位置,为了cup更方便运算。定义的指针变量必须和变量的类型一样。
第九讲:在指针中*有两个作用:1、用于创建指针变量,并不是解引用的意思 int *temp; 2、用于解引用 *temp。 void *temp2;空指针就是没有被申明的指针。
第十一讲:
1 //结构 2 struct studdnt 3 [ 4 string name; 5 char sex; 6 int age; //定义不同的数据类型 7 }
第十三讲:对于联合(union)和结构差不多,区别是联合一个对象只能赋一个变量的值。对于枚举(enum)我们通常可以用到swich中
1 int main() 2 { 3 enum student 4 { 5 xiaodang, xiaokai, xiaowen //这里的xiaodang相当于0 6 }; 7 student std; 8 std = xiaokai; //这里的std相当于1 9 switch (std) 10 { 11 case xiaodang: cout << "找到小党了"; break; 12 case xiaokai: cout << "找到小开了"; break; 13 case xiaowen: cout << "找到小文了"; break; 14 default: cout << "什么都没有找到"; break; 15 } 16 return 0; 17 }
第二十四讲:虚方法(virtual)
1 class Pet 2 { 3 public: 4 virtual void play(); //父类定义为虚方法,否则输出的就是000,现在输出的是子类的方法 5 }; 6 void Pet::play() 7 { 8 std::cout << " oooo " << std::endl; 9 } 10 11 class Dog:public Pet 12 { 13 public: 14 Dog(std::string dogName); 15 ~Dog() {}; 16 void play(); 17 private: 18 std::string dname; 19 20 }; 21 Dog::Dog(std::string dogName) 22 { 23 dname = dogName; 24 } 25 void Dog::play() 26 { 27 std::cout << dname << "is play bot" << std::endl; 28 } 29 30 31 class Cat :public Pet 32 { 33 public: 34 Cat(std::string catName); 35 ~Cat() {}; 36 void play(); 37 private: 38 std::string cname; 39 40 }; 41 Cat::Cat(std::string catName) 42 { 43 cname = catName; 44 } 45 void Cat::play() 46 { 47 std::cout << cname << "is play dd" << std::endl; 48 } 49 int main() 50 { 51 Pet *pot1 = new Dog("dahuang"); 52 Pet *pot2 = new Cat("xuexue"); 53 pot1->play(); 54 pot2->play(); 55 return 0; 56 }
第二十五讲:抽象方法(abstract)
当这个方法是必不可少时,但是又不想在基类里面实现时,我们就可以用抽象方法。那只需要在我们上面的例子中,在基类的play虚方法后面加上一个“=0”而不用实现,就可以了,这样我们就告诉编译器,不需要去基类里面寻找这个方法的实现。
第二十九讲:对于多继承
1 class Person 2 {}; 3 4 class Anmial 5 {}; 6 7 class Teacher:public Person,public Anmial //多继承 8 {};
第三十四讲:关于动态内存管理:当我们new一个对象时,这个对象是存储在堆上的,不会自动清理,需要我们使用delete来清理我们申请的内存,同时把指针赋值位NULL。而我们不用new创建一个对象时,这个对象的生命周期只存在于这个函数的结束。系统会自动清理。
1 class Person 2 { 3 public: 4 Person(std::string name); 5 virtual void play(); //这里定义虚函数,为了在子类方法覆盖时,调用不到子类的方法 6 7 protected: 8 std::string pName; 9 }; 10 Person::Person(std::string name) 11 { 12 this->pName = name; 13 } 14 void Person::play() 15 { 16 std::cout << pName << "play games" << std::endl; 17 } 18 19 class Anmial : public Person 20 { 21 public: 22 Anmial(std::string thename,std::string thegame); 23 void play(); 24 protected: 25 std::string Agame; 26 }; 27 Anmial::Anmial(std::string thename, std::string thegame):Person(thename) //继承父类的构造函数时,参数应该一致 28 { 29 this->Agame = thegame; //这里当我们的类和父类的变量名一致时,我们可以用this指针来区分,像这里可以不用this 30 } 31 void Anmial::play() 32 { 33 std::cout << pName << " like play " << Agame << std::endl; 34 } 35 36 int main() 37 { 38 Person *Prn = new Anmial("xiaohua", "cod16"); //使用new创建一个对象 39 Prn->play(); 40 delete Prn; //清理堆里内存 41 Prn = NULL; //指针清空 42 43 return 0; 44 }
第三十五讲:关于动态数组
1 int main() 2 { 3 int count; 4 std::cout << "输入整数" << std::endl; 5 std::cin >> count; 6 7 int *temp = new int [count]; //定义动态数组 8 for (int i = 0; i < count; i++) 9 { 10 temp[i] = i + 1; 11 std::cout <<"第"<<i<< "个数字尸"<< temp[i] << std::endl; 12 } 13 14 delete[]temp; //释放内存 15 return 0; 16 }
第三十八讲:强制转换
1 int main() 2 { 3 Company *cop = new Company("APPLE", "Iphone"); 4 TecCompany *Tcop = dynamic_cast<TecCompany*>(cop);//这里如果dynamic_cast<TecCompany*>(cop)转换没有成功,则得到的结果为NULL 5 if (Tcop == NULL) //当然我们也是可以用(TecCompany*)cop直接转换的,但是这样会存在风险 6 { 7 cout << "内存为空" << endl; 8 return 0; 9 } 10 Tcop->start(); 11 12 delete Tcop; 13 cop = NULL; 14 Tcop = NULL; 15 return 0; 16 }
第四十五讲:模板
函数模板
1 template<class T> //其中class并不是类的意思,而是我们约定俗称的 2 void foo(T a) //T代表了不确定的类型 3 { 4 //do something 5 }
调用的时候可以直接像普通函数那样调用,也可以写成 foo<int>(a);
类模板
1 template<class T> 2 class Student 3 { 4 student(); 5 void foo(T &a, T &b); 6 };
举个例子:
1 template<class T> 2 class Stack 3 { 4 public: 5 Stack(int size = 100); //如果不指定大小,则默认100 6 ~Stack(); 7 void push(T value); 8 T pop(); 9 10 protected: 11 int size; 12 T *date; //定义一个指针 13 int sp; 14 15 }; 16 17 template<class T> 18 Stack<T>::Stack(int size) //注意泛型的类名的后面要增加一个T 19 { 20 this->size = size; 21 date = new T[size]; 22 sp = 0; 23 } 24 25 template<class T> 26 Stack<T>::~Stack() 27 { 28 delete[] date; //释放指针指向的内存 29 } 30 31 template<class T> 32 void Stack<T>::push(T value) 33 { 34 date[sp++] = value; 35 } 36 37 template<class T> 38 T Stack<T>::pop() 39 { 40 return date[--sp]; 41 } 42 int main() 43 { 44 Stack<int> sta; 45 sta.push(1); 46 sta.push(2); 47 sta.push(3); 48 cout << sta.pop() << endl; 49 cout << sta.pop() << endl; 50 cout << sta.pop() << endl; 51 return 0; 52 }
当需要多个数据类型的时候我们只需要增加数据类型即可 template<class T,class U> ,实例化时我们只需要填入我们需要的类型即可 MyClass<int, double> mc;
第四十八讲:容器
向量:vector,定义 vector<string> vct;
1 #include<vector> 2 using namespace std; 3 int main() 4 { 5 vector<string> vct; 6 vct.push_back("HELLO "); 7 vct.push_back("WORLD!"); 8 vector<string>::iterator iter = vct.begin(); //iterator是迭代器 9 10 while (iter != vct.end()) 11 { 12 cout << *iter << endl; //输出hello world 13 ++iter; 14 } 15 return 0; 16 }