一:#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> //文件读写直接用fstream using 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、重写关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。