在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1.泛型编程的概念 ---不考虑具体数据类型的编程模式
- 函数模板其实是一个具有相同行为的函数家族,可用不同类型进行调用 ①函数模板的语法规则 ②函数模板的应用
3.函数模板的深入理解
函数模板可以像普通函数一样被重载 注意: 5.多参数函数模板 函数模板可以定义任意多个不同的类型参数 当声明的类型参数为返回值类型时 , 无法进行自动类型推导。 不完美解决方案:
6.类模板 一些类主要用于存储和组织数据元素 声明的泛指类型 T 可用于声明成员变量和成员函数 由于类模板的编译机制不同 , 所以不能像普通类一样分开实现后在使用时只包含头文件,在工程实践上 , 一般会把类模板的定义直接放到头文件中!!
类模板可以被特化:用 template<>声明一个类时, 表示这是一个特化类! 特化类模板的意义: 注意:编译器优先选择特化类生成对象!!
类模板的局部特化:可以指定类模板的特定实现 , 并要求某些类型参数仍然必须得模板的用户指定 为什么需要特化,而不重新定义新类 ? 非类型模板参数的限制:
怎么判断一个变量是否为指针???(模板与可变参数函数) -C++中仍然支持C语言中的可变参数函数
工程问题:内存泄露,内存多次释放,使用越界... ①内存越界的问题常发生于数组的使用中 ②内存泄漏和内存多次释放常发生于指针的使用过程中 工程中的智能指针是一个类模板:
7.智能指针的深入理解: STL常用的7种智能指针:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、 boost::shared_array、boost::weak_ptr、boost:: intrusive_ptr ①std::auto_ptr:
(1) 尽量不要使用“operator=”。如果使用了,请不要再使用先前对象。
(2) 记住 release() 函数不会释放对象,仅仅归还所有权。
(3) std::auto_ptr 最好不要当成参数传递(读者可以自行写代码确定为什么不能)。
(4) 由于 std::auto_ptr 的“operator=”问题,有其管理的对象不能放入 std::vector 等容器中。 ②boost::scoped_ptr (1)scoped_ptr 没有 release 函数 (2)没有重载 operator=,不会导致所有权转移,但无法赋值,拷贝智能指针。 ③boost::shared_ptr (2)同样没有release() 函数。
④boost::scoped_array (1)用于管理动态数组 (2) boost::scoped_array<Simple> my_memory(new Simple[2]); // 使用内存数组来初始化 (3)scoped_ptr 没有重载 operator* (4)没有重载 operator= ⑤boost::shared_array 内部使用了引用计数,可以复制,通过参数来传递。 ⑥boost::weak_ptr 是专门为 boost::shared_ptr 而准备的,boost::weak_ptr 只对 boost::shared_ptr 进行引用,而不改变其引用计数, ⑦boost::intrusive_ptr 这是一种插入式的智能指针,内部不含有引用计数,需要程序员自己加入引用计数。 智能指针总结:
1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错[2]。
2、在确定对象无需共享的情况下,使用 boost::scoped_ptr(当然动态数组使用 boost::scoped_array)。
3、在对象需要共享的情况下,使用 boost::shared_ptr(当然动态数组使用 boost::shared_array)。
4、在需要访问 boost::shared_ptr 对象,而又不想改变其引用计数的情况下,使用 boost::weak_ptr,一般常用于软件框架设计中。
5、最后一点,也是要求最苛刻一点:在你的代码中,不要出现 delete 关键字(或 C 语言的 free 函数),因为可以用智能指针去管理。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论