20世纪70年代早起,贝尔实验室的Dennis Ritchie 致力于开发UNIX操作系统。初始使用汇编这类的low-level语言进行编程,直接操作硬件。高级语言的诞生解决了低级语言的各种缺点,如效率等等,高级语言通过编译器(IDE)被编译为计算机内部二进制语言,这样,就可以在不同的平台上使用不同的编译器进行程序的二进制化。Ritchie希望有一种语言将低级语言的效率、硬件访问能力和该机语言的通用性、可移植性融合入在一起,于是C语言被开发出来。
C语言在早期和当时其他主流语言同样是过程性的(procedural),后来计算机科学家开发出一种更有序的编程方法——结构化编程(structured programming)。另一个新原则是自顶向下(top-down)的设计。 数据+算法=程序
虽然结构化编程理念提高程序的清晰度、可靠性,并且便于维护,但在编写大型程序时,仍然面临挑战,OOP提供一种新的方法,试图让语言来满足问题的要求,其理念是设计与问题的本质相对应的数据格式。
类是一种规范,它描述了新型的数据格式,对象是根据这种规范构造的特定数据结构。OOP的方法首先是设计类,但是不仅仅是数据和方法的合并,还包括其他一些方面,例如多态、信息隐藏、继承等。设计可靠、有用的类是一项艰巨的任务。
泛型编程(generic programming)是C++支持的另一种编程模式, 泛型是通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。
泛型的优点: 1.可以做到最大的代码重用、保护类型的安全以及提高了程序运行的性能; 2.可以创建集合类; 3.可以创建自己的泛型接口、泛型方法、泛型类、泛型事件和泛型委托。 4.可以对泛型类进行约束,以访问特定数据类型的方法。 5.关于泛型数据类型中使用的类型的信息,可在运行时通过反射获取。
// generic programming class Program { static void Main(string[] args) { int obj1 = 2; var task = new Task<int>(obj1); Console.WriteLine(task.obj); string obj2 = "这是个泛型"; var task2 = new Task<string>(obj2); Console.WriteLine(task2.obj); Console.ReadKey(); } } class Task<T> { public T obj; public Task(T t) { this.obj = t; } }源代码——编辑器——目标代码——链接程序(启动代码+库代码)——可执行代码
C++11 & C++98 关于c++11的常用新特性,这篇博客里面有介绍C++11常用特性
iostream.h文件所定义的类和对象都是在全局空间中的,可以直接使用,然而iostream中的都是被放在了名称空间中,如果需要使用,则需要using namespace,然后可以直接使用cout。还有一种偷懒的方法,即using std::cout 这样也可以直接使用cout,不建议哈; 如果省略using namespace 命令,则需要在使用类的地方前面加上名字,例如std::cout; (C语言中只有string特殊,问题在于C++要兼容C的标准库,而C的标准库里碰巧也已经有一个名字叫做“string.h”的头文件,包含一些常用的C字符串处理函数,比如strcmp。 这个头文件跟C++的string类没有关系,所以并非“升级版本”,他们是毫无关系的两个头文件。) cmath: sqrt()
cout下 <<运算符的重载std 中的endl控制符换行,旧式换行\n。使用情况:cout<<“How are you?\n”<<“I am fine !”<<endl; \n可以减少输入量。