此笔记为准备面试用,主要是自己学过的一些知识概念。主要如下:

重载和重写的关系区别             overloading & overwrite

重载运算符使用                        overloading 

类的继承,私有成员变量         Inheritance, encapsulation, private members

以之前读过的nest_simulator的C++源码为学习实例。

class Node
{
  friend class NodeManager;
  friend class Subnet;
  friend class proxynode;
  friend class Synapse;
  friend class Model;
  friend class SimulationManager;

  Node& operator=( const Node& ); //!< not implemented

public:
  Node();
  Node( Node const& );
  virtual ~Node();

  /**
   * Virtual copy constructor.
   * This function should create a new object by
   * calling the derived class' copy constructor and
   * return its pointer.
   */
  virtual Node*
  clone() const
  {
    return 0;
  }

首先可以看到在这个类下定义了很多友元类,友元类的定义可以让Node类直接访问这些类的私有成员变量和方法。然后是一句运算符的重载。

运算符重载

Node& operator = (const Node& );

这里的重载使用显然是用于拷贝构造的。这里的“&”表示引用返回,引用返回的应用我也不甚了解,比较典型的是在自增运算符的重载例子里见到的。

Test& Test::operator++()
{
    m_value++;    //先增量
    return *this;  //返回当前对象
}

 Test Test::operator++(int)
{
    Test temp(*this);  //创建临时对象
    m_value++;       //再增量
    return temp;      //返回临时对象
}

然后在搞ACM的时候我常用到的是优先队列时和使用矩阵快速幂时的重载。

struct point{
    int x;
    int y;
    int times;
    friend bool operator < (point a, point b)
    {
        return a.times > b.times;    //重载小于号使得小的先出队列    
    }
}; 

这样可以使元素在队列里自动按需要的属性排序。这里的含义有点怪,因为想要point按times来升序排列,这个“<”重载的含义就是如果a.times > b.times,则a在队列中的优先度就小于b。

矩阵快速幂模板如下:

struct matrix{
    int m[N][N];
};
matrix operator * (matrix, matrix);//重载声明
matrix operator ^ (matrix a, int b){
    matrix ans;
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++) ans.m[i][j] = (i==j);
    }
    while (!b){
        if (b&1) ans = ans*a;
        a = a*a;
        b>>=1;
    }
    return ans;
}

matrix operator * (const matrix a, const matrix b){
    matrix ans;
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            ans.m[i][j] =0;
        }
    }
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            for (int k=0;k<N;k++){
                ans.m[i][j] += a.m[i][k]*b.m[k][j];
            }
        }
    }
    return ans;
}

虚基类

回到之前代码,下一句是这样的:

virtual ~Node();

累了,先更到这儿~

01-23 06:09