三大特性是:封装,继承,多态 所谓封装 就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性. 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。 ...
三大特性是:封装,继承,多态
所谓封装 就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是get='_blank'>面向对象的特征之一,是对象和类概念的主要特性. 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分.
所谓继承 是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现.继承概念的实现方式有二类:实现继承与接口继承.实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
所谓多态 就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用.
详细介绍面向对象:
运算符重载:重新赋予新的含义. 同一个函数名就可以用来代表不同功能的函数,(一名多用).
例如 +,—,*,/. >>,<<. 运算符.
用户可以根据自己的需要对C++已提供的运算符进行重载吗?
//运算符重载#include<iostream>using namespace std;class Complex{ public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Complex complex_add(Complex &c2); void display(); private: double real; double imag;}; Complex Complex::complex_add(Complex &c2){ Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c;}void Complex::display(){ cout<<"("<<real<<","<<imag<<"i)"<<endl;}int main(){ Complex c1(3,4),c2(5,-10),c3; c3=c1.complex_add(c2); cout<<"c1= ";c1.display(); cout<<"c2= ";c2.display(); cout<<"c1+c2= ";c3.display(); return 0;}
析构函数则用于在销毁对象时完成相应的资源释放工作,可以被声明为虚函数。为了说明虚析构函数的必要性,请大家先看下面一个例子:
#include <iostream>using namespace std;//基类class Base{private: int *a;public: Base(); ~Base(){ cout<<"Base destructor"<<endl; }};Base::Base(){ a = new int[100]; cout<<"Base constructor"<<endl;}//派生类class Derived: public Base{private: int *b;public: Derived(); ~Derived( ){ cout<<"Derived destructor"<<endl; }};Derived::Derived(){ b = new int[100]; cout<<"Derived constructor"<<endl;}int main( ){ Base *p = new Derived; delete p; return 0;}
运行结果:本例中定义了两个类,基类 Base 和派生类 Derived,它们都有自己的构造函数和析构函数。在构造函数中,会分配100个 int 型的内存空间;在析构函数中,会把这些内存释放掉。在 main 函数中,定义了基类类型的指针 p,并指向派生类对象,然后希望用 delete 释放 p 所指向的空间。从运行结果可以看出,执行delete p;
语句时只调用了基类的析构函数,却没有调用派生类的析构函数。这会导致 b 所指向的 100 个 int 型内存空间得不到释放,除非程序运行结束**作系统回收,否则就再也没有机会释放这些内存。这是典型的内存泄露。内存泄露问题是程序员需要极力避免的。本例中出现的内存泄露是由于派生类的析构函数未被调用引起的,为了解决这个问题,需要将基类的析构函数声明为虚函数。修正后的代码如下所示:
class Base{private: int *a;public: Base(); virtual ~Base(){ cout<<"Base destructor"<<endl; }};Base::Base(){ a = new int[100]; cout<<"Base constructor"<<endl;}
运行结果:
原标题:C++之面向对象的三个基本特征
关键词:面向对象
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。