您现在的位置是:课程
周哥教IT.C/C++一站式学习
2023-06-14 21:57课程 人已围观
周哥简介
周哥:男,真名周扬荣,毕业于中科院软件所。曾就职于阿里巴巴,奇虎360安全公司,SUN中国工程研究院,北大计算机研究所等,创办了“麦洛科菲”高端IT安全培训 。
课程内容介绍
这是一套直接面向企业需求和底层开发的高标准C/C++语言学习教程
C语言学习意义:
1.曾经就职于Amazon和Google的卓越程序员Steve Yegge在他的文章《几种编程语言的优缺点》以及《程序员的呐喊》中指出“你必须懂C”,因为C最懂冯诺依曼计算机,而冯诺依曼计算机是当今计算机的架构标准。
2.底层开发必备
绝大多数的底层软件,包括操作系统(如Windows, Linux, UNIX等),数据库软件(如MySQL),办公软件(如OpenOffice),杀毒软件(如360),网络通信协议(如TCP/IP),加解密库(比如OpenSSL),包括JAVA,Python,PHP等语言的实现,以及各种内核驱动等都是用C语言开发的。C语言作为编程语言之王,是当之无愧的
3.安全攻防必备
4.高效率开发必备
JAVA JNI
Php C扩展
学会了难学的C语言,其它语言小菜一碟
5.《腾讯传》里指出:马化腾二年级开始把很多精力花在了C语言的学习上。马化腾日后说:“我们最终是靠C打天下的”
一,C语言编程:
《C语言深学活用》课程共包含下面15个大的章节。每个章节都有很多细节需要深入讲解。其中粗体标识的章节又是其中的重点和难点,比如:变量,函数传参、调用约定,指针等。
1.Hello world-程序的编写,编译,运行,测试,调试
2. 整数,浮点数编码与存储,进制与转换
3.数据类型与 变量( 存储空间,作用域,生命周期 )
4.运算符,表达式,语句
5.字符串
6.数组
7. 函数
q 传参:传值,传指针,(传引用)
q 调用约定( cdecl,stdcall,fastcall )
8. 指针
9.内存布局,分配与泄漏
10. 结构体,联合体,枚举
11. 位运算
12.宏
13.文件IO
14.软件调试
15.C语言与汇编
二,链表:
1.数据结构与算法定义,时间复杂度和空间复杂度计算
2.链表的定义
3.单向链表
创建一个最简单向链表
单向链表常见操作:创建,插入,删除,遍历,销毁
单向循环链表
4.双向链表
双向链表的创建
双向链表的插入
双向链表的删除
双向链表的遍历和销毁
三,C++面向对象编程:
1,C++学习序言
2,面向对象与面向过程(OOP VS POP)
3,C++与C语言区别
4,面向对象之封装
5,面向对象之继承
6,构造函数2个问题
7,面向对象之多态
8,面向对象之重载
9,面向对象实现多线程自动锁
10,单实例设计模式与多线程安全
11,C++课后作业:实现String类
12,STL模板库概述
13,vector容器
14,list容器
15,deque容器
16,set/multiset关联容器
17,map/multimap关联容器
18,适配器:stack,queue,priority_queue
19,STL算法与各种容器比较
四,现代C++精讲
《现代C++精讲》视频课程(目前已知的唯一一个讲现代C++课程的视频),面试里常问的什么智能指针,右值引用,移动语义,深拷贝浅拷贝,STL模板库,类型推导等等都直接干趴下。在本课中,我们将结合实际的例子,详细介绍现代C++的重要特性,并力求浅显易懂。本课提纲如下:
1,序言
从一次失败的面试经历说起
从C++98到现代C++
课程适用对象
2,泛型编程入门
泛型编程之模板函数
泛型编程之模板类
typename与class的区别
3,C++11重要内容提纲
4,右值引用
什么是左值(lvalue)和右值(rvalue)?
什么是左值引用?
什么是右值引用?
通用引用(universal references)
引用折叠规则
完美转发, std::forward
5,移动语义
浅拷贝带来的问题
传统拷贝构造函数
移动构造函数
std::move
std::forward和std::move区别
拷贝赋值函数与移动赋值函数
noexcept
vector与移动语义
6,类型推导
auto类型推断
auto的作用
auto注意事项
decltype推导
auto结合decltype返回值占位
decltype与auto区别
7,智能指针
C++内存管理与垃圾回收
智能指针概念
实现一个简单的智能指针:SmartPtr
早期智能指针的不足
unique_ptr
智能指针-shared_ptr:基本使用
shared_ptr注意事项
shared_ptr循环引用例子
shared_ptr多线程安全问题
weak_ptr
weakptr应用场景(1)-缓存
weakptr应用场景(2):避免循环引用和野指针
weakptr应用场景(3):观察者列表
树型结构用什么指针?
weak_ptr解决循环引用问题
weak_ptr解决多线程安全问题
智能指针比较分析
make_shared和new的区别
8,C++11对类定义的改进
新标准对类的改进主要内容
=default,=delete
使用delete而不是private来禁用函数
委托构造函数(Delegating constructors)
constexpr构造函数(1):理解constexpr
constexpr构造函数(2)
POD( Plain Old Data )-plain
POD( Plain Old Data )-old
POD-Plain Old Data
explicit构造函数
final关键字
override关键字
继承构造函数
9,STL容器改进
STL容器提纲
forward_list
std::array
cbegin,cend
swap
提高容器插入效率:emplace/emplace_back
shrink_to_fit
unordered_map概述
unordered_map存放内建型别数据
unordered_map存放自定义数据
unordered_map rehash
unordered_map与map比较
vector列表初始化
10,Lambda闭包
11,std::function类模板
可调用实体&仿函数
std::function类模版
std::bind(1)
std::bind(2)-绑定仿函数
std::bind(3)-类函数和成员
12,空指针:nullptr
13,列表初始化(1)
14,列表初始化(2)-阻止类型收窄
15,for语句的新写法
16,枚举类或强类型枚举
17,类型别名声明:using与typedef
18,多线程支持
19,C++14标准提纲
20,Lambda参数支持auto
21,C++14constexpr函数
22,C++14类型推导:decltype(auto)
23,二进制常量
24,C++17标准(1)
25,C++17标准(2)
26,C++20展望
27,C++就业-企业需求与求职建议
五,Linux C/C++开发
1,Linux学习序言
2,Linux系统概述
3,Linux系统命令学习
4,VIM学习
5,Linux编写Hello world
6,Makefile文件编写
7,Gdb调试C/C++程序
8,程序崩溃与Core文件分析
9,Linux IDE开发工具简介
10,动态库与静态库开发与调用
11,Linux pthread_create创建一个线程
12,Linux多线程互斥与同步机制
13,Linux进程通信机制
13.1,共享内存mmap
13.2,共享内存posix
13.3,管道
13.4,信号量
14,Linux网络编程
14.1,tcp/udp基础编程
14.2,服务端select模型
14.3,服务端epoll模型
15,Linux开源库开发
15.1,json解析
15.2,libconfig配置文件解析
15.3,memcached nosql数据库调用
15.4,mysql数据库调用
15.5,redis nosql数据库调用
C学习只是开始,只是一个点,学完C请继续构建自己的基础知识体系:
一,基础知识体系:
数据结构
汇编语言
面向对象思想:C++或者Java
网络协议与编程
多线程同步互斥,进程通信
数据库(SQL编程,C语言调用数据库接口)
界面开发(MFC,QT,gtk, Android界面等)
其它编程语言比如python,go等
二,立足平台,选择自己感兴趣的专业方向:
专业包括:内核和安全(麦洛克菲内核安全高级班)、大数据、甚至人工智能等
系统的构建自己的知识体系,而不是局限在某个点上。比如你前几年一直写VB/JavaScript/Delphi/SQL...现在项目组突然不再采用这些语言了,怎么办?
你至少要构建自己的技术壁垒和平台。学习C就应该构建底层技术或安全相关平台;学习Java,就应该构建你自己的JavaEE平台;Objective-C对应IOS/OS X开发平台;C#对应.Net平台,SQL对应数据库平台。如果用JavaScript,那你对应的是整个前端平台。
立足平台,你会站得很稳。立足一个点,你可能摔得很惨
学员评价
课程勘误
C语言部分:
第1课:“Hello world=》程序基础概念入门讲解=》了解:PE格式(PE文件的结构)”中
PE加载基地址默认值应该为:0x400000,而不是0x4000000(后面多了一个0),但其实无论是0x400000还是0x4000000都可以,在VC工具里,程序加载的基地址ImageBase可以在项目属性的链接器(linxer)的高级选项里通过/BASE:"0x400000"来指定。而且更高版本的操作系统比如Windows里,已经引入了地址随机化,因此,加载的基地址会动态随机变化而不再是一个固定值,提高了系统的安全性。
第2课:整数进制转换里面有个错误,10进制100 0x01100100 应该是 0x64,不是0x68,大概在35分钟左右那里。
第10课:一维数组定义与实例:
const int x = 10;
int a[x];
这个实际上是不支持的。const类型的变量并没有明确规定是编译阶段常量还是运行期间常量,有可能会推迟到运行期间初始化。
如果在新的C++11标准下,可以修改为:
constexpr int x = 10;
int a[x];
这样就支持了。constexpr是C++ 11引入的新关键字,明确定义了上面的x是编译阶段常量。
第13课“二级指针”一节:37分50秒这个位置,ptr2=*ptr1,这个时候*ptr1是p1,所以ptr2的值就p1的值,p1指向i,所以ptr2也应该是指向i的(即ptr2里存放的是i的地址)。所以,画箭头的时候,画错了,ptr1这个时候指向的不是p1,指向的是i。也就是ptr1和p1相等(里面存放的是i的地址),都是指向i的
第17课第二节“宏的二义性”里,#indefine写错了,应该为#define
C++部分:
视频1小时02分开始,在实现setName函数时,需要提前释放m_Name的内存。即正确版本为:
void setName(char *name)
{
if(m_name)
delete []m_name;
if(name==NULL)
{
m_name=new char[1];
*m_name='\0';
}
else
{
m_name=new char[strlen(name)+1];
strcpy_s(m_name,strlen(name)+1,name);
}
}
第10节 单实例设计模式与多线程安全
CLock *A::m_lock = new CLock();没有释放
修改:在类A中添加一个public静态方法:
static void destroyA() {
if(m_pA)
delete m_pA;
if(m_lock)
delete m_lock;
}
然后在main函数最后调用:
A::destroyA();
勘误提示:如您在学习过程中发现任何“错误”,请通过email:10950150@告知我们错误所在的课程名称和错误所在视频的时间起始位置。错误一经我们确认,我们将会在该门课程的“课程概述”里提供“错误更正”信息,并对您表示衷心的感谢。
周哥:男,真名周扬荣,毕业于中科院软件所。曾就职于阿里巴巴,奇虎360安全公司,SUN中国工程研究院,北大计算机研究所等,创办了“麦洛科菲”高端IT安全培训 。
课程内容介绍
这是一套直接面向企业需求和底层开发的高标准C/C++语言学习教程
C语言学习意义:
1.曾经就职于Amazon和Google的卓越程序员Steve Yegge在他的文章《几种编程语言的优缺点》以及《程序员的呐喊》中指出“你必须懂C”,因为C最懂冯诺依曼计算机,而冯诺依曼计算机是当今计算机的架构标准。
2.底层开发必备
绝大多数的底层软件,包括操作系统(如Windows, Linux, UNIX等),数据库软件(如MySQL),办公软件(如OpenOffice),杀毒软件(如360),网络通信协议(如TCP/IP),加解密库(比如OpenSSL),包括JAVA,Python,PHP等语言的实现,以及各种内核驱动等都是用C语言开发的。C语言作为编程语言之王,是当之无愧的
3.安全攻防必备
4.高效率开发必备
JAVA JNI
Php C扩展
学会了难学的C语言,其它语言小菜一碟
5.《腾讯传》里指出:马化腾二年级开始把很多精力花在了C语言的学习上。马化腾日后说:“我们最终是靠C打天下的”
一,C语言编程:
《C语言深学活用》课程共包含下面15个大的章节。每个章节都有很多细节需要深入讲解。其中粗体标识的章节又是其中的重点和难点,比如:变量,函数传参、调用约定,指针等。
1.Hello world-程序的编写,编译,运行,测试,调试
2. 整数,浮点数编码与存储,进制与转换
3.数据类型与 变量( 存储空间,作用域,生命周期 )
4.运算符,表达式,语句
5.字符串
6.数组
7. 函数
q 传参:传值,传指针,(传引用)
q 调用约定( cdecl,stdcall,fastcall )
8. 指针
9.内存布局,分配与泄漏
10. 结构体,联合体,枚举
11. 位运算
12.宏
13.文件IO
14.软件调试
15.C语言与汇编
二,链表:
1.数据结构与算法定义,时间复杂度和空间复杂度计算
2.链表的定义
3.单向链表
创建一个最简单向链表
单向链表常见操作:创建,插入,删除,遍历,销毁
单向循环链表
4.双向链表
双向链表的创建
双向链表的插入
双向链表的删除
双向链表的遍历和销毁
三,C++面向对象编程:
1,C++学习序言
2,面向对象与面向过程(OOP VS POP)
3,C++与C语言区别
4,面向对象之封装
5,面向对象之继承
6,构造函数2个问题
7,面向对象之多态
8,面向对象之重载
9,面向对象实现多线程自动锁
10,单实例设计模式与多线程安全
11,C++课后作业:实现String类
12,STL模板库概述
13,vector容器
14,list容器
15,deque容器
16,set/multiset关联容器
17,map/multimap关联容器
18,适配器:stack,queue,priority_queue
19,STL算法与各种容器比较
四,现代C++精讲
《现代C++精讲》视频课程(目前已知的唯一一个讲现代C++课程的视频),面试里常问的什么智能指针,右值引用,移动语义,深拷贝浅拷贝,STL模板库,类型推导等等都直接干趴下。在本课中,我们将结合实际的例子,详细介绍现代C++的重要特性,并力求浅显易懂。本课提纲如下:
1,序言
从一次失败的面试经历说起
从C++98到现代C++
课程适用对象
2,泛型编程入门
泛型编程之模板函数
泛型编程之模板类
typename与class的区别
3,C++11重要内容提纲
4,右值引用
什么是左值(lvalue)和右值(rvalue)?
什么是左值引用?
什么是右值引用?
通用引用(universal references)
引用折叠规则
完美转发, std::forward
5,移动语义
浅拷贝带来的问题
传统拷贝构造函数
移动构造函数
std::move
std::forward和std::move区别
拷贝赋值函数与移动赋值函数
noexcept
vector与移动语义
6,类型推导
auto类型推断
auto的作用
auto注意事项
decltype推导
auto结合decltype返回值占位
decltype与auto区别
7,智能指针
C++内存管理与垃圾回收
智能指针概念
实现一个简单的智能指针:SmartPtr
早期智能指针的不足
unique_ptr
智能指针-shared_ptr:基本使用
shared_ptr注意事项
shared_ptr循环引用例子
shared_ptr多线程安全问题
weak_ptr
weakptr应用场景(1)-缓存
weakptr应用场景(2):避免循环引用和野指针
weakptr应用场景(3):观察者列表
树型结构用什么指针?
weak_ptr解决循环引用问题
weak_ptr解决多线程安全问题
智能指针比较分析
make_shared和new的区别
8,C++11对类定义的改进
新标准对类的改进主要内容
=default,=delete
使用delete而不是private来禁用函数
委托构造函数(Delegating constructors)
constexpr构造函数(1):理解constexpr
constexpr构造函数(2)
POD( Plain Old Data )-plain
POD( Plain Old Data )-old
POD-Plain Old Data
explicit构造函数
final关键字
override关键字
继承构造函数
9,STL容器改进
STL容器提纲
forward_list
std::array
cbegin,cend
swap
提高容器插入效率:emplace/emplace_back
shrink_to_fit
unordered_map概述
unordered_map存放内建型别数据
unordered_map存放自定义数据
unordered_map rehash
unordered_map与map比较
vector列表初始化
10,Lambda闭包
11,std::function类模板
可调用实体&仿函数
std::function类模版
std::bind(1)
std::bind(2)-绑定仿函数
std::bind(3)-类函数和成员
12,空指针:nullptr
13,列表初始化(1)
14,列表初始化(2)-阻止类型收窄
15,for语句的新写法
16,枚举类或强类型枚举
17,类型别名声明:using与typedef
18,多线程支持
19,C++14标准提纲
20,Lambda参数支持auto
21,C++14constexpr函数
22,C++14类型推导:decltype(auto)
23,二进制常量
24,C++17标准(1)
25,C++17标准(2)
26,C++20展望
27,C++就业-企业需求与求职建议
五,Linux C/C++开发
1,Linux学习序言
2,Linux系统概述
3,Linux系统命令学习
4,VIM学习
5,Linux编写Hello world
6,Makefile文件编写
7,Gdb调试C/C++程序
8,程序崩溃与Core文件分析
9,Linux IDE开发工具简介
10,动态库与静态库开发与调用
11,Linux pthread_create创建一个线程
12,Linux多线程互斥与同步机制
13,Linux进程通信机制
13.1,共享内存mmap
13.2,共享内存posix
13.3,管道
13.4,信号量
14,Linux网络编程
14.1,tcp/udp基础编程
14.2,服务端select模型
14.3,服务端epoll模型
15,Linux开源库开发
15.1,json解析
15.2,libconfig配置文件解析
15.3,memcached nosql数据库调用
15.4,mysql数据库调用
15.5,redis nosql数据库调用
C学习只是开始,只是一个点,学完C请继续构建自己的基础知识体系:
一,基础知识体系:
数据结构
汇编语言
面向对象思想:C++或者Java
网络协议与编程
多线程同步互斥,进程通信
数据库(SQL编程,C语言调用数据库接口)
界面开发(MFC,QT,gtk, Android界面等)
其它编程语言比如python,go等
二,立足平台,选择自己感兴趣的专业方向:
专业包括:内核和安全(麦洛克菲内核安全高级班)、大数据、甚至人工智能等
系统的构建自己的知识体系,而不是局限在某个点上。比如你前几年一直写VB/JavaScript/Delphi/SQL...现在项目组突然不再采用这些语言了,怎么办?
你至少要构建自己的技术壁垒和平台。学习C就应该构建底层技术或安全相关平台;学习Java,就应该构建你自己的JavaEE平台;Objective-C对应IOS/OS X开发平台;C#对应.Net平台,SQL对应数据库平台。如果用JavaScript,那你对应的是整个前端平台。
立足平台,你会站得很稳。立足一个点,你可能摔得很惨
学员评价
课程勘误
C语言部分:
第1课:“Hello world=》程序基础概念入门讲解=》了解:PE格式(PE文件的结构)”中
PE加载基地址默认值应该为:0x400000,而不是0x4000000(后面多了一个0),但其实无论是0x400000还是0x4000000都可以,在VC工具里,程序加载的基地址ImageBase可以在项目属性的链接器(linxer)的高级选项里通过/BASE:"0x400000"来指定。而且更高版本的操作系统比如Windows里,已经引入了地址随机化,因此,加载的基地址会动态随机变化而不再是一个固定值,提高了系统的安全性。
第2课:整数进制转换里面有个错误,10进制100 0x01100100 应该是 0x64,不是0x68,大概在35分钟左右那里。
第10课:一维数组定义与实例:
const int x = 10;
int a[x];
这个实际上是不支持的。const类型的变量并没有明确规定是编译阶段常量还是运行期间常量,有可能会推迟到运行期间初始化。
如果在新的C++11标准下,可以修改为:
constexpr int x = 10;
int a[x];
这样就支持了。constexpr是C++ 11引入的新关键字,明确定义了上面的x是编译阶段常量。
第13课“二级指针”一节:37分50秒这个位置,ptr2=*ptr1,这个时候*ptr1是p1,所以ptr2的值就p1的值,p1指向i,所以ptr2也应该是指向i的(即ptr2里存放的是i的地址)。所以,画箭头的时候,画错了,ptr1这个时候指向的不是p1,指向的是i。也就是ptr1和p1相等(里面存放的是i的地址),都是指向i的
第17课第二节“宏的二义性”里,#indefine写错了,应该为#define
C++部分:
视频1小时02分开始,在实现setName函数时,需要提前释放m_Name的内存。即正确版本为:
void setName(char *name)
{
if(m_name)
delete []m_name;
if(name==NULL)
{
m_name=new char[1];
*m_name='\0';
}
else
{
m_name=new char[strlen(name)+1];
strcpy_s(m_name,strlen(name)+1,name);
}
}
第10节 单实例设计模式与多线程安全
CLock *A::m_lock = new CLock();没有释放
修改:在类A中添加一个public静态方法:
static void destroyA() {
if(m_pA)
delete m_pA;
if(m_lock)
delete m_lock;
}
然后在main函数最后调用:
A::destroyA();
勘误提示:如您在学习过程中发现任何“错误”,请通过email:10950150@告知我们错误所在的课程名称和错误所在视频的时间起始位置。错误一经我们确认,我们将会在该门课程的“课程概述”里提供“错误更正”信息,并对您表示衷心的感谢。