C++学习札记(2011-09-30)

最新文章:Virson's Blog

1、对象由属性(Attribute)和服务(Service)两部分组成

2、对象的属性值只应由这个对象的服务来读取和修改

3、具有相似属性和行为的一组对象,成为类(Class)

4、在已有类的基础上通过增加新的特性而派生出新的类,称作继承;原有类称作一般类或基类,新建立的类则称为特殊类或派生类

5、继承意味着“自动拥有”或“隐含地复制”,即在定义新类时,只要将新类说明为某个一般类的特殊类,它就会自动的、隐含的拥有这个一般类的全部属性和服务;在特殊类中,这些属性和服务可以直接使用而不必重新定义

6、通过消息在对象之间进行通信是面向对象的一个基本原则

7、多态性的定义是:同一操作作用于不同的类的实例,将产生不同的执行结果,即不同类的对象收到相同的消息时,得到不同的结果。

8、多态性包含编译时的多态性、运行时的多态性两大类。即:多态性也分为静态多态性和动态多态性两种

9、静态多态性是指定义在一个类或函数中的同名函数,它们根据参数表(类型以及个数)区别语义,并通过静态联编实现,例如,在一个类中定义的不同参数的构造函数

10、动态多态性是指定义在一个类层次的不同类中的重载函数,它们一般具有相同的函数,因此要根据指针指向的对象所在类来区别语义,它通过动态联编实现,例,在用户不作任何干预的情况下,类的成员函数的行为能根据调用它的对象类型自动作出适应性调整,而且调整是发生在程序运行时,这就是程序的动态多态性,即,发出同样的消息被不同类型的对象接收时,有可能导致完全不同的行为

11、程序设计多态性的示例

  多态性就是多种表现形式,具体来说,可以用"一个对外接口,多个内在实现方法"表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。

  举例子说明一下:

 
  #include <iostream.h>
 
  class A {
 
  public:
 
  virtual void test() { cout<<"aaa"<<endl; } //运行时的多态性,如果不加virtual就是编译时的多态
 
  //void test() { cout<<"aaa"<<endl; }//编译时的多态性
 
  };
 
  class B:public A
 
  {
 
  public:
 
  void test() {cout<<"bbb"<<endl;}
 
  };
 
  class C:public B
 
  {
 
  public:
 
  void test() {cout<<"ccc"<<endl;}
 
  };
 
  void main()
 
  {
 
  C cc;
 
  A *p=&cc;
 
  p->test();
 
  }
 
  在Class A的test函数前加上virtual,即在运行时多态的时候,程序输出结果为:ccc
 
  在Class A的test函数前不加virtual,即在编译时多态的时候,程序输出结果为:aaa
 
  C++的多态性:在的函数前面加上Virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

12、私有成员只能被该类的成员函数所访问,从类外不能直接访问类的私有成员;公有成员是类的访问接口,从类外可以直接访问类的公有成员;保护成员的访问控制权限介于私有成员与公有成员之间,在该类的派生类中可以直接访问其基类的保护成员

13、动态联编

 
  动态联编又称动态关联
 
  定义:
 
  编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编。
 
  动态联编必须包括以下方面:
 
  成员函数必须声明为virtual
 
  如果基类中声明了为虚函数,则派生类中不必再声明。
 
  调用方式:
 
  通过对象的指针或引用调用成员函数;或通过成员函数调用,反之就无法实现动态联编。
 
  例如:
 
  #include <iostream>
 
  using namespace std;
 
  const float pi=3.14159;
 
  class circle1
 
  {
 
  public:
 
  virtual float area( ) //把area声明为虚函数
 
  {
 
  radius=2.5;
 
  return pi*radius*radius;
 
  }
 
  private:
 
  float radius;
 
  };
 
  class circle2:public circle1
 
  {
 
  public:
 
  float area( )
 
  {
 
  radius=5.5;
 
  return pi*radius*radius;
 
  }
 
  private:
 
  float radius;
 
  };
 
  void main()
 
  {
 
  while(true)
 
  {
 
  cout<<"请输入1或2.\n";
 
  int choise;
 
  cin>>choise;
 
  circle1 *p; //定义一个类circle1的指针变量p
 
  switch(choise)
 
  {
 
  case 1:p=new circle1;
 
  break;
 
  case 2:p=new circle2;
 
  break;
 
  default:break;
 
  }
 
  cout<<"the area of the circle"<<choise<<" "<<p->area()<<endl;
 
  }
 
  }
14、动态联编是实现多态性的一种重要形式
15、在C++中消息传递是通过成员函数调用来实现的
16、C++允许友元从类外直接访问类的私有成员
17、静态联编
 
  静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,它解决了程序中的操作调用与执行该操作代码间的关系。
 
  静态联编
 
  静态联编含义:
 
  在编译时所进行的这种联编又称静态束定,在编译时就解决了程序中的操作调用与执行该操作代码间的关系。
 
  例7.3.1 一个静态联编的例子。
 
  #include<iostream.h>
 
  class point{ private: float x, y;
 
  public:
 
  void setPoint(float I, float j)
 
  { x=I;
 
  y=j;
 
  }
 
  float area( )
 
  { return 0;}
 
  };
 
  const float pi=3.14159;
 
  class circle:public point
 
  { private: float radius;
 
  public:
 
  void setRadius( float r)
 
  { radius =r; }
 
  float area( )
 
  { return pi*radius*radius;}
 
  };
 
  void mian()
 
  { point p;
 
  float a=p.area();//调用point类的成员函数
 
  cout<<"the area of the point p is"<<a<<endl;
 
  circle c;
 
  c.setRadius(2.5);
 
  a=c.area(); //调用circle类的成员函数
 
  cout<<"the area of the circle c is"<<a<<endl;
 
  }
 
  程序结果为:
 
  the area of the point p is 0
 
  the area of the circle c is 19.634937
18、#include是一条预处理命令,功能是要求编译器在对程序进行预处理时,将其后的文件的代码嵌入到程序中
19、cout是系统预定义的一个标准输出设备,一般代表显示器
20、cin是系统预定义的一个标准的输入设备,一般代表键盘
21、c++中标识符是严格区分大小写的,并且标识符只能由大/小写字母,数字(0~9)和下划线组成,并且第一个字符必须是字母或下划线
22、代码中的空白是空格、制表符(按Tab键产生的字符)、换行符(按Enter键产生的字符)和注释的总称,空白在编译的时候会被忽略
23、在用C++语言编写好源程序后,还需要进行编辑、编译、连接和运行四个步骤;“编辑”后保存成*.cpp文件,“编译”后产生二进制目标文件*.obj;“连接”(把目标文件和其他分别编译生成的目标代码模块(如果有的话)以及系统提供的标准库函数连接在一起,生成可直接运行的可执行文件)后产生可执行文件;“运行”可执行文件
 
posted @ 2011-10-08 20:08  学海无涯1999  阅读(314)  评论(0编辑  收藏  举报