面向对象
------------------------
★OOP三大特征:
封装:数据、方法
继承:派生类继承父类一切非私有(private)数据、方法
多态:重载、重写
------------------------
★class与object关系
类将一些数据封装起来,并给出一个高效率的接口。对象是通过类来抽象描述,描述他
们的特征与行为。对象是类的一个实例。但是并不是所有的类都是用来描绘对象的,如
果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
------------------------
★虚基类-带纯虚函数的类
所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用
来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就
是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,
是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个
图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是
不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,
它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以
表征抽象概念的抽象类是不能够实例化的
------------------------
★c# 构造函数
1、缺省构造函数:
class TestClass
{
public TestClass(): base() {} // 由CLR提供
}
2、实例构造函数
实例构造函数是实现对类中实例进行初始化的方法成员
3、静态构造函数
静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初
始化。静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的
静态构造函数自动被调用。
声明了一个有静态构造函数的类Employee。注意静态构造函数只能对静态数据成员
进行初始化,而不能对非静态数据成员进行初始化。但是,非静态构造函数既可以对静
态数据成员赋值,也可以对非静态数据成员进行初始化。
------------------------
★析构函数
是实现销毁一个类的实例的方法成员。析构函数只能有一个,不能有参数,不带任何修饰符(一般尽量不用
显示调用析构函数)。由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
----
C#(更确切的说是CLR)提供了一种新的内存管理机制---自动内存管理机制(Automatic memory manag
ement),资源的释放是可以通过“垃圾回收器” 自动完成的,一般不需要用户干预,但在有些特殊情况下还
是需要用到析构函数的,如在C#中非托管资源的释放。
资源的释放一般是通过"垃圾回收器"自动完成的,但具体来说,仍有些需要注意的地方:
1、值类型和引用类型的引用其实是不需要什么"垃圾回收器"来释放内存的,因为当它们出了作用域后会自
动释放所占内存,因为它们都保存在栈(Stack)中;
2、只有引用类型的引用所指向的对象实例才保存在堆(Heap)中,而堆因为是一个自由存储空间,所以它并
没有像"栈"那样有生存期("栈"的元素弹出后就代表生存期结束,也就代表释放了内存),并且要注意的是,"垃圾回
收器"只对这块区域起作用。
------------------------
★构造/析构函数调用顺序
在类的层次结构中(即继承结构中)基类和派生类的构造函数的使用方式。派生类对
象的初始化由基类和派生类共同完成:****基类的成员由基类的构造函数初始化,派生
类的成员由派生类的构造函数初始化。 当创建派生类的对象时,系统将会调用基类的
构造函数和派生类的构造函数,****构造函数的执行次序是:先执行基类的构造函数,
再执行派生类的构造函数。****如果派生类又有对象成员,则,先执行基类的构造函数
,再执行成员对象类的构造函数,最后执行派生类的构造函数。析构则反之
****至于执行基类的什么构造函数,缺省情况下是执行基类的无参构造函数,如果
要执行基类的有参构造函数,则必须在派生类构造函数的成员初始化表中指出。
附-例:
------------------------
★重载与重写
重载只发生在同一个名字空间中(一个类也是一个名字空间)。
overload(静态bind) :是函数名相同,参数列表不同
override(动态bind):函数特征相同。但是具体实现不同,主要是在继承关系中出现
的(既override是用来实现多态的)
—————————————
//virtual类型的特殊情况---构造/析构函数
TOOP1:有一些方法应该不是一般的继承,比如 构造、析构、拷贝构造... (就是那些在
用户未定义时,由系统自动生成默认方法的那些成员方法)这些方法应该是逐级调用的关
系,而不是“继承” 关系。
构造/析构函数是不可以继承的,但是可以重载构造函数,而析构函数是既不能重载
(每个类析构函数有且只一个)。
各人认为:为什么说子类不能继承父类的构造或析构函数,析构/构造函数系统都会
分配一个默认的处理方法,如果没有定义系统会自动分配默认的,而不是调用父类的(就
像TOOP1处 所说只是在创建对象或销毁对象的时候逐级调用自己的方法)。
------------------------
★
------------------------
★
------------------------
★
------------------------
★
------------------------
★
------------------------
★
面向对象
------------------------
★OOP三大特征:
封装:数据、方法
继承:派生类继承父类一切非私有(private)数据、方法
多态:重载、重写
------------------------
★class与object关系
类将一些数据封装起来,并给出一个高效率的接口。对象是通过类来抽象描述,描述他
们的特征与行为。对象是类的一个实例。但是并不是所有的类都是用来描绘对象的,如
果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
------------------------
★虚基类-带纯虚函数的类
所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用
来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就
是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,
是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个
图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是
不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,
它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以
表征抽象概念的抽象类是不能够实例化的
------------------------
★c# 构造函数
1、缺省构造函数:
class TestClass
{
public TestClass(): base() {} // 由CLR提供
}
2、实例构造函数
实例构造函数是实现对类中实例进行初始化的方法成员
3、静态构造函数
静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初
始化。静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的
静态构造函数自动被调用。
声明了一个有静态构造函数的类Employee。注意静态构造函数只能对静态数据成员
进行初始化,而不能对非静态数据成员进行初始化。但是,非静态构造函数既可以对静
态数据成员赋值,也可以对非静态数据成员进行初始化。
------------------------
★析构函数
是实现销毁一个类的实例的方法成员。析构函数只能有一个,不能有参数,不带任何修饰符(一般尽量不用
显示调用析构函数)。由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
----
C#(更确切的说是CLR)提供了一种新的内存管理机制---自动内存管理机制(Automatic memory manag
ement),资源的释放是可以通过“垃圾回收器” 自动完成的,一般不需要用户干预,但在有些特殊情况下还
是需要用到析构函数的,如在C#中非托管资源的释放。
资源的释放一般是通过"垃圾回收器"自动完成的,但具体来说,仍有些需要注意的地方:
1、值类型和引用类型的引用其实是不需要什么"垃圾回收器"来释放内存的,因为当它们出了作用域后会自
动释放所占内存,因为它们都保存在栈(Stack)中;
2、只有引用类型的引用所指向的对象实例才保存在堆(Heap)中,而堆因为是一个自由存储空间,所以它并
没有像"栈"那样有生存期("栈"的元素弹出后就代表生存期结束,也就代表释放了内存),并且要注意的是,"垃圾回
收器"只对这块区域起作用。
------------------------
★构造/析构函数调用顺序
在类的层次结构中(即继承结构中)基类和派生类的构造函数的使用方式。派生类对
象的初始化由基类和派生类共同完成:****基类的成员由基类的构造函数初始化,派生
类的成员由派生类的构造函数初始化。 当创建派生类的对象时,系统将会调用基类的
构造函数和派生类的构造函数,****构造函数的执行次序是:先执行基类的构造函数,
再执行派生类的构造函数。****如果派生类又有对象成员,则,先执行基类的构造函数
,再执行成员对象类的构造函数,最后执行派生类的构造函数。析构则反之
****至于执行基类的什么构造函数,缺省情况下是执行基类的无参构造函数,如果
要执行基类的有参构造函数,则必须在派生类构造函数的成员初始化表中指出。
附-例:
------------------------
★重载与重写
重载只发生在同一个名字空间中(一个类也是一个名字空间)。
overload(静态bind) :是函数名相同,参数列表不同
override(动态bind):函数特征相同。但是具体实现不同,主要是在继承关系中出现
的(既override是用来实现多态的)
—————————————
//virtual类型的特殊情况---构造/析构函数
TOOP1:有一些方法应该不是一般的继承,比如 构造、析构、拷贝构造... (就是那些在
用户未定义时,由系统自动生成默认方法的那些成员方法)这些方法应该是逐级调用的关
系,而不是“继承” 关系。
构造/析构函数是不可以继承的,但是可以重载构造函数,而析构函数是既不能重载
(每个类析构函数有且只一个)。
各人认为:为什么说子类不能继承父类的构造或析构函数,析构/构造函数系统都会
分配一个默认的处理方法,如果没有定义系统会自动分配默认的,而不是调用父类的(就
像TOOP1处 所说只是在创建对象或销毁对象的时候逐级调用自己的方法)。
------------------------
★
------------------------
★
------------------------
★
------------------------
★
------------------------
★
------------------------
★