1、/*/一、面向对象编程1 什么是对象万物皆对象世界是由一组相互之间紧密联系的对象组成的。通过将对象按照属性、行为共性进行分类,达到将具体事物进行抽象的结果通过程序的语法表达对象属性和行为的抽象-面向对象将面向对象的思想用于编程的过程-面向对象( OOP)2 为什么面向对象?面向对象的编程思想适合于大型的软件的开发面向对象的方法能够有效的提高软件的开发效率借助强大的逻辑建模能力将问题域和方法域有机的统一起来软件工业的发展趋势3 怎么面向对象?熟练的掌握至少一种面向对象的语言精通至少一种面向对象的元语言,如:UML深入学习设计模式和面向对象的设计方法 GOF二、类学生属性:姓名、年龄行为:学习类就
2、是通过对属性和行为的抽象,描述一组对象的语法结构1 类的定义class class_name.;eg.class Student.2 通过 成员变量 来表的类的属性class class_name类型 成员变量名class Studentstring m_name;int m_age;3 通过 成员函数 来表达行为class class_name返回类型 成员函数名(形参表)函数提;eg.class Studentstring m_name;int age;void learn(const string 将成员函数和定义分开class Studentstring m_name;int age;
3、void Student:learn(const string 4:通过访控属性约束属性和行为的访问方式访控属性缺省的访控属性为私有 private /结构体与类的唯一区别公有成员:public 谁都可以访问 私有成员:private 只有自己可以访问保护成员:protected 只有自己和自己的子类可以访问class Studentprivate:string m_name;int age;public:void learn(const string 5 构造函数class class_name类名(形参表): 初始化表 函数体;该类的对象创建时,相应的构造函数被自动执行.创建对象的同时提供
4、构造实参的表,与构造函数的形参匹配栈:开辟空间=调用构造函数初始化堆:new - 条用构造函数string 类会调用缺省构造初始化为空构造函数可以重载缺省构造函数如果一个类中没有定义任何构造函数,那么系统会自动为其提供一个无参的构造函数。缺省构造函数对于基本类型的成员不做初始化,而对类类型的成员变量,通过相应类型的无参构造函数做初始化几个特殊用途的构造函数:默认初始化A 无参构造函数Student : Student(void)或? Studebt : Student(const string A a = b;A a(b);void foo(A,a)foo(b)A foo(void)B b,r
5、eturn b;通过 explicit 关键字可以指明通过构造函数所完成的类型转换必须 显示的进行C 拷贝构造函数:同类型对象的克隆A:A(const A m_age = age;*/Student(const string m_age = 0;*/Student(void):m_name(“匿名“),m_age(0)private:string m_name;int m_age;B 必须使用初始化的场合含有类类型的变量,而变量的类型没有无参构造函数含有常量或引用型成员变量const int a;a = 10int r = b;?C 拥有一个不带无参构造的基类.D 成员变量的初始顺序仅与其在类
6、中被声明的顺序有关,而与其在初始化列表中顺序无关class Xpublic:X(string str):m_str(str),m_len(m_str.length()int m_len;string m_str;6 把类的声明和实现分开实际开发中通常将类的声明部分放到.h 中,实现放在.cpp 中7 在 C+中类和结构体没有本质的区别,唯一不同的是类的缺省访控属性为私有,而结构体为共有练习:实现一个 CLock 类,在构造函数中将 Clock 初始化为当前系统时间,通过成员函数在屏幕上显示电子钟16: 09: 26三、this 指针1 一般而言,关键字 this 是一个指针,在普通成员函数中
7、this 指针指向调用该函数的对象,在构造函数中 this 指向这个正在正在被构造的对象2 应用场景在成员函数/构造函数中明确表示所引用的变量是一个成员变量,以避免和同名的参数变量,及局部变量发生冲突/*/#include using namespace std;/#define _class_#ifdef _class_class Studentpublic:/*Student(const string m_age = age;*/Student(const string m_age = 0;*/Student(void):m_name(“匿名“),m_age(0)void learn(co
8、nst string /*learn(ps,“C“);*/delete ps;Student * ps1 = new Student();ps1-learn(“UNIX C“);delete ps1;Student student2;/Student student2();是不对的student2.learn(“法轮大法 “);return 0 ;#endif/define _cast_#ifdef _cast_class Integerpublic:explicit Integer(int value) /explicit 必须显示的转换m_value = value;void print()cout (100);/其他转换风格也可以(Integer)100/Integer(100)i.print();(i + Integer(400);return 0;#endif/#define _copy_#ifdef _copy_class Dogpublic:Dog(const string /*Dog(const Dog */void talk(void)cout i = i;