课程链接:james_yuan的课程
这部分太枯燥了,如果教材难度稍大,根本就学不下去,所以就先看看通俗的视频吧。
课程目录
1.C++远征之起航篇 - C++亮点尽在其中
2.C++远征之离港篇 - C++扫清通往面向对象的最后一道障碍
3.C++远征之封装篇(上) - 封装--面向对象的基石。
4.C++远征之封装篇(下)- 封装--面向对象三大特征之一
5.C++远征之继承篇 - 继承,面向对象三大特征之一
6.C++远征之多态篇 - 多态,C++的精华所在。
7.C++远征之模板篇 - 模板,站在巨人的肩膀上。
1.数据结构探险—队列篇 - 与现实最为贴近的数据结构-队列。
2.数据结构探险—栈篇 - 栈,先入后出(FILO)
3.数据结构探险之线性表篇 - 线性表的主体顺序表和链表
4.数据结构探险之树篇 - 树,将为你开启更精彩的数据结构大门
C++远征之起航篇
第1章 C++简介
1-1 C++简介 (03:05)
贝尔实验室;C++之父;计算机语言排行:Java、C、object-C、C++、C#、PHP、Basic、Python
1-2 练习
第2章 C++ IDE环境搭建
2-1 C++ IDE环境搭建 (07:19)
IDE(编辑器、编译器、调试器、图形用户工具);visual studio 2013和visual assist X for visual studio
IDE使用:新建项目;新建文件;设置字体、字号;
新建项目--win32--win32控制台程序--空项目--右键源文件--新建C++文件
工具--选项--字体和颜色--16号--黑体
第3章 C++之初体验
3-1 C++之初体验
第4章 C++语言新特性
4-1 C++的新特性 (05:47)
新的数据类型;新的初始化方法;随用随定义
C语言中的数据类型:基本类型(int、char、float、double);构造类型(数组、struct、union、enum);指针;空类型void;
C++新增的bool(true、false)
C语言只有一种初始化方法(int x = 1024);C++中增加了直接初始化(int x(1024));
C语言必须在函数体开头定义所有变量
4-2 练习
4-3 C++的输入输出方式 (05:09)
C语言的输入输出:输入(输入设备--输入流--scanf--变量);输出(变量--printf--输出流--输出设备)
C++:用cin和cout代替相应的函数;好处:不关注占位符;不关注数据类型;不易出错;
4-4 练习
4-5 C++新特性以及输入输出演示 (06:54)
#include<iostream> #include<stdlib.h> using namespace std; //提示用户输入整数;然后分别以8、10、16进制输出 //提示输入一个布尔值,以布尔形式输出 int main() { int x(0); cout << "请输入一个整数:" << endl; cin >> x; cout << oct << x << endl << dec << x << endl << hex << x << endl; cout << "请输入一个布尔值:" << endl; bool y = false; cin >> y; cout << boolalpha << y << endl; return 0; }
4-6 C++之namespace (05:02)
命名空间就是为程序划片取名字;解决了命名冲突的问题;同时使用不同团队开发的程序
namespace定义命名空间;本程序内的所有变量和函数都在这个命名空间之内;
我错了,在一个文件内部也可以有多个命名空间,使用namespace就可以定义;类似于代码块的标记;
namespace A { int x = 0; void f1(); void f2(); }
cout << A::x << endl;
4-7 练习
4-8 namespace演示 (10:09)
#include<stdlib.h> #include<iostream> using namespace std; namespace A { int x = 1; void func() { cout << "A" << endl; } } namespace B { int x = 2; void func() { cout << "B" << endl; } void func2() { cout << "BB" << endl; } } using namespace B; int main() { cout << A::x << endl; B::func(); func2(); system("pause"); return 0; }
4-9 章节练习
第5章 综合练习
5-1 综合练习 (12:09)
//知识点:bool 命名空间 输入输出 //使用一个函数找出整型数组中的最大值和最小值 #include<stdlib.h> #include<iostream> using namespace std; namespace CompA { int getMaxOrMin(int *arr, int count, bool isMax) { int temp = arr[0]; for (int i = 1; i < count; i++) { if (isMax) { if (temp < arr[i]) { temp = arr[i]; } } else { if (temp > arr[i]) { temp = arr[i]; } } } return temp; } } int main(void) { int arr1[4] = { 3, 5, 1, 7 }; bool isMax = true; cout << CompA::getMaxOrMin(arr1, 4, isMax) << endl; system("pause"); return 0; }
C++远征之离港篇
第1章 离港总动员
1-1 离港总动员 (02:11)
面向对象:抽象、封装、继承、多态;
指针 VS 引用;#define VS const;函数默认值 & 函数重载;
内存管理;堆;出来混迟早是要还的;
第2章 C++语言引用
2-1 引用 (08:12)
外号、别名;不能只有别名;基本数据类型的引用;引用在定义时,创建并初始化(必须在创建时初始化);
int &b = a;
结构体类型的引用;
typedef struct { int x; int y; }Coor; int main() { Coor c1; Coor &c = c1; }
指针类型的引用(难点): 格式:类型 *& 指针引用名 = 指针;
int a = 10; int *p = &a; int *&q = p;
引用作函数参数:
//使用指针交换两个数 void fun(int *a, int *b) { int tmp = *a; *a = *b; *b = c; } int x = 10, y = 20; fun(&x, &y);
//使用引用交换两个数
void fun(int &a, int &b) { int tmp = a; a = b; b = tmp; } int x = 10, y = 20; fun(x, y);
2-2 引用代码演示 (06:59)
#include<iostream> using namespace std; int main() { int a = 0; int &b = a; b = 10; cout << a << endl; a = 20; cout << b << endl; return 0; }
#include<iostream> using namespace std; typedef struct { int x; int y; }Xin; int main() { Xin xin; Xin &a = xin; a.x = 10; a.y = 20; cout << xin.x << " " << xin.y << endl; return 0; }
#include<iostream> using namespace std; int main() { int a = 0; int *p = &a; int *&q = p; *q = 10; cout << a << endl; return 0; }
#include<iostream> using namespace std; void func(int &a, int &b); int main() { int x(10), y(20); cout << "Before: x = " << x << ", y = " << y << endl; func(x, y); cout << "After: x = " << x << ", y = " << y << endl; return 0; } void func(int &a, int &b) { int tmp = a; a = b; b = tmp; }
2-3 练习
2-4 单元巩固
第3章 C++语言const关键字
3-1 const (08:39)
const与基本数据类型;
const int x = 3;
const与指针类型; (规则很简单:const了谁,谁就不能改变了)
const int *p = NULL; int const *p = NULL; int *const p = NULL; const int * const p = NULL; int const * const p = NULL;
const与引用
int x = 3; const int &y = x; x = 10;//right y = 20;//wrong
//examples const int x = 3; x = 5; //wrong int x = 3; const int y = x; y = 5; //wrong int x = 3; const int *y = &x; *y = 5;//wrong
//examples int x = 3, z = 4; int * const y = &x; y = &z; //wrong const int x = 3; const int &y = x; y = 5;//wrong
const int x = 3; int *y = &x; //wrong int x = 3; const int *y = &x; //right
3-2 const代码演示 (10:05)
const int x = 3; x = 5;//wrong
#define X 3 //C的形式,不建议使用,因为不会检查错误
int const *p = &x; const int *p = &x; *p = 5;//wrong x = 5;//right **
int x = 3; int y = 5; int *const p = &x;//p can't change p = &y;//wrong *p = 10;//right
int const &z = x; z = 10;//wrong
void func(const int &a, const int &b) { //can't change a and b }
3-3 练习
指针指向const修饰的变量时,应该是const int const *p = &a;
第4章 C++函数新亮点
4-1 函数特性 (11:32)
函数参数的默认值; (声明的时候必须写上参数默认值; 定义的时候则不用写); 没有实参时就使用默认值
//有默认参数值的参数必须在参数表的最右端 void func(int i, int j = 5, int k = 10);
函数重载: 在相同作用域下;用同一名字定义多个函数; 不同函数之间的参数个数和参数类型必须不同;
int getMax(int x, int y, int z); double getMax(double x, double y); //内部机密:重新生成函数 getMax_int_int_int() getMax_double_double()
内联函数(inline)(编译时将函数体代码和实参代替函数调用语句,省去了进入和返回的步骤; 节省了大量时间); (编译时代码展开)
区别于普通函数(调用时,找到入口,执行后,返回);
inline int max(int a, int b, int x); int main() { int m = max(i,j,k);//直接使用 }
4-2 函数特性代码演示 (07:51)
void func(int i, int j = 20, int k = 10);
void func(int i, int j, int k); void func(double i, double j, double k);
inline max(int i, int j)
4-3 练习
4-4 单元巩固
第5章 C++内存管理
5-1 内存管理 (06:31)
内存的本质就是资源; 由操作系统控制; 我们需要申请和归还;
内存的申请和释放 new 和 delete 运算符;
int *p = new int; delete p;
int *arr = new int[10]; delete []arr;
//C void *malloc(size_t * size); void free(void *memblock); //C++ new; delete;
int *p = new int[1000]; if (NULL == p) { //fail }
delete p; p = NULL; delete []p; p = NULL;
/* 使用new申请内存,使用delete释放内存; 申请内存需要判断是否成功,释放内存需要设空指针; new与delete配套使用; */
5-2 内存管理代码演示 (04:06)
int *p = new int[20]; cout << *p << endl;
5-3 练习
5-4 单元巩固
C++远征之封装篇(上)
第1章 课程介绍
1-1 课程简介 (02:57)
类和对象;
数据成员和成员函数;
构造函数和析构函数;
对象赋值和对象复制;
对象数组和对象指针;
this指针;
面向过程 -》 面向对象
第2章 类与对象初体验
2-1 类和对象 (04:27)
一个存在的实体就是一个对象;同一类型的对象可以被抽象为一种类;
抽象化类时,我们一般只抽象出自己感兴趣的属性和方法,而不会全部列出(事实上也不存在全部);
封装,就是我们只向用户提供他们需要的东西,其他的都被封装在类里,不能被调用;
封装是通过访问限定符来实现的:public;protected;private;
class Dog { char name[20]; int age; int type; void speak(); void run(); }
2-2 类对象的定义 (11:56)
1.从栈中实例化(就是让编译器自动申请);2.从堆中实例化(手动申请);
class TV { public: char name[20]; int type; void changeVol(); void power(); } int main(void) { TV tv; TV tv[20]; return 0; }
class TV { public: char name[20]; int type; void changeVol(); void power(); } int main(void) { TV *p = new TV(); TV *q = new TV[20]; delete p; delete []q; return 0; }
对象成员的访问;栈(.);堆(->);
数组:p[i]->type;
//zhan int main(void) { TV tv; tv.type = 0; tv.changeVol(); return 0; } //dui int main(void) { TV *p = new TV(); p->type = 0; p->changeVol(); delete p; p = NULL; return 0; }
int main(void) { TV *p = new TV[5]; for(int i = 0; i < 5; i++) { p[i]->type = 0; p[i]->changeVol(); } delete []p; p = NULL; return 0; }
#include<iostream> using namespace std; class Coordinate { public: int x, y; void printX() { cout << x << endl; } void printY() { cout << y << endl; } }; int main(void) { Coordinate coor; coor.x = 10; coor.y = 20; coor.printX(); coor.printY(); coordinate *p = new Coordinate(); if(NULL == p) { return 0; } p->x = 100; p->y = 200; p->printX(); p->printY(); delete p; p = NULL; return 0; }
2-3 练习
第3章 初始字符串类型
3-1 初始String (13:51)
int double char float bool等常用且简单; char[]操作却很繁琐和复杂,需要使用strlen, strcat, strcpy, strcmp, strncpy, strncmp, strstr等字符数组函数来操作;
为此引入字符类:string
#include<iostream> #include<string> using namespace std; int main(void) { string name = "lizhixin"; string hobby("football"); cout << name << hobby << endl; return 0; }
string的初始化方法:
string s1; string s2("ABC"); string s3(s2); string s4(n, 'c');
//other usage s.empty(); s.size(); s[n]; s1+s2; s1=s2; v1 == v2; v1 != v2;
string s1 = "hello"; string s2("World"); string s3 = s1 + s2; string s4 = "hello" + s2; string s5 = "hello" + s2 + "world"; string s6 = "hello" + "world";//wrong
/* 1.提示用户输入姓名; 2.接受用户输入; 3.然后向用户问好,hello XXX; 4.告诉用户名字长度; 5.告诉用户名字首字母; 6.如果用户输入回车,这告诉用户输入为空; 7.如果用户输入的是imooc,告诉用户是管理员; */ #include<iostream> #include<string> using namespace std; int main(void) { string name; cout << "Please input your name:"; getline(cin, name); if (name.empty()) { cout << "input is null..." return 0; } if(name == "imooc") { cout << "you are a admin." << endl; } cout << "hello " << name << endl; cout << "your name length: " << name.size() << endl; cout << "your name's first letter is: " << name[0] << endl; return 0; }
3-2 单元巩固
第4章 属性封装的艺术
4-1 初始封装 (05:30)
面向对象的基本思想:数据成员需要被封装;只用成员函数操纵数据成员;这样可以防止对数据成员的随意更改;而函数则可以控制;
4-2 属性封装代码演示 (09:47)
一般讲public写在前面;private写在后面;
class Student { public: void setName(string _name) { m_strName = _name; } string getName() { return m_strName; } void setGender(string _gender) { m_strGender = _gender; } string getGender() { return m_strGender; } int getScore() { return m_intScore; } void initSore() { m_iScore = 0; } void study(int _score) { m_iScore += _score; } private: string m_strName; string m_strGender; int m_intScore; } int main(void) { Student stu; stu.initScore(); stu return 0; }
4-3 单元巩固
第5章 精彩的类外定义
5-1 类外定义 (05:56)
类内定义与内联函数;(类内定义的函数优先编译为内联函数)
类外定义:同文件类外定义;分文件类外定义;(一般都是分文件定义)
class Car { public: void run(); void stop(); void changeSpeed(); }; void Car::run(){} void Car::stop(){} void Car::changeSpeed(){}
//Car.h class Car { public: void run(); void stop(); void changeSpeed(); }; //Car.cpp #include "Car.h" void Car::run(){} void Car::stop(){} void Car::changeSpeed(){}
5-2 类外定义代码演示 (11:28)
5-3 练习
第6章 对象的生离死别
6-1 构造函数讲解 (08:26)
对象结构:
内存分区:栈区;堆区;全局区;常量区;代码区;
//栈区 int x = 0; int *p = NULL; //堆区 int *p = new int[20]; //全局区 //常量区 string str = "hello"; //代码区
对象的初始化(对象必须进行初始化):有且仅有一次;根据条件初始化;(这就是构造函数要干的事)
构造函数在对象实例化时被自动调用;
构造函数与类同名;
构造函数可以重载;
在没有定义构造函数时,编译器会自动生成一个构造函数;
6-2 构造函数代码演示 (09:34)
6-3 练习
6-4 构造函数初始化列表 (05:28)
默认构造函数;
构造函数初始化列表;1.先于构造函数执行;2.只能用于构造函数;3.可以同时初始化多个数据成员;
初始化列表的核心作用:
Student():m_strName("Jim"),m_iAge(10){}
6-5 初始化列表编码 (09:22)
6-6 练习
6-7 拷贝构造函数 (05:04)
拷贝构造函数的参数是确定的,不能重载
Student(const Student& stu){}
6-8 拷贝构造函数代码演示 (03:57)
6-9 练习
6-10 析构函数 (05:08)
6-11 析构函数代码演示 (06:09)
6-12 练习
第7章 课程总结
7-1 总结 (04:32)
7-2 综合练习
数据结构探险—队列篇
第1章 课程简介
1-1 课程简介 (02:13)
数据结构=数据集合+数据间的关系;都是前人总结出来的模型;站在巨人的肩膀上;
本课程:数据结构的原理;C++实现;
第2章 队列原理
2-1 队列 (07:37)
先入先出的数学模型(FIFO);排队买票;队头,对尾;
普通队列;要么浪费内存,后来者往后排;要么浪费时间,所有元素前移;
环形队列;课程重点讲解
队列实例:营业厅的排号系统--自动排号机
第3章 队列结构的面向对象设计
3-1 面向对象的队列设计 (10:43)
第4章 环形队列代码实现
4-1 环形队列实现上 (12:23)
4-2 环形队列实现下 (16:52)
4-3 环形队列检测 (10:18)
第5章 升华与应用
5-1 队列的实际应用 (14:04)