类和对象

一.类的定义

类是程序的基本单位,是用户定义的数据和操作这些数据的函数的封装。

1.类的定义包括行为(函数实现)和属性(数据表示)

2格式
class 类名
{public:
      公有数据成员和成员函数
protected:
       保护数据成员和成员函数
privite:
       私有成员和数据函数
};

注意:类定义时必须用分号“;”结束.

3.成员函数

一般的,将成员函数声明为函数原型,在 类外 具体实现成员函数。

返回值类型 类名::成员函数名(参数表)
{
  函数体
}

二.对象的定义

对象是类的实例或实体,定义类的对象要在定义类之后。
class point
{
 public:
  ...
 private:
  ...};
int main()
{
  point p1,p2;
}

三.访问对象成员

圆点访问形式:对象名.公有成员

指针访问形式:->公有成员


int main()
{ ...
  ...
   ptr->setvalue(2,8)
  //通过指针访问公有成员函数
   ptr->print()
   a1=(*ptr).Getx();
   //通过公有成员函数访问私有数据成员
    ...
    ...}

注意:1.在类的定义中不能对数据成员进行初始化。

2. 类的任何成员都必须指定访问属性,一般将数据成员定义为私有成员或保护成员,将成员函数定义为公有成员。

3. Classstruct的不同

  class中,成员缺省情况是private

  Struct中,成员缺省情况是public

构造函数和析构函数

一.构造函数(创造函数)

作用:1.为对象分配空间

2对数据成员赋初值

          3请求其他资源

     函数名:类名

     构造函数可以重载,可以有任意类型的参数,但是没有返回类型。

     需要包含构造函数的几类:

1. 定义一个dog类,包含age.weight属性,以及对这些属性的操作方法,实现并测试这个类。

2. 设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,能计算矩形的面积。

3. 创建一个student类,在该类中定义成员函数实现相关信息的输入输出。函数的原型声明放在类定义中。实现并测试这个类。

二.析构函数(取消对象)

     作用:进行对象消亡的清理工作。

     函数名:~类名

     析构函数既没有参数,也没有返回类型。

     如果类中没有定义构造函数,系统将自动生成一个默认形式的构造函数

     形式:类名::类名(){}

this指针

当一个对象调用类的成员函数时,对象的地址被传给了this指针,即this指针指向了该对象。this是一个隐含指针,不能显式说明,但可以在成员函数中显式使用。一个对象的this指针并不是对象的一部分,不会影响sizeof(对象)的结果。

如何使用:一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时使用this指针,如this->n = n (不能写成n = n)。

复制构造函数

复制构造函数用一个已有同类对象创建新对象进行数据初始化。其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上const限制

例如:
class A
{  public:
   A(int);
   A(constA&,int=1);//复制构造函数
   };
//...
A a(1); //创建对象a,调用对象A(int)
A b(a,0)//创建对象b,调用 A(const A&,int=1)
A c=b;//创建对象c,调用A(const A&,int=1)

语法形式:  类名::类名(const 类名&引用名,...

C++中,下面三种对象需要调用拷贝构造函数(有时也称复制构造函数):

1) 一个对象作为函数参数,以值传递的方式传入函数体

2) 一个对象作为函数返回值,以值传递的方式从函数返回;

3) 一个对象用于给另外一个对象进行 初始化 (常称为 赋值初始化

1. 复制构造函数名与类名相同,并且也没有返回值类

2. 复制构造函数可写在类中,也可以写在类外。

3. 如果没有显式定义复制构造函数,系统自动生成一个默认形式的复制构造函数。

 类的其他成员

1. 常成员

常数据成员是指数据成员在实例化被初始化后,其值不能改变。

在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数。

说明:如果在一个类中说明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化,而其他任何函数都不能对该成员赋值。

#include<iostream>

using namespace std;

class Mclass

{ public :

      int k;

      const int M; //说明常数据成员

      Mclass() : M(5) { } //用初始式对常数据成员赋值

      void testFun()

       { //M++;   //错误,不能在成员函数中修改常数据成员

           k++; //可以修改一般数据成员

       }

 } ;

int main()

{ Mclass t1, t2;

   t1.k=100;

   //t1.M=123; //错误,不能在类外修改常数据成员

   cout<<"t1.k="<<t1.k<<'\t'<<"t1.M="<<t1.M<<endl;

   t2.k=200;   t2.testFun();

   cout<<"&t1.M="<<&t1.M<<endl;

   cout<<"t2.k="<<t2.k<<'\t'<<"t2.M="<<t2.M<<endl;

   cout<<"&t2.M="<<&t2.M<<endl;

}

 2 常对象

如果在说明对象时用const修饰,则被说明的对象为常对象。

形式: 类名 const 对象名{(参数表)}

       const 类名 对象名 {(参数表)}

说明:c++规定常对象只能调用它的常成员函数,静态成员函数,构造函数(具有公有访问权限)

3 常成员函数

在类中使用关键字const说明的函数为常成员函数。

形式:类型说明符 函数名(参数表)const

常成员函数不能更新对象的数据,也不能调用非const修饰的成员函数(静态成员函数,构造函数除外)

静态成员

静态成员函数

作用:处理静态数据成员,保证在不依赖于某个对象的情况下,访问静态数据成员。

静态函数仅可以访问静态成员,或是静态成员函数或是静态数据成员。

格式: static 返回类型 静态成员函数名(参数表)

调用共有静态函数的格式:

类名::静态成员函数名(实参表)

对象.静态成员函数名(实参表)

对象指针->静态成员函数名(实参表)

静态数据成员

静态数据成员在定义或说明时前面加关键字static

class A

{ int n

static int s

}

公有访问权限的静态成员,可以通过下面的方式进行访问:

类名::静态成员的名字

对象名.静态成员名字

对象指针->静态成员的名字

在静态成员函数内部,直接访问

说明:1.静态函数成员在类外定义时不用static前缀。

2. 静态成员函数主要用来访问同一类中的静态数据成员

3. 私有静态成员函数不能在类外部或用对象访问。

4. 可以在建立对象之前处理静态数据成员。

5. 静态成员函数中的是没有this指针的。

友元函数

如果在本类(类A)以外的其他地方定义了一个函数(函数B

这个函数可以是不属于任何类的非成员函数,

也可以是其他类的成员函数,

在类体中用friend对其(函数B)进行声明,此函数就称为本类(类A)的友元函数。

友元函数(函数B)可以访问这个类(类A)中的私有成员

友元函数的使用

因为友元函数没有this指针,则参数要有三种情况: 

要访问非static成员时,需要对象做参数;

要访问static成员或全局变量时,则不需要对象做参数;

如果做参数的对象是全局对象,则不需要对象做参数.

可以直接调用友元函数,不需要通过对象或指针

类的包含

类的成员类型为已经定义的类类型,称为类的包含,是一种软件重用技术。

当一个类中含有已经定义的类类型成员,带参数的构造函数对数据成员初始化,须使用初始化语法形式:

构造函数 ( 形参表 ) : 对象成员1(形参表 ) , , 对象成员n (形参表 )
类对象成员的初始化

1.出现成员对象时,该类的构造函数要包含对成员的初始化。如果构造函数的成员初始化列表没有对成员对象初始化时,则使用成员对象的缺省构造函数。

2.建立一个类的对象时,应先调用其构造函数。但是如果这个类有成员对象,则要先执行成员对象自己所属类的构造函数,当全部成员对象都执行了自身类的构造函数后,再执行当前类的构造函数。

心得体会:
这个学期我们开始正式学习c++,面对的第一个难题就是类和对象,讲真的,有时面对老师上课时的传授,我有点摸不着头脑,当然光听不实践自然是一头雾水,这时我明白了学习它不能仅停留在语法规则,这不仅枯燥无味而且难以记忆,更重要的是利用好这个工具解决实际问题。另外我发现越是逃避自己不会的问题,今后它会出现的越来越频繁,所以我在以后的学习生活中,要增加上机练习的时间,纠正自己在感性认识上对它的偏差,并且通过上机来验证自己的程序是否正确,尽可能的发现程序中存在的问题,而不是写完一个程序就完事,权当应付老师的作业,试图掩盖自己的错误。 最后,便是要持之以恒,锲而不舍。罗马的建成不是一日之功,任何学问的从熟练到精通都不是三天两天的事。我们必须明白这个浅显的道理。学习c++本身就是一项艰苦的历程。浮躁的人、没有忍性的人,是肯定学不好c++的。我们必须有狂热的编程热情,否则是很难坚持下去的。我们也必须学会自信,因为有些时候尽管我们花了相当多的时间和精力,我们也不能写出一个程序。写程序确实是很麻烦的,有时需要顿悟,有时需要渐悟。当我们真正学好了,学精通了,便会有“一览众山小” 的感慨了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值