首页 > 代码库 > C++ 类与对象

C++ 类与对象

 类与对象是C与C++的最大区别之一,也是从面向过程转为面向对象的一个转折点

以下分为多部分介绍

1.1 类,结构体的扩展

1.2 公有和私有

1.3 构造函数

1.1类,结构体的扩展

类(class)从使用上可以理解为结构体(struct)的扩展,类中除了可以包含变量、还可以包括方法等内容。

结构体

struct Car

{

  string s_strName;//名字
  int s_iWheelNumber;//轮子数量  

};

//使用结构体的方法如下

int main(void)

{

  struct Car car;

  car.s_strName="Benz"

  car.s_iWheelNumber=4;

  cout<<"名字:"<<car.s_strName;

}

在类(class)中,除了上述变量的结构体成员,还加入了move_forward() 函数、move_back()函数

class Car

{

public://这个在1.2介绍

  string m_strName;

  int m_iWheelNumber;

  void move_forward(void);

  void move_back(void);

};

void Car::move_forward(void)

{

  cout<<"前进"<<endl;

}

void Car::move_back(void)

{

  cout<<"后退"<<endl;

}

//要使用类,与结构体类似,需要将类进行实例化:

int main(void)

{

  Car car;//实例化;Car为类,car为对象

  car.m_strName="Benz";//调用car中的m_strName(到此步骤基本与struct相同)

  car.move_forward();//调用car中的move_forward方法。

  cout<<"汽车的名字:"<<car.m_strName<<endl;

  system("pause");//暂停控制台

  return 0;

}

1.2公有和私有

在类中,public关键字下为公有成员、函数,类的外部可以调用 。private则为私有,仅为类的内部才能使用

把1.1中的例子修改成下面

class Car
{
public:
  void setName(string _name)
  {
    m_strName = _name;
  }
  string getName(void)
  {
    return m_strName;
  }
  void move_forward(void);
  void move_back(void);
private:
  string m_strName;
  int m_iWheelNumber;
};

int main(void)

{

  Car car;//实例化Car为类,car为对象

//  car.m_strName="Benz";//private中的变量在外部不能直接调用

  car.setName("Benz");//调用car中的setName()来改变m_strName

  car.move_forward();//调用car中的move_forward方法。

  cout<<"汽车的名字:"<<car.getName()<<endl;

  system("pause");//暂停控制台

  return 0;

}

其中m_strName为pravite不能在外部直接操作,但可以使用类中的方法setName()可以改变m_strName的值,getName()方法可以返回m_strName的值,这也是面向对象的基本思想之一。

1.3构造函数

C++的类与结构体不同的第三大特性,类具有构造函数,构造函数名字与类名相同,在实例化的时候自动调用,一般用于对类中的成员赋予初始值。

继续使用上面的例子改造

class Car

{

  public:

    Car(){m_strName ="Benz",m_iWheelNumber=4;};//构造函数

    void move_forward(void);

    void move_back(void);

    void setName(string _name)
    {
      m_strName = _name;
    }

    string getName(void)
    {
      return m_strName;
    }

  private:

    string m_strName;

    int m_iWheelNumber;
};

 

int main(void)

{

  Car car;//实例化;Car为类,car为对象,在实例化时,会调用构造函数Car();

// car.setName("Benz");//不需要调用这句,构造函数已经为成员赋初值

  car.move_forward();//调用car中的move_forward方法。

  cout<<"汽车的名字"<<car.getName()<<endl;

  system("pause");//暂停控制台

  return 0;

}

这里值得说明的是,即是没有写构造函数,C++也会自动为类添加一个空的构造函数

构造函数可以带有参数,参数还可以有默认值:

  Car(string _name,int _wheelnumber=4){m_strName =_name,m_iWheelNumber=_wheelnumber;};//构造函数

基本构造函数还可以重载,一个方法可以有多个基本构造函数,将上面两种构造函数放在同一个类中:

class Car

{

public:

  Car(){m_strName ="Benz",m_iWheelNumber=4;cout<<"1"<<endl;};//构造函数1
  Car(string _name,int _wheelnumber=4){m_strName =_name,m_iWheelNumber=_wheelnumber;};//构造函数2

  ...

}

除了基本构造函数,还存在一个拷贝构造函数,也就是拷贝的时候调用的构造函数

class Car

{

  public:

    Car(){m_strName ="Benz",m_iWheelNumber=4;cout<<"1"<<endl;};//普通构造函数

    Car(const Car &car){cout<<"2"<<endl;}//拷贝构造函数

    void move_forward(void);

    void move_back(void);

    void setName(string _name)
    {
      m_strName = _name;
    }

    string getName(void)
    {
      return m_strName;
    }

  private:

    string m_strName;

    int m_iWheelNumber;
};

int main(void)

{

  Car car;//实例化Car为类,car为对象 触发构造函数 打印出 1

  Car car2(car);//car2拷贝car,触发了拷贝构造函数(不触发普通构造函数),会打印出 2

  car.move_forward();//调用car中的move_forward方法。

  cout<<"汽车的名字"<<car.getName()<<endl;

  system("pause");//暂停控制台

  return 0;

}

值得注意,对象在函数传参的时候会发生拷贝,此时也会触发拷贝构造函数。

另外,拷贝构造函数因为拷贝才发生,因此没有重载。

C++ 类与对象