- 抑制构造用函数的隐式转换(explicit)
当类存在一个参数的构造函数的时候也可以将这个构造函数称之为转换构造函数,允许将参数类型的值转换成类类型,但是只允许一步类型转换,如果想要禁止这种转换操作,可以通过在构造函数前面添加 explicit 实现。注意,如果将构造函数声明成了explicit的方式,那么在实例化对象的初始化时只能够使用直接初始化,而不能够使用拷贝初始化。
1 #include <iostream> 2 #include <string> 3 4 5 class test 6 { 7 public: 8 test() = default; 9 test(std::string str) 10 { 11 strName = str; 12 } 13 14 std::string strName; 15 }; 16 17 int main() 18 { 19 test t; 20 std::string strName = "Name"; 21 t = strName; 22 23 // 这一行是无法通过编译的,因为只允许一步类型转换 24 // 这一步操作需要先将字符串转换为string类型,然后再转换为类类型 25 // t = "Name"; 26 27 28 return 0; 29 }
- 可变类型(mutable)
一个可变数据类型永远不会是const类型,如果在类型将成员声明成了mutable类型的变量,例如 mutable int n; ,那么即便是在const接口中也可以对其进行修改。
- 友元的传递性
友元是不具有传递性质的,假如B是A的友元,C是B的友元,那么C不是A的友元,C不能够访问A类中的成员。
- 聚合类
如果一个类所有成员都是public的,没有定义任何构造函数,没有类内初始值,没有基类,也没有virtual方法,则称这个类为聚合类,聚合类在实例化对象的时候可以采用初始化列表的方式进行初始化,值的顺序与类中定义成员的顺序是一致的,如果初始化列表中的值的数量少于成员的数量,则剩余的成员采用值初始化的方式进行初始化,但是不可以多于类内数据成员的数量。