[关闭]
@guochy2012 2014-11-10T04:18:18.000000Z 字数 2614 阅读 1575

C++经验总结

作者:GuoChunyang

天数 内容 作业
第一天 复习C语言中遇到的常见问题。例如swap两个数字的原理、编译和链接的概要叙述,让学生知道一些常见的错误,例如头文件定义变量的错误、没有写main函数造成的连接错误。搞清函数传值的基本原理。会使用最简单的二级指针交换int*。 理解函数指针 尝试自己编写readn函数。使用函数指针编写冒泡排序。
第二天 C++的入门。学会使用string和vector。将vector当做一般数组使用 使用迭代器遍历vector。 理解new和delete的使用,以及和malloc的区别 练习C++基本的输入输出。将输入的单词保存至vector中。然后遍历输出。
第三天 异常处理 内联函数和宏函数的区别 函数中的const形参 函数重载(理解函数签名的概念) 1.随机生成100W和1000W个数,每个一行写入文件 2.将100W的数据当做黑名单,判断1000W个数是否在黑名单中。 3.使用普通查找和二分查找,测量时间,比较性能
第四天 C++的IO流 1.找一篇文本,统计词频 2.开发停用词功能,去掉常见的“the”等。 3.对词频排序,输出最高的10个词 4.统计每步需要的时间。 5.对停用词使用二分查找,比较性能
第五天 1.C++类的引入 2.成员函数的隐式参数 3.成员函数的const属性、补充函数重载 4.构造函数的重载 5.初始化列表 大作业: 写一个Date类,实现: 数据成员:year/month/day 提供两个构造函数 实现功能setDate设置日期 把时间设定为今天 setToday(); toString() 打印格式:2009/7/31 toFormatString:对于月份采用英文 September 19 2014 isLeapYear() 判断是否是闰年
第六天 类的静态函数 友元关系 顺序容器vector和list的基本操作 增删改查 vector的内存分配策略 vector和list的区别 实现一个时间戳类,精确到微妙。使用gettimeofday类
第七天 关联容器map和set的使用 map和set的比较 map中的元素根据value排序 hash_map和hash_set 使用map和set统计词频,测量性能
第八天 课堂上测试vector、map和hash_map在词频统计上的性能比较 hash_map和map的区别 STL中的reverse迭代器 类的复制控制、深拷贝、浅拷贝 类的复制构造函数和赋值运算符 禁止类的复制和赋值 值语义和对象语义 三法则问题 封装一个queue类,正确处理三法则问题
第九天 explicit关键字 运算符重载+= + == != 等 结合String类的模拟实现讲述运算符重载 智能指针的简单实现 常用的几种智能指针 编写Complex类 实现一个Array类,可以打印,可以+拼接
第十天 模板 函数模板 模板的编译 模板中的函数重载 模板函数重载时的特点,优先选择哪些版本 传引用在模板中的特殊作用 写一个max函数,重载每个版本
第十一天 类模板 基本概念 模板的编译模型 编写一个简易的stack类模板 讲述STL中容器适配器的概念 模板的缺省参数 成员函数模板 typename的注意点 模板中数组的decay问题 编写一个泛型的智能指针类 了解STL中vector和map的完整模板参数列表
第十二天 讲述C++中内存的概念 POD的概念 allocator的基本使用 标准库算法中copy和uninitialized_copy的区别 然后讲述vector的一个简易实现,该实现遵循C++98标准 vector如何清空内存 为vector扩充功能,实现迭代器功能
第十三天 类的继承 通过子类对象调用函数的一些准则 重点是父子类的重名函数 函数隐藏的概念 继承体系中的构造函数、复制构造函数、赋值运算符的实现 编写Noncopyable类 类的继承和类的组合
第十四天 类的多态 静态绑定和动态绑定 基类指针指向派生类的对象 函数的覆盖 纯虚函数 虚析构函数 封装Linux中的互斥锁 Condition的封装 使用C++编写生产者消费者
第十五天 讲述MutexLock、Condition的封装 使用继承编写Thread类 再次改进生产者消费者问题
第十六天 给出生产者消费者的完整实现 讲述类的基本设计原则 在之前的代码基础上,再次封装一个车间类,可以配置线程数目,体会封装的强大
第十七天 讲述RTTI的基本机制 typeid和dynamic_cast的基本使用 两种机制的正规使用方式 为继承体系Animal、Cat、Dog提供==操作符
第十八天 类的成员函数指针 mem_fun的基本使用 引用计数指针的模拟实现 标准库auto_ptr的使用和陷阱 练习实现auto_ptr
第十九天 单例模式的编写 测试普通加锁和double Check模式的性能比较 C++98和C++11中的左值和右值的概念 与const结合后的四种类型:const左值、const右值、非const左值、非const右值 编写重载函数,吸收四种不同的表达式
第十九天 引入C++11的右值引用和移动语义 使用移动语义编写string类
第二十天 C++11中类模板function和bind的基本使用 C++11中几种智能指针的正确使用unique_ptr shared_ptr和weak_ptr的结合使用 使用function实现Thread类 使用C++11的移动语义实现unique_ptr
第二十一天 封装TCP的其他组件,包括但不限于 ReadFile/TruncFile Date/Timestamp Timer/TimerThread Thread/MutexLock/Condition/ThreadPool InetAddress/Socket/EpollPoller TcpConnection TcpServer

经验总结:
1.实用为主,一切的重点是让学生学会使用C++,而不是仅仅掌握C++的语法。以算法为例,C++中不应该重点放在算法的实现上,而是算法和数据结构的正确使用。
2.强调标准实践,与业界的最新实践保持一致。所以,在C++学习过程中学习面试题是无意义、无价值的。应该强调某项技术的最佳实践是什么。
3.教学要循序渐进,每个知识点相互之前有关联,无法做到全部独立。以函数重载为例,学习函数时,知道函数重载的基本概念,深入一些可以理解函数名字改变。到了类的成员函数部分,进行全面的总结
4.先学会如何使用,之后再考虑底层实现细节问题。
5.可以使用打比方的方式,形象的教授某个知识点。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注