类与对象的认识

  

类和对象

  

c是一门面向过程的语言关注的过程,c++作为一门面向对象的语言关注的时对象,把事情拆分为不同的对象,通过对象的交互来实现。

  

一。类和对象的初认识

  

<强> 1。类的引入
类用关键字类引出,与之前的结构体类似,不同的是结构体内不能定义函数而在类中可以定义函数啦(c + +中结构体也可以定义函数哦)
<强> 2。类的定义
类中成员函数的两种定义方式:可以在类中定义定义,但编译器有可能将其当作内联函数来处理故推荐第二种——将函数的声明和定义分开。
<强> 3。类的访问限定符
,保护,私人——→保护和私人修饰的对象在类外不能直接访问
类类默认是私人的,struct默认是公共
面向对象的三大特性:封装,继承,多态,这里我们说一下封装的定义:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,<强>仅对外公开接口来和对象进行交互。
<强> 4。类的作用域
类定义了一个新的作用域,若要访问类中的成员要用作用域限定符::进行访问。
在这里我们已经接触了四个作用域:全局作用域,函数内的局部作用,域类,命名空间。
<强> 5。类的实例化(对象)
类限定了有那些成员,类是没有空间开辟的,用类创建出的对象才有实际的内存空间。
到这里我们要思考一个问题,一个类的大小该如何计算呢? ?类中可以包含成员函数,此时又该怎么办呢? ?
通过测试我们可以知道类的大小其实就是类的成员变量的大小,类中的成员函数被放在公共代码区,要注意内存对齐的问题。如果是一个空类,或这个类中只有成员函数,呢么这个类的大小是1,因为创建对象时要有区分。
<强> 6.指针
c++对每个成员函数增加了一个默认的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。呢么这个就相当于我们用户自己在传参时传入地址,正因为有这指针的存在所以函数才能准确的访问到调用它的主体。

  
      <李>这指针的特性李   <李>这指针的类型:类类型*常量,故这指针的指向是不能修改的。   <李>这指针作为函数的形参,函数调用时将对象的地址传给这个形参,故对象中不存储这指针   

    <强>二。类中的默认函数之构造函数

      

    一个类定义好的话里面并不是什么都没有,会自动生成六个默认函数
    <强> 1。构造函数
    构造函数是干什么的呢?
    构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次,也就是说构造函数完成了对象的初始化,它的特点是:函数名与类名相同,无返回值,对象实例化时编译器自动调用对应的构造函数,构造函数可以重载。系统自动生成的是无参的构造函数,当然我们可以自己写一个带有参数的构造函数,那么我们在定义对象的时候就可以直接初始化拉,看下面的代码:
    <代码>类data

      
  

那么在这个地方我们就完成了构造函数的创建,呢么在主函数内定义对象的时候就可以直接初始化对象:
数据(1999、10、13);

  

那么我们知道系统给的是无参的构造函数,所以我们在定义无参构造函数的时候就不需要带(),否则就变成了函数声明。
上述的代码就是我们显式创建的构造函数,当有它存在的时候编译器就不会再生成默认构造函数

  

还有一个注意的点:无参构造函数和全缺省构造函数都称作默认函数,是不允许重复定义的,只允许存在一个,故这两个是不能构成重载函数的。

  

呢么构造函数的作用是什么呢?——在因为变量类型不只是固定的int或char这种,也有可能是用户自定义类型,那么构造函数就会调用这种自定义类型的成员函数,这就是它的作用。

  

<强> 2。构造函数赋初值
上述过程中在构造函数体内的操作并不是初始化,那么我们习惯将用构造函数的初始化列表对其进行初始化。

类与对象的认识