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; }运行结果:
链接: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、重写关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。
- 20170806
- 20170806
- 20170801-20170806
- 重写重载20170806
- 酒客项目日志20170806
- 20170731-20170806C#工作学习周总结
- 20170806(单调栈和单调队列 蛇形填数)
- 新手入门-20170806-k8s 下 LNMP 的搭建(分离各个组件)
- Spring IoC容器高级特性
- Kruskal模板
- 归并排序理解
- 【英语系列一】—量变到质变亲体验
- JAVA如何实现人民币大小写转换
- 20170806
- JDK环境安装(windows)
- SPFA模板
- hadoop之MapReduce练习-二次排序
- Hadoop基础教程-第11章 Hive:SQL on Hadoop(11.2 Hive安装与配置)(草稿)
- Spring 源码解析IoC
- 在执行shell脚本时,出现“syntax error : unexpected end of file"错误的解决方法
- 【dp】51nod 1052 最大M子段和
- 二叉树操作集