课程链接: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;
3-4 单元巩固
第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)