从C语言到C++:面向对象编程与STL库入门
从C语言到C++:面向对象编程与STL库入门
概述
C++是一种基础的编程语言,在系统级编程、游戏开发、嵌入式系统、高性能计算和大规模软件开发等领域都发挥着重要作用。C++起源于C语言,由Bjarne Stroustrup于1983年开发,最初是为了增强C语言的功能性而设计的。随着时间的推移,C++逐渐演变为一门多范式编程语言,结合了面向对象编程、泛型编程和低级操作的特性。
相比于C语言,C++的主要特点是增加了面向对象机制(面向对象三大特性:
封装
把客观事物封装成抽象的类【具有相同的数据和相同的操作的一组对象的集合】,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态。继承
继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的特征和能力。
继承的作用:避免公用代码的重复开发,减少代码和数据冗余。多态
多态性可以简单地概括为“一个接口,多种方法”,字面意思为多种形态。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。)
C++与C语言在功能上的优劣
首先 C++是能够兼容C语言的,C++继承了C语言高效,简洁,快速和可移植的传统。C++本身就是起源于C语言,用C++编写出的程序完全可以用C语言进行替换,它们在用法上十分相似。其次,C++有更丰富的STL库【编程模块的集合,可以在程序中去调用他们,文章后面有介绍哦】,更加便捷。但是,C++在时间效率上要弱于C语言。
初识C++
- 引入头文件 C++中的头文件常使用
#include<iostream>
相当于C语言中的#include<stdio.h>
- 使用标准命名空间
using namespace std;
这一步是必须要写上的,可以看作是用C++编写程序时基础结构的一部分 - 标准输出流对象
cout << “…” << endl;
!问题:using namespace std 是什么?
namespace是指标识符的各种可见范围。命名空间用关键字namespace 来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。
!问题:cout 、endl 是什么?
cout是c++中的标准输出流
endl是输出换行并刷新缓冲区。
示例(以输出hello world为例)
C++对C的扩展
4.1 变量声明
C++中变量可以直接在for循环中声明即for(int a=1;a<=10;a++)
。
4.2 bool类型
C++中,bool类型只有两种情况,即true和false,true指非零元素,false指0。
4.3 const定义常量
const定义的常量不能被改变,可以看作是一个恒定义。
4.4 string类
·4.4.1 string定义
例:string s="hello"
·4.4.2 string拼接
例:string s=s1+s2
·4.4.3 string输入(出)
输入 cin >> s
(这个仅局限于一个字符,不可以输出一行,例如可以用它输入hello,但是不可以输入hello world)getline(cin,s)
(这个输入的含义是输入一行)
输出 cout << s<< endl
·4.4.4 string 处理s.length()
指求s的长度s.substr(n,m)
(这个意思是说从第n个字符开始,一共取m个字符)s.substr(n)
(这个指从第n个字符开始,其后面的字符全部存入所定义的变量中)
·4.5 结构体
C++中可以省去struct
·4.6引用&(注意:这里的&与C语言中的取地址符没有关系)和传值int &a
和int a
4.5 STL篇
·4.5.1 vector
头文件 #include<vector>
创建数组 vector<int> v
(创建了一个没有元素存在的数组v)vector<int> v(m,n)
(创建了一个数组空间为10,初始值为n的数组)vector<int>v(m)
(创建了一个数组空间为m,初始值相当于0的数组)
分配数组大小 (数组名).resize(length)
末尾添加新的数据 (数组名).push_back(数据)
迭代器 (C++中,迭代器就是一个类似于指针的对象,它能够用来遍历C++标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。)for(auto p=c.begin();p!=c.end();p++)
{cout << *p <<" "; }
·4.5.2 set(set是集合,它里面的元素各不相同,而且元素会按照从小到大排序)
头文件 #include<set>
创建集合 set<int>s;
s的后面不可以加内容
处理 插入 s.insert(数据);
查找 s.find(数据);
删除 s.earse(数据);
·4.5.3 map(键值对)
它会自动将所有键值对按照键从小到大排序
处理 cout<<m["world"]
;如果存在“world”,则返回值,否则返回0
获取长度 m.size();
·4.5.4 stack(栈)
创建栈 stack<int>s;
处理 压栈s.push(i);
出栈m.pop();
访问栈项s.top();
获取长度 m.size();、
·4.5.5quene(队列)
创建 quene<int>s;
处理 入队s.push(i);
出队s.pop();
访问队首s.front():
队尾s.back():
获取长度s,size();
4.6 auto 声明
auto是一个提示符,提示编译器根据变量的值来推导变量的类型。auto是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。 使用auto定义变量时必须初始化,auto变量无法作为参数。
推广:迭代器
4.7 函数定义
C++的函数定义与其他语言的函数定义也存在一些差异。C++使用函数头和函数体的组合来定义函数。函数头包括返回类型、函数名和参数列表,而函数体则包含实际的函数实现。
在C++中,函数可以被重载,这意味着可以定义具有相同名称但不同参数列表的多个函数。编译器根据调用时提供的参数数量和类型来确定要调用的具体函数
4.8内联函数(该部分摘录了csdn中的一篇文章,原文链接:https://blog.csdn.net/CMtotoe/article/details/128749774)
在C++中,预定义宏的概念是用内联函数来实现的,而内联函数本身也是一个真正的函数。内联函数具有普通函数的所有行为。唯一不同之处在于内联函数会在适当的地方像预定义宏一样展开,所以不需要函数调用的开销。因此应该不使用宏,使用内联函数。
在普通函数(非成员函数)函数前面加上inline关键字使之成为内联函数。但是必须注意必须函数体和声明结合在一起,否则编译器将它作为普通函数来对待。
补充:由于时间和精力有限,只简单写了一点点C++中的皮毛,以后有时间会加强学习
鸣谢bilibili up主“别喷我id”的C语言转C++的简单教程视频!