目录一、explicit关键字隐式类型转换explicit的作用二、static成员静态成员的特性三、友元友元函数友元类四、内部类内部类的特性五、匿名对象一、explicit关键字隐式类型转换对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数还具有类型转换的作用。红框中报错涉及到常引用问题不了解的朋友可以移步引用一节。explicit的作用explicit修饰构造函数将会禁止构造函数的隐式转换。禁止构造函数的隐式转换一定程度上可以提高可读性。二、static成员声明用static修饰的类成员被称为类的静态成员用static修饰的成员变量称之为静态成员变量用static修饰的成员函数称之为静态成员函数头文件源文件静态成员实际定义的时候尽量放在源文件中如果在头文件中直接初始化 / 定义了静态成员变量且该头文件被多个 .cpp 文件包含就会导致每个 .cpp 编译生成的目标文件中都有这个静态成员的定义链接时就会报 “多重定义” 错误。所以尽量做到静态成员声明放在 .h 文件中静态成员定义放在 .cpp 文件中。静态成员的特性①静态成员为所有类对象所共享不属于某个具体的对象存放在静态区②静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问③静态成员也是类的成员受public、protected、private 访问限定符的限制④静态成员变量必须在类外定义静态成员函数无此要求定义时不添加static关键字类中只是声明⑤静态成员函数没有隐藏的this指针不能访问任何非静态成员所以通常静态成员函数和静态成员变量一起出现箭头含义箭尾可以调用箭头这里浅提一下静态类对象属于全局的全局静态类对象包括在命名空间作用域中定义的静态对象会在main () 函数执行之前完成构造函数的调用和初始化属于程序启动阶段的一部分。定义在函数内部的局部静态类对象其构造函数在第一次执行到该对象的定义语句时被调用而非程序启动时且仅会初始化一次。即使函数被多次调用该对象也不会重复构造会保持上次调用后的状态常用于实现“单例模式”。三、友元友元提供了一种突破封装的方式有时可以提供便利但是友元会增加耦合度破坏封装性因此友元不宜多用。友元分为友元函数和友元类友元函数友元函数可以直接访问类的私有成员它是定义在类外部的普通函数不属于任何类但需要在类的内部声明声明时需要加friend关键字。友元函数的特性①友元函数可访问类的私有和保护成员但不是类的成员函数②友元函数不能用const修饰③友元函数可以在类定义的任何地方声明不受类访问限定符限制④一个函数可以是多个类的友元函数⑤友元函数的调用与普通函数的调用原理相同友元函数不能用const修饰的原因友元类友元类的特性①友元类的所有成员函数都可以是另一个类的友元函数都可以访问另一个类中的私有成员②友元关系是单向的不具有交换性。比如下面的Time类和Date类在Time类中声明Date类为其友元类那么可以在Date类中直接访问Time类的私有成员变量但想在Time类中访问Date类中私有的成员变量则不行③友元关系不能传递如果C是B的友元 B是A的友元则不能说明C是A的友元④友元关系不能继承友元类关于声明有一定的顺序要求先给错误的写法报错原因在 B 类的 accessPrivateData 函数中使用了 A 类的对象 a 并访问其私有成员privateData。但此时 A 类还没有被声明或定义编译器不知道 A 类是什么也不知道它有 privateData 这个成员。正确的写法这有多种这里只给常见的两种①②四、内部类如果A类定义在B类的内部A类就叫做B类的内部类。内部类就是外部类的友元类参见友元类的定义内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。内部类的特性①内部类可以定义在外部类的public、protected、private都是可以的。②注意内部类可以直接访问外部类中的static成员不需要外部类的对象/类名。③sizeof(外部类)外部类和内部类没有任何关系。④内部类是一个独立的类它不属于外部类更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限头文件源文件这里成员变量 h 为0的原因五、匿名对象头文件测试文件匿名对象也可以作参数源文件测试文件感谢阅读本文如有错漏之处烦请各位斧正