c++ 类 总结

#############
## 类
#############
友元(friend)、可变成员(mutable)、静态成员(static)

构造函数:(冒号后面为初始化列表,用来初始化数据成员)
Fun():x(5),y(10){}

成员函数:必须在类内部声明,但是不必在内部定义。如果在内部定义,则默认为inline。

外部定义:必须用域操作符'::'指定所属类名。例如:ClassName::fun1(){}

struct: 如果类用该关键字定义,则默认成员是公有的。
class :默认成员是私有的。

类的访问符:public 、private、protected。
        访问符出现的次数、位置都没有限制;访问符限制其后定义的成员的访问级别。
public:可以由程序的所有部分访问。
private:只能本类内部访问。
protected:本类已经后代类访问。

关键字 typedef: std::string::size_type index
        typedef 给一个类型设置别名

重载操作符:
        1、两个重载成员的形参数量和类型不能完全相同。
        2、类的成员函数只能重载类的其他成员函数,不能重载非成员函数和其他类中声明的函数。

inline:类内部成员函数默认inline,也可以显示的指定inline
三种方式定义内联函数:
1、在类内部定义函数。
2、在类内部的函数声明上用inline显示指定。
3、在类外部的函数定义上用inline显示指定。


类定义:一个类只能被定义一次,如果在多个文件中定义一个类,则每个文件中的定义必须相同。

头文件保护符:header guard,保证即使头文件在同一文件中被包含多次,类定义也只出现一次。

前向声明(forward declaraton):class Screen。Screen为类类型,它在声明后,定义前这个状态,是一个不完全的类型(incompete type)。

不完全类型(incompete type):
        1、不能定义该类型的对象。
        2、用于定义指向该类型的指针已经引用
        3、用于声明(而非定义) 使用改类型作为形参类型或返回类型的 函数。
类不可以具有自身类型的数据成员,但可以有指向自身类型的指针和引用。


####################
##类对象
####################

1、定义类型时并不进行内存分配,当我们定义对象时会分配内存

2、类类型的使用:
        a、将类的名字直接用作类型名。
        b、关键字class|struct + 类的名字。

3、类定义后可以接一个对象列表,必须以分号结束。

4、this指针:成员函数具有附加的隐含形参,即指向该类对象的一个指针-this

5、可变数据成员(mutable data member):永远不能为const ,即使他是const对象的成员。mutable数据成员可以被const成员函数修改

6、常成员函数:const放在参数列表后面修饰成员函数表示常成员函数
   特性:const 成员函数不能修改它所在对象的数据成员。(mutable 除外)
         const 成员函数只能访问const 成员函数,成员函数只能访问成员函数。

7、成员访问操作符:‘.' '->' 。前者是对象访问成员,后者是对象指针访问成员

8、‘::'类作用域限定符,可以用于在类外定义成员函数。

9、在类作用域外定义的成员函数,需要使用完全限定名即:ClassName::fun
   函数的返回值因为在函数名前,也需要使用完全限定名。
   形参列表和函数体在函数名后,则不需要使用。

10、名字查找优先级:先后为所在函数体、所在类、所在文件

#####################
##构造函数
#####################
1、构造函数初始化列表:以冒号开始,以逗号分割,每个数据成员后面用括号包含初始化式

2、初始化const或者引用数据成员的唯一机会是在构造函数初始化列表。

3、默认构造函数:只有没有定义构造函数时系统才会自动生成默认构造函数

4、没有定义构造函数并且全体数据成员均为public的类,可以采用与初始化数组元素乡土的方式初始化其成员(按照声明的顺序)。例如:
   ClassName obj = {0,0};
################
##友元
################
友元机制(friend):允许一个类将对自身非公有成员的访问权限授予指定的函数或类。
特性:只能出现在类定义内部(任何地方),不受声明出现部分的访问控制影响。
例如:
  class Screen
  {
    friend class Window_Mgr;
  }
  Window_Mgr 对象可以访问Screen的私有成员。如果Screen想访问Window_Mgr 的私有成员  则需要在Window_Mgr 中设置 friend class Screen;

  友元可以是非成员函数、其他类的成员函数、或者整个类。

###############
## static
###############
1、数据成员:
   static 数据成员是与类关联的,独立于该类的任何对象。
   非static 数据成员与对象关联,存在该类的每个对象中。

2、成员函数:
   static成员函数:没有this形参,可以直接访问所属类的static成员,不能直接使用非static成员。

3、static成员的定义:在声明前添加static关键字。static成员遵循访问规则。

4、static成员的使用:
   a:通过作用域操作符直接调用,Account::rate();
   b: 通过对象调用:Account act;act.rate();
   c: 通过指针调用:Account* p = &act; p->rate();

5、外部定义static成员,无须重复指定static保留字,改保留字只出现在类定义体内部的声明处。

6、static函数没有this指针,也不能被指明为const,也不能被声明为虚函数。

7、static 数据成员必须在类定义体外部定义(static const 除外)。
   static 数据成员不通过构造函数初始化
   例如:int ClassName::data = initData();//类定义体外、main函数外



原文地址:https://www.cnblogs.com/lipeil/p/2869795.html