码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象

时间:2015-10-28 17:12:57      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

 
 
1.基本的概念
    类,指的是莫一类的事物的概括,是一个抽象的
    对象:指的是某一类里面的一个实体,是具体的
 
类:
    通常包含了属性和行为。属性:被描述类的静态的特征,老虎的颜色、体重等静态的属性;行为:描述类的动态特征,比如跑
 
类的继承:
    继承之后的类,继承了原先的类的所有的属性和行为;继承之后的类,也可以有自己特有的属性和行为:
                  技术分享
 
    在类A的基础上建立一个新类B,类A成为基类或者父类,类B成为派生类或者子类;子类完全继承父类的所有的成员。
  1. class子类名字:继承的方式父类的名字
  2. {
  3. }
  4. 继承的方式:public/private/protected,如果省略的话,系统默认的是private
 
 
2.类的封装
    类的封装就是将不同的属性和行为结合在一起,形成一个新的数据类型。
    成员变量:表示类的属性
    成员函数:表示类的行为的函数,
 
分为:共有、私有、保护 三种类型
    公有的成员变量和成员函数可以被类内和外界访问和调用,也就是共有的成员可以通过变量被外接访问
    私有:成员变量和成员函数只能被类的内部访问和调用,也就是说 私有的成员只能在类的内部使用
 
3.struct 和 class 区别:
    struct 定义类的时候,所有的成员默认的都是 public 
    class定义类的时候,所有的成员默认的都是私有的
 
 
4.构造函数
    构造函数的作用是完成,类的对象初始化,他的名字和类名完全一直,可以有参数,但是必须没有任何的返回值
    1. class A
    2. {
    3. private:
    4. int i;
    5. public:
    6. A(int v)
    7. {
    8. i = v;
    9. }
    10. int getvalus()
    11. {
    12. return i;
    13. }
    14. };
    15. int main()
    16. {
    17. A aa(5);
    18. printf("%d\n", aa.getvalus());// 输出 5
    19.  
    20. A bb =6;
    21. printf("%d\n", bb.getvalus());// 输出 6
    22. A cc = A(7);
    23. printf("%d\n", cc.getvalus()); // 输出 7
     
    C++中函数可以实现函数的重载,构造函数其实也是可以实现重载的功能的:
  1. class A
  2. {
  3. private:
  4. int i;
  5. public:
  6. A()
  7. {
  8. i =11;
  9. }
  10. A(int v)
  11. {
  12. i = v;
  13. }
  14. int getvalus()
  15. {
  16. return i;
  17. }
  18. };
显然,类的对象定义的时候,即使你没有进行初始化,编译器还是会自动完成对象的初始化,
 
构造函数的异类:默认构造函数、拷贝构造函数(完成对象的拷贝的任务)
  1. A aa;
  2.  
  3. A bb = aa; // 调用拷贝构造函数
当类内自己没有定义构造函数和拷贝构造函数的时候,编译器会为你自动添加一个无参的构造函数和拷贝构造函数。
 
 
数组类的创建:
  1. .h 文件
  2. #ifndef _ARRAY_H // 避免头文件的重复包含
  3. #define _ARRAY_H
  4. classArray
  5. {
  6. private:
  7. int iLength;
  8. int*mspace;
  9. public:
  10. Array(int length);
  11. int length();
  12. void setData(int idex,int value);
  13. int getData(int idex);
  14. void destroy();
  15. };
  16. #endif
  1. cpp
  2. #include"array.h"
  3. // 构造函数
  4. Array::Array(int length)
  5. {
  6. if(length <0)
  7. {
  8. length =0;
  9. }
  10. iLength = length;
  11. mspace =newint[iLength];
  12. }
  13. // 返回数组的长度
  14. intArray::length()
  15. {
  16. return iLength;
  17. }
  18. // 设置数组的值
  19. voidArray::setData(int idex,int value)
  20. {
  21. mspace[idex]= value;
  22. }
  23. intArray::getData(int idex)
  24. {
  25. return mspace[idex];
  26. }
  27. voidArray::destroy()
  28. {
  29. iLength =-1;
  30. delete[] mspace;
  31. }
  1. int main()
  2. {
  3. Array a1 =10;
  4. for(int i =0; i < a1.length(); i++)
  5. {
  6. a1.setData(i, i);
  7. }
  8. for(int i =0; i < a1.length(); i++)
  9. {
  10. printf("a1 = %d\n", a1.getData(i));
  11. }
  12. a1.destroy();
  13. while(1);
  14. }
 
当类A的对象是类B的成员变量的时候:
  1. class A
  2. {
  3. private:
  4. int i;
  5. public:
  6. A(int v)
  7. {
  8. i = v;
  9. }
  10. };
  11. class B
  12. {
  13. public:
  14. B()
  15. {
  16. printf("BB\n");
  17. }
  18. private:
  19. constint c;
  20. A a1;
  21. A a2;
  22. };
    这个时候,会被报错,因为A的对象在B做成员的变量,压根就没有被初始化,所以在B内部需要给成员变量初始化,初始化列表:
  1. class B
  2. {
  3. public:
  4. B(): c(1), a1(2), a2(3) // 构造函数,指定初始化的值
  5. {
  6. printf("BB\n");
  7. }
  8. private:
  9. constint c;
  10. A a1;
  11. A a2;
  12. };
    也就是说,通过初始化列表,对成员变量进行初始化,并且初始化列表的执行是先于构造函数的函数体执行的;也就是使用初始化列表对构造函数进行成员变量的初始化,
 
5.析构函数
    就是在对象被销毁之前调用的析构函数,析构函数没有参数,也没有任何的返回值类型,
  1. ~类型()
    当自己没有写构造函数或者析构函数的话,编译器会自动为我们添加构造函数和析构函数。
    构造函数当且仅当只有一个。析构执行的顺序与构造的顺序相反,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 





面向对象

标签:

原文地址:http://www.cnblogs.com/qxj511/p/4917648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!