参考书籍:《c++ primer》
<a href="#c-%e9%9d%a2%e8%af%95%e5%9f%ba%e7%a1%80%e7%9f%a5%e8%af%86%e6%80%bb%e7%bb%93-%e7%b1%bb">c 面试基础知识总结 类</a>
<a href="#%e7%9b%ae%e5%bd%95">目录</a>
<a href="#%e7%b1%bb%e7%9a%84%e5%9f%ba%e7%a1%80">类的基础</a>
<a href="#%e6%88%90%e5%91%98%e5%87%bd%e6%95%b0">成员函数</a>
<a href="#%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0">构造函数</a>
<a href="#%e8%ae%bf%e9%97%ae%e6%8e%a7%e5%88%b6%e5%92%8c%e5%b0%81%e8%a3%85">访问控制和封装</a>
<a href="#%e5%8f%8b%e5%85%83">友元</a>
<a href="#%e5%90%8d%e5%ad%97%e6%9f%a5%e6%89%be%e4%b8%8e%e7%b1%bb%e7%9a%84%e4%bd%9c%e7%94%a8%e5%9f%9f">名字查找与类的作用域</a>
<a href="#%e7%b1%bb%e7%9a%84%e9%9d%99%e6%80%81%e6%88%90%e5%91%98%e4%b8%8e%e6%99%ae%e9%80%9a%e6%88%90%e5%91%98">类的静态成员与普通成员</a>
在成员函数中,可以直接访问数据成员,而在这个过程中实际上隐式地使用了一个名为this的隐式指针,该指针指向正是这个类对象。
重点注意:在语句<code>string getname() const{return name;};</code>中,const修饰的是this指针,在这里,this指针的默认类型为<code>people *const</code>,为指向非常量类型的常量指针。在函数后加上const声明,可以将this指针声明为<code>const people *const</code>类型。这里如果不加const声明的话,将会报错,因为类对象p是一个常量。
成员函数也可以在类外部定义,需要加上作用域运算符:
如果类没有声明任何构造函数,就会合成默认的构造函数。如果需要默认构造函数,需要定义。
一旦定义构造函数,就不会自动生成默认构造函数
使用默认构造函数时要注意去掉对象名后的空括号对。
构造函数有一个隐式转换的规则,例如people类定义了一个接受string类型的构造函数,就可以在需要使用people的时候用string代替。
但是编译器只会自动地执行一步类型转换。
如果不想通过构造函数,隐式地转换类,可以在构造函数前加上关键字explicit。然后就只能使用强制转换的方式了。
在c++中,class和struct唯一区别是,class中成员默认是private的,struct中成员默认是public。
以上三个类完全一样。
可以通过设置友元的方法来让其他函数访问类的私有成员。
也可以设置其他类为类的友元。
也可以只让do的成员函数setage()成为people类的友元
成员函数中使用的名字按照如下方式解析:
1.首先在成员函数内查找该名字的声明,只有在函数使用之前出现的声明才考虑。
2.如果成员函数内没有找到,则在类内继续查找,这时类的所有成员都可以被考虑。
3.如果类内也没有找到该名字的声明,在成员函数定义之前的作用域内查找。
静态成员可以是不完全类型。
静态成员可以用作默认实参