C++学习笔记 面向对象程序设计

来源:互联网 发布:股票编程接口 编辑:程序博客网 时间:2024/04/28 07:05

1. 什么是类、对象和成员?

类:一个类包含很多的对象。比如人类就是一个类,张三、李四等是人类的对象,这些对象拥有人类共同的功能和数据,如身高、体重、年龄等,而具体化这些数据我们可看做是人类的成员变量。所以类是由若干个变量和相关函数组成,而对象则拥有这些变量和函数。

2. 如何声明一个类?

类只有先声明才能使用它,我们用关键字class+类的名字来声明。

class Human{public: //public表示公有,意思是该类的对象可以直接访问这些成员      void GetStature();//获得身高      void GetWeight(); //获得体重private: //private表示私有,意思是该类的对象不能直接访问这些成员,必须通过公有的成员函数去访问。      int stature;      int weight;};  //注意这里分号不能漏

声明这个类并没有为Human分配内存,它只是告诉编译器Human这个类是什么,它包含了哪些数据,功能是什么。同时还告诉编译器该类有多大,类的大小事根据类的变量来定的,该类有链各个成员变量,它们都是int型,所以共占8个字节,该类的方法不占用内存,因为GetStature()和GetWeight()没有声明类型,它们返回值都是void.

3. 定义一个对象和成员函数

#include<iostream>using namespace std;class Human{public:      void GetStature(){cout<<stature;}//用来输出身高值,这是第一种定义成员函数的方法,直接在类的内部进行定义      void SetStature(int x){stature=x;}      void GetWeight();      void SetWeight(int x);private:      int stature;      int weight;};void Human::GetWeight()/*这是第二种定义成员函数的方法,在类的外部定义,但是函数名前面需要加上类的名字和双冒号*/{      cout<<weight;}void Human::SetWeight(int x){      weight=x;}int main(){      Human Mike;//定义一个对象叫Mike,Human这个类知识个抽象名词,而对象则是实际的个体。      //Mike.stature=2; /*error 不能直接给私有成员赋值,因为不能直接访问,需要通过公有的成员函数去访问,所以在公有部分定义一个函数SetStature()*/      Mike.SetStature(170);//通过该函数去修改stature的值      //cout<<"迈克的身高为:"<<Mike.GetStature();/*error 这条语句有问题,因为这条语句前有cout语句,而GetStature()里面也有个cout语句,重复了,应该分开写:*/      cout<<"迈克的身高为:";      Mike.GetStature();      return 0;}

注意: 

1. 类只是个抽象的名词,我们不能对类进行赋值操作,如Human=5是错误的,就像不能对int进行赋值一样。同样,如果Human类中有个公有成员int weight,我们也不能对Human.weight进行赋值,即Human.weight=100是不对的,必须先定义一个对象Human Mike,然后才能给Mike.weight进行赋值。

2. 成员函数的声明和定义与一般函数有点区别,如果在类中声明一个成员函数,则必须在类外对其进行定义,否则会报错,且定义时函数名前要加上类名。如:

class Human{public:      void set(int w);//在类中声明一个函数      /*void set(int w)      {            .....      }*/  //这样的话会报错,必须把该函数的定义放到类的外面};void Human::set(int w)//注意加上前缀{      .....}

4. 构造函数

在创建某个类的对象时,由于对该对象的状态(数据)不是很明确,因此需要对其进行初始化。比如说外面要在长方形这个类中创建一个对象,即新建一个长方形,那么我们首先要确定它的长和宽,否则我们无法造出一个长方形出来。

我们要创建这个长方形,就必须使用这个长方形类中一个用来构造该类所有对象的函数--构造函数,由于该函数要在创建一个新对象时使用,因此它必须在类中对它进行声明和定义。比如:我们要声明并定义一个长方形类rectangle的构造函数:

#include<iostream>using namespace std;class rectangle{public:      rectangle(int l, int w){length=l; width=w;}//构造函数的函数名必须跟类名相同      int area(){return length*width;}private:      int length;      int width;}int main(){      rectangle A(4,3);/*构造A这个对象的时候就可以直接对两个参数进行初始化,即创建了一个长4宽3的长方形A.构造函数是没有返回值的*/      cout<<"该长方形面积为:"<<A.area();      return 0;}

附:默认构造函数

如果我们不提供一个构造函数,那么系统会提供一个默认构造函数,该函数什么参数也没有,而且也不执行任何功能,它的作用只是构造一个对象,相当于rectangle(){},不会显示出来,那么我们创建一个对象的时候就不能加参数了,只能rectangle A;

只要我们自己创建了一个构造函数,那么默认的构造函数就会自动被屏蔽掉。当然我们也可以创建两个构造函数,一个带参数,另一个不带参数跟默认的一样,这样我们在定义一个对象的时候,就可以灵活选择是否给该对象初始化。

5. 析构函数

析构函数与构造函数相反,析构函数用于在对象被销毁后清除它所占用的内存空间,表示为:~rectangle(){} 析构函数与构造函数一样不能有返回值,且不能有参数,另外,一个类中只能有一个析构函数,但{}中可以输出一些信息表明析构函数已经执行。整个程序结束后,定义的对象生命自然终止,这时编译器会自动调用该类的析构函数来释放掉该对象所占的内存,即析构函数销毁一个对象。

6. 析构对象数组

假如我们要一次声明许多对象,那么我们可以将这些对象放到一个对象数组里来声明,如:

#include<iostream>using namespace std;class Test{public:      A();//是一个构造函数      ~A();};Test::A(){cout<<"构造函数执行完毕\n";}Test::~A(){cout<<"析构函数执行完毕\n";}int main(){      Test a[2];//定义了两个对象a[0]和a[1]      return 0;}

运行结果为:

构造函数执行完毕

析构函数执行完毕

构造函数执行完毕

析构函数执行完毕

我们可以看出,系统执行了两次创建对象,两次释放了对象所占的内存

2 0
原创粉丝点击