C++主要特性/优势
2016-07-22 11:38
204 查看
总结c++相对于c的个性之处,主要包括:类与继承/派生,函数/变量的多态/重载,虚函数与纯虚函数,抽象类,数据封装。
1.类的继承/派生
类的定义形式:
类的继承
class FB:public FA
{…}
类的对象/实例化:
父类可以作为指针指向子类,但是子类不能作为指针指向父类,这是因为子类含有父类没有的东西。
这里说父类派生出了子类,或者子类继承了父类。
2.函数/变量的多态/重载
所谓多态或者重载无非就是同一个变量名或函数出现多次定义,即虽然是一个接口,但是可以选择多种形态。
对于多态,通常是对于类的虚函数而言,即子类对于父类的虚函数可以进行重新定义。多态分为早绑定和晚绑定。在编译时候确定了函数的地址,这个属于早绑定,是静态的;而编译时候不能确定从而绑定函数的地址,则属于晚绑定。输出一般是子类的效果!
重载对于函数和变量而言,只是名字相同,而变量/函数的类型,成员变量等都要变化。
如:
3.虚函数与纯虚函数
对于类而言,其虚函数可以被重新定义,并且子类重定义时候必须跟父类在类型和数量上一致。定义为:
纯虚函数就是只有声明,没有定义,上面就是一个纯虚函数
4.构造函数和析构函数
首先对于每个类必须有构造函数和析构函数,即使你不定义,那么系统也会有一个默认的。当你调用类的时候就会自动调用构造函数,当程序结束的时候,又会自动调用析构函数。一般对于申请堆的情况,自定义一个析构函数,用于释放内存,防止内存泄漏。
案例:
5.数据封装
数据封装应用了类的特性,将数据放到类的私有成员里面,从而该数据变量或者函数只能被类内访问,不能被类外访问,从而保护了变量的安全性。案例如下:
1.类的继承/派生
类的定义形式:
class FA { public: int a; int b; fun1() {...} }
类的继承
class FB:public FA
{…}
类的对象/实例化:
FA s; s.a= ; s.b= ; s.fun1();
父类可以作为指针指向子类,但是子类不能作为指针指向父类,这是因为子类含有父类没有的东西。
FB S;//子类FB实例化对象 FA *p=&S;//父类指针p指向子类对象S p->a=1;//访问子类成员变量
这里说父类派生出了子类,或者子类继承了父类。
2.函数/变量的多态/重载
所谓多态或者重载无非就是同一个变量名或函数出现多次定义,即虽然是一个接口,但是可以选择多种形态。
对于多态,通常是对于类的虚函数而言,即子类对于父类的虚函数可以进行重新定义。多态分为早绑定和晚绑定。在编译时候确定了函数的地址,这个属于早绑定,是静态的;而编译时候不能确定从而绑定函数的地址,则属于晚绑定。输出一般是子类的效果!
重载对于函数和变量而言,只是名字相同,而变量/函数的类型,成员变量等都要变化。
如:
int x; float x;//虽然变量名相同,但是类型不同。 int fun1(); long fun1();//虽然函数名相同,但是类型不同。 int fun1(intx, int y, bool isMax); int fun1(intx, int y);//虽然函数名相同,但是参数不同,也为重载。
3.虚函数与纯虚函数
对于类而言,其虚函数可以被重新定义,并且子类重定义时候必须跟父类在类型和数量上一致。定义为:
virtual void fun1() {}
纯虚函数就是只有声明,没有定义,上面就是一个纯虚函数
4.构造函数和析构函数
首先对于每个类必须有构造函数和析构函数,即使你不定义,那么系统也会有一个默认的。当你调用类的时候就会自动调用构造函数,当程序结束的时候,又会自动调用析构函数。一般对于申请堆的情况,自定义一个析构函数,用于释放内存,防止内存泄漏。
案例:
class student { public: int score; string name; void behavior(); public: student() {cout<<helloworl!<<endl;}//构造函数 ~student() {}//析构函数 }; student::behavior() {} void main() { student xiaoming; xiaoming.behavior(); xiaoming.score=10; }
5.数据封装
数据封装应用了类的特性,将数据放到类的私有成员里面,从而该数据变量或者函数只能被类内访问,不能被类外访问,从而保护了变量的安全性。案例如下:
#include "stdio.h" #include"iostream" using namespace std; class student { public: int score; float age; void fun() { cout << "fun1" << endl; } void pub1(); void large() { //ss虽然是私有变量,但是可以在类里面被调用,但是外部是无法访问的,因此形成了数据的封装。 int ss = 100; cout << "ss is:" << ss << endl; } private: int ss; void fun2() { cout << "hello private" << endl; } void pre(); }; void student::pub1() { cout << "hello public" << endl; } void student::pre() { cout << "hello!" << endl; } //公有继承student类 class std1 :public student { public: int ss1; private: void get() { cout << "get!" << endl; } }; int main() { student xiaoming; xiaoming.fun(); // xiaoming.fun2();//私有成员,不可访问! xiaoming.score = 3; xiaoming.large(); std1 xiaohua; xiaohua.age = 12;//类std1继承了student父类所有特性,除了私有成员 // xiaohua.ss = 22;//也是无法访问私有成员,从而形成了数据封装 xiaohua.large(); return 0; }
相关文章推荐
- Android Native 绘图方法
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- c#中虚函数的相关使用方法
- C#与.net高级编程 C#的多态介绍
- C#中面向对象编程机制之多态学习笔记
- C#中struct和class的区别详解
- Lua和C语言的交互详解
- C#中的多态深入理解
- C#中多态、重载、重写区别分析
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 设计引导--一个鸭子游戏引发的设计理念(多态,继承,抽象,接口,策略者模式)
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法