成员函数模板可以使得函数可以接受所有兼容的类型。如果你用成员函数模板声明了拷贝构造函数和赋值运算符,仍然需要手动编写普通拷贝构造函数和拷贝运算符。
Effective C++ 44:将参数无关代码重构到模板外去
把模板中参数无关的代码重构到模板外便可以有效地控制模板产生的代码膨胀。另外代码膨胀也可以由类型模板参数产生:对于非类型模板参数产生的代码膨胀,用函数参数或数据成员来代替模板参数即可消除冗余;对于类型模板参数产生的代码膨胀,可以让不同实例化的模板类共用同样的二进制表示。
CSS 选择器总结
我们知道CSS是由选择器和属性/值列表构成的,选择器的重要性自然不言而喻。
作为前端开发者选择器想必不是问题,然而前几天面试还真问到了~
和+
是干吗用的!
长时间不用的选择器自然就会忘了,来总结一下吧!
万维网联盟在 HTML 4.0 之外提出层叠样式表(CSS),使用CSS完成样式与内容的分离。层叠样式表(Cascading Style Sheets,CSS), 又称串样式列表、层次结构式样式表文件,一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言,由W3C定义和维护。
CSS共有5种基本选择器:
- 类型选择器(
h1
,p
等):用于选择指定类型的HTML标签; - 类选择器(
.classname
):用于选择指定class的HTML标签; - ID选择器(
#idname
):用于选择指定id的HTML标签; - 通配符选择器(
*
):用于选择所有类型的HTML标签; - 属性选择器(
[foo='bar']
):用于选择某属性为指定值的HTML标签;
和2种伪选择器:
- 伪类选择器:用于选择特定状态的元素。
- 伪元素选择器:如
:before
,:first-letter
,用于向某些选择器设置特殊效果,以实现复杂的样式。
还有各种组合选择器(例如
, +
, >
, ~
),用来选择拥有特定层级的元素。至于CSS选择器发生冲突时它们的优先级,参见另一篇文章:
CSS规则的优先级匹配
Effective C++ 43:访问模板基类中的名称
从面相对象C++转移到模板C++时,你会发现类继承在某些场合不在好使了。比如父类模板中的名称对子类模板不是直接可见的,需要通过this->前缀、using或显式地特化模板父类来访问父类中的名称。
Effective C++ 42:typename 的两种用法
模板参数前的typename和class没有任何区别;但 typename还可以用来帮编译器识别嵌套从属类型名称,基类列表和成员初始化列表除外。
Effective C++ 41:隐式接口与编译期多态
面向对象设计中的类(class)考虑的是显式接口(explicit interface)和运行时多态,而模板编程中的模板(template)考虑的是隐式接口(implicit interface)和编译期多态。
Effective C++ 40:明智地使用多继承
多继承比单继承复杂,引入了歧义的问题,以及虚继承的必要性;虚继承在大小、速度、初始化/赋值的复杂性上有不小的代价,当虚基类中没有数据时还是比较合适的;多继承有时也是有用的。典型的场景便是:public继承自一些接口类,private继承自那些实现相关的类。