面向对象程序设计 吴迪毛琛
面向对象程序设计 —吴迪 毛琛
1类与对象 对象( Object)是类(Cass)的一个实倒( nstance),重 点是类的设计,而不是对象的设计。 类提供关键字 public、 protected和prⅳate,这样可以达到 信息隐癥的目的,即让类仅仅公开必须要让外界知道的内 容,而隐藏其它一切内容。但不要滥用封裝。 两种人:“以教据为中心”、“以行为为中
1.类与对象 对象(Object)是类(Class)的一个实例(Instance),重 点是类的设计,而不是对象的设计。 类提供关键字public、protected 和private ,这样可以达到 信息隐藏的目的,即让类仅仅公开必须要让外界知道的内 容,而隐藏其它一切内容。但不要滥用封装。 两种人:“以数据为中心”、“以行为为中心
2.继承 继承: public继承:所有域都继承 private继承: public域的内容成 private城 protected继承:pubc域的内容成 protected 域的 逻辑关糸: B继承A那么逻辑上一定是B从属于A,不能为了让B 拥有A的一些功能,就滥用继承。 公鸡为什么追打一只下了蛋的母鸡?! 因为母鸡下了一个鸭蛋~
2.继承 继承:public继承:所有域都继承 private继承:public域的内容成private域 protected继承:public域的内容成protected 域的 逻辑关系: B继承A那么逻辑上一定是B从属于A,不能为了让B 拥有A的一些功能,就滥用继承。 公鸡为什么追打一只下了蛋的母鸡?! 因为母鸡下了一个鸭蛋~~
3虚函数和多态 〉除了继承外,C十十的另一个优良特性是支持多态, 允许将派生类的对象当作基类的对象使用。 〉加上虛函数和抽象基类后,“多态”的好处就体 现出来了。 例如:XXXX的几何形体系列问题 抽象基类只管定义纯虛函数的形式,具体的功能 由派生类实现
3.虚函数和多态 除了继承外,C++的另一个优良特性是支持多态, 即允许将派生类的对象当作基类的对象使用。 加上虚函数和抽象基类后,“多态”的好处就体 现出来了。 抽象基类只管定义纯虚函数的形式,具体的功能 由派生类实现。 例如:XXXX的几何形体系列问题
“抽象基类”和“多态”有如下突出优点 应用程序不必为每一个派生类编写功能调用,只需要对抽 象基类进行处理即可。可以大大提高程序的可复用性。 派生类的功能可以被基类指针引用,这叫向后兼容
“抽象基类”和“多态”有如下突出优点: 应用程序不必为每一个派生类编写功能调用,只需要对抽 象基类进行处理即可。可以大大提高程序的可复用性。 派生类的功能可以被基类指针引用,这叫向后兼容
良好的编程风格 命名约定 有不少人编程肘用拼音给函数或变量命名,这样做并不能 说明你很爱国,却会让用此程序的人迷糊,程序中的英文 一般不会太复杂,用词要力求准确 Microsoft提倡的匈牙利命名法
良好的编程风格 1.命名约定 有不少人编程时用拼音给函数或变量命名,这样做并不能 说明你很爱国,却会让用此程序的人迷糊,程序中的英文 一般不会太复杂,用词要力求准确。 Microsoft提倡的匈牙利命名法
new、 delete与指针 在C语言中,函数 malloc用于申请内存,函教free用于释 放内存。由于C+兼容C语言,所以neW、 delete、 malloc free都有可能一起使用。 malloc - free new - delete 在用 delete或用free释放p所指的内存后,应该马上显式地 将p置为NULL,以防下次使用p肘发生错误。 预防“野指针” ()指针没有初始化。 (2)指向已经释放了的内存地址。9g
new、delete 与指针 在C 语言中,函数malloc 用于申请内存,函数free 用于释 放内 存。由于C++兼容C 语言,所以new、delete、malloc、 free 都有可能一起使用。 malloc -- free new -- delete 在用delete 或用free 释放p 所指的内存后,应该马上显式地 将p 置为NULL,以防下次使用p 时发生错误。 预防“野指针” (1)指针没有初始化。 (2)指向已经释放了的内存地址。eg
Const的使用 》1.强制保护函数的参数值不发生变化 void f( String s);//pass by value void g(const String &s) ∥name的值不会改变 vodh( const String*s);∥name的值不会改度 mainO String name=“Dog f(name);∥/name的值不会改变 g(name);∥/name的值可能改变 h( (name);∥/name的值可能改变
Const的使用 1.强制保护函数的参数值不发生变化 void f(String s); // pass by value void g(String &s); // pass by referance void h(String *s); // pass by pointer main() { String name=“Dog”; f(name); // name 的值不会改变 g(name); // name 的值可能改变 h(name); // name 的值可能改变 } void g(const String &s); // name 的值不会改变 void h(const String *s); // name 的值不会改变
2.强制保护类的成员函数不改变任何数据成员的值 class stack public void push(int elem) void pop(void int Count(void) const;∥/ const类型的函数 private: nt num int data[ 00]: int Stack: Count(void)const tt num: ∥编译错误,num值发生变化 0); ∥编译错误,pop将改变成员变量的值 return num
2.强制保护类的成员函数不改变任何数据成员的值 class Stack { public: void push(int elem); void pop(void); int Count(void) const; // const 类型的函数 private: int num; int data[100]; }; int Stack::Count(void) const { ++ num; // 编译错误,num 值发生变化 pop(); // 编译错误,pop 将改变成员变量的值 return num; }
点其他的小体会 1.不要写过复杂的语句。 》2.不要写功能很多很复杂的函数,程序要尽量的模块化, 每个函数执行比较单一的功能,便于理解和修改
一点其他的小体会 1.不要写过复杂的语句。 2.不要写功能很多很复杂的函数,程序要尽 量的模块化, 每个函数执行比较单一的功能,便于理解和修改