20170806

来源:互联网 发布:淘宝宝贝收藏 编辑:程序博客网 时间:2024/06/10 01:39

一:#include <iostream>和 #include<iostream.h> 区别

这两者都有什么不同呢?首先,5年前我们就开始反对把.h符号继续用在标准的头 

文件中。继续使用过时的规则可不是个好的方法。从功能性的角度来讲, 
<iostream>包含了一系列模板化的I/O类,相反地<iostream.h>只仅仅是支持字符 
流。另外,输入输出流的C++标准规范接口在一些微妙的细节上都已改进,因此, 
<iostream>和<iostream.h>在接口和执行上都是不同的。最后,<iostream>的各组 
成都是以STL的形式声明的,然而<iostream.h>的各组成都是声明成全局型的。 

因为这些实质上的不同,你不能在一个程序中混淆使用这两个库。做为一种习 
惯,在新的代码中一般使用<iostream>,但如果你处理的是过去编写的代码,为了 
继承可以用继续用<iostream.h>旧保持代码的一致性。

<iostream>表示你使用的是标注命名空间,也就是在程序开始应该有这么一句话
using namespace std ;
这是遵循c++标准的
<iostream.h>
则没有遵循c++标准


<string.h>是旧的C头文件,对应的是基于char*的字符串处理函数;
<string>是包装了std的C++头文件,对应的是新的strng类;
<cstring>是对应旧的C头文件的std版本。

二:fstream.ofstream.ifstream.iostream的区别和联系

代码实例:

#include <iostream>     //cout输出用#include <fstream>      //文件读写直接用fstreamusing namespace std;int main(){    //写文件:内存写入存储设备    ofstream out("out.txt");    if (out.is_open())    {        out << "hello world.\n";        out << "hello shuaige.\n";        out.close();    }    //读文件:从存储设备读到内存    char buffer[256];    ifstream in("out.txt");    if (!in.is_open())        cout << "open file failed" << endl;    while (!in.eof())    {        in.getline(buffer, 100);        cout << buffer << endl;    }    system("pause");    return 0;}
为了方便起见,包含#include <iostream>和#include <fstream>比较简单。

三、模板

所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板。

/************************************************************//*                            模板                          *//************************************************************///函数模板template <typename T1, typename T2>T2 add(T1 a, T2 b){   T2 c = a + b;   return c;}//类模板template <typename T1, typename T2>class CTemplate{private :    T1 m_a;    T2 m_b;public:    CTemplate(T1 a, T2 b) { m_a = a, m_b = b;}    T2 cadd();};//类模板中的成员函数定义时,切记两点//1.函数名前加上函数头 //2.需要在类名后面加上模板参数列表<typename T1, typename T2>!!!template <typename T1, typename T2>T2 CTemplate<typename T1, typename T2>::cadd(){    return m_a + m_b;}int main(){    //类模板    CTemplate<int,double> test(1,3.32);    cout << test.cadd() << endl;    //函数模板    cout << add(1,3.32) << endl;    system("pause");}

可以看看:http://c.biancheng.net/cpp/biancheng/view/136.html

四、访问范围

private:类的成员函数,该类友元函数

protected:类的成员函数,友元函数,子类的成员函数

public:类的成员函数,友元函数,子类的成员函数,类的对象

注意:友元函数分为三类:该类中被声明为友元的函数,被设为友元的其他类中的成员函数,其他的友元类中的所有成员函数。

五、多态的实现

多态: 指当不同的对象收到相同的消息时,产生不同的动作

编译时多态:函数重载、运算符重载——静态绑定

运行时多态:虚函数机制——动态绑定


C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。

                                              如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

代码实测:
/************************************************************//*              多态的三种实现方式                         *//************************************************************///基类class OverLoaded{//函数重载public:    void Print(int i){ cout << i << endl; }    void Print(double j){ cout << j << endl; }    void Print(char k){ cout << k << endl; }//运算符重载public:    OverLoaded(){}    OverLoaded(int a, double b, char c){ __Data1 = a; __Data2 = b; __Data3 = c; }public:    OverLoaded operator+ (const OverLoaded &ob);public:    void PrintData();private:    int __Data1;    double __Data2;    char __Data3;//虚函数public:    virtual void PrintVirtual(){ cout << "Base virtual function" << endl; }};//运算符重载OverLoaded OverLoaded ::operator+ (const OverLoaded &ob){    OverLoaded NewObeject;    NewObeject.__Data1 = this->__Data1 + ob.__Data1;    NewObeject.__Data2 = this->__Data2 + ob.__Data2;    NewObeject.__Data3 = this->__Data3 + ob.__Data3;    return NewObeject;}//打印数据void OverLoaded::PrintData(){    cout << "int data:" <<this->__Data1 << endl;    cout << "double data:"<<this->__Data2 << endl;    cout << "char data:" <<this->__Data3 << endl;}//继承类class DerivedOverLoaded :public OverLoaded{public:    virtual void PrintVirtual(){ cout << "Derived virtual function" << endl; }};int main(){    //函数重载    OverLoaded ob1;    ob1.Print(10);    ob1.Print(9.98);    ob1.Print('a');        //运算符重载    OverLoaded ob2(1, 2.2, '\0');    OverLoaded ob3(10, 20.2, 'a');    OverLoaded addob = ob2 + ob3;    addob.PrintData();        //虚函数    OverLoaded * p1 = new OverLoaded();    p1->PrintVirtual();    p1 = new  DerivedOverLoaded();    p1->PrintVirtual();    system("pause");    return 0;  }
运行结果:

推荐一篇讲的很透彻的博文:http://blog.csdn.net/hackbuteer1/article/details/7475622
六、重写、重载、重定义
作者:西瓜橙子雨
链接:https://www.nowcoder.com/discuss/18270
来源:牛客网

1.重写(override):父类与子类之间的多态性。子类重新定义父类中有相同名称和参数的虚函数。

     1)被重写的函数不能是static的。必须是virtual的(即函数在最原始的基类中被声明为virtual )。

     2)重写函数必须有相同的类型,名称和参数列表(即相同的函数原型)

     3)重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public,protected也是可以的

2.重载(overload):

     指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。

3.重定义(redefining):

     子类重新定义父类中有相同名称的非虚函数(参数列表可以不同)。

 

重写与重载的区别 (override) PK (overload)

     1、方法的重写是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关   系,是水平关系。

     2、重写要求参数列表相同;重载要求参数列表不同。

     3、重写关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。

原创粉丝点击