首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

c++学习笔记(6.类的封装)

c++学习笔记(6.类的封装)

本节知识点:1.面向对象中的基本概念:   a.类是用于抽象的描述一类事物所特有的属性(即变量)和行为(即函数)的
   b.对象是一个具体的事物,是属于某一个类的一个实体,拥有其所属类的所有属性和行为
   c.类与类直接是可以继承的,子类可以继承父类中的属性和行为,代码如下:
[cpp] view plaincopy


  • struct Biology  //这里暂用c语言的方式
  • {  
  •     bool living;  
  • };  

  • struct Animal : Biology   
  • {  
  •     bool movable;  
  •     void findFood()   
  •     {   
  •     }  
  • };  

Animal类就是Biology类的一个子类,冒号表示继承,Animal类中可以使用living变量,原因就是它是从Biology类中继承来的子类。

2.类中的封装:   a.封装的含义:封装其实就是把客观事物抽象成为类(即类的实现过程),在这个过程中忽略类的实现细节(即使用private让类的属性和行为不可被外界调用),把类的使用方式以接口的形式体现出来(即使用public让类的属性和行为可被外界调用)。
   b.成员变量:c++中用于表示类属性的变量
      成员函数:c++中用于表示类行为的函数
   c.在c++中可以给成员变量和成员函数定义访问级别:

      public:成员变量和成员函数可以在类的内部和外界访问和调用
      private:成员变量和成员函数只能在类的内部被访问和调用(父类中的private也只能在父类中使用,子类是用不了的)
   d.c++为了兼容c语言,所以一直保留着struct关键字,其实c++中的新关键字class才是在定义类的时候使用的
      class与struct的区别:两者用法完全相同,只是class定义的类中所有成员的默认属性是private,struct定义的类中所有成员的默认属性是public,并且两者的默认的继承方式也是不一样的。
3.类成员的作用域(本节最重要的部分):   a.类成员的作用域都只在类的内部,外部无法直接访问,成员函数可以直接访问成员变量和调用其他成员函数,切记类成员的作用域与访问级别没有关系,类的外部通过类变量(即类的对象)访问public成员,这已经不再是类成员的作用域了。
   b.c语言中的作用域问题(示例代码如下):
[cpp] view plaincopy


  • #include <stdio.h>
  • #include <malloc.h>
  • int i = 9;  //这个全局变量的作用域 是从此处开始 一直到程序结束
  • int main()  
  • {  
  •     printf("%d\n",i);   //此处是数值为9的作用域
  •     int i = 2;          //这里数值为2覆盖了 数值为9的作用域  以数值2为准
  •     {  
  •         int i = 0;      //在这个大括号中 为0的覆盖了 为2的作用域
  •         printf("%d\n",i);  
  •     }  
  •     int j = 0;   
  •     for(; i--; )  
  •     {  
  •         printf("hhh\n");  
  •         int i = 9;       //这种作用域覆盖的情况在for循环中依然存在
  •     }  
  •     printf("%d\n",i);  
  • }  

注意:作用域覆盖的情况,同名变量的作用域被覆盖了的情况,以后者为准
本节练习:

1.本节的练习是写一个运算类(此例子中将类的实现和声明分开了):


代码如下:
op.cpp文件:
[cpp] view plaincopy


  • #include "op.h"
  • bool Operator::setParameter(char cop) //这里 Operator::setParameter说明setParameter是Operator类的成员函数
  • {  
  •     bool ret = false;  
  •     if(('+' == cop) || ('-' == cop) || ('*' == cop) || ('/' == cop))  
  •     {  
  •         op = cop;  
  •         ret = true;  
  •     }     
  •     else
  •     {  
  •         op = '\0';  
  •     }  
  •     return ret;  
  • }  
  • void Operator::setOperator(double p1, double p2)  
  • {  
  •     op1 = p1;  
  •     op2 = p2;  
  • }  
  • bool Operator::result(double& r)  
  • {  
  •     bool ret = true;  
  •     switch (op)  
  •     {  
  •     case
    '/':  
  •         if( (-0.000000001 < op2) && (op2 < 0.000000001) )  
  •         {  
  •             ret = false;  
  •         }  
  •         else
  •         {  
  •             r = op1 / op2;  
  •         }  
  •         break;  
  •     case
    '+':  
  •         r = op1 + op2;  
  •         break;  
  •     case
    '*':  
  •         r = op1 * op2;  
  •         break;  
  •     case
    '-':  
  •         r = op1 - op2;  
  •         break;  
  •     default:  
  •         ret = false;         
  •     }  
  •     return ret;  
  • }  


op.h文件:

[cpp] view plaincopy


  • #ifndef __OP_H__
  • #define __OP_H__

  • class Operator //这里面是类的声明
  • {  
  • private:  
  •     char op;  
  •     double op1;  
  •     double op2;  
  • public:  
  •     bool setParameter(char cop);  //类成员变量的声明
  •     void setOperator(double p1, double p2);  
  •     bool result(double& r);  
  • };  
  • #endif


main.cpp文件:

[cpp] view plaincopy


  • #include <stdio.h>
  • #include "op.h"

  • int main()  
  • {  
  •     Operator op;  
  •     op.setParameter('/');  
  •     op.setOperator(2.0 , 3.0);  
  •     double d = 0.0;  
  •     op.result(d);  
  •     printf("%f\n",d);  
  •     return 0;  
  • }   

返回列表