C++学习细节回顾(汇总二)
一.初始化列表相关
1.初始化顺序受申明顺序影响
2.在必要时可以部分不采用初始化列表,避免受特性1影响
二.非类型模板参数
template< class T , size_t N = 10 >
三.特化–特殊化处理
template< class T >
bool less(T left , T right)
{
return left<right;
}
当调用时传入的是地址,这时候比较逻辑存在错误
因此要采用特化(类似于类的显示实例化)
template<>
bool less<Date*>(Date * left ,Date* right)
{
return *left<*right;
}
注意:模板函数一般不采用特化,直接写个匹配的普通函数就行了(有现成吃现成)
小细节讲解:
bool less(const T& left…)
特化:
bool less< const Date*& left> 不对特化不成功,模板函数const修饰的是left ,这里修饰的是 * left
bool less< Date* const & left> ,正确的
四.类模板–特化
1.全特化 template<> class Date< int char >
2.偏特化有两种一种是部分特化,一种是对参数形成限制
template< class T1> class Date< class T1, char >//部分特化
template< class T1 class T2> class Date< T1* ,T2* >//对参数形成限制
类模板特化应用示例
有如下专门用来按照小于比较的类模板Less:
template
struct Less
{
bool operator()(const T& x, const T& y) const
{
return x < y;
}
};
sort( v1.begin() , v1.end() , Less < Date >( ));
// 可以直接排序,结果错误日期还不是升序,而v2中放的地址是升序
// 此处需要在排序过程中,让sort比较v2中存放地址指向的日期对象
// 但是走Less模板,sort在排序时实际比较的是v2中指针的地址,因此无法达到预期
sort(v2.begin(), v2.end(), Less<Date>( ));*
解决方案:// 对Less类模板按照指针方式特化
template<>
struct Less<Date*>
{
bool operator()(Date* x, Date* y) const
{
return *x < *y;
}
};
五.编译.声明和定义相关问题
六…(难点目前不会??????)
1.仿函数
2.普通迭代器和const迭代器