在这篇博客中,我们将探讨 C++ 编程语言的基础知识,从 C++ 与 C 的区别开始,到 C++ 的优势、流、命名空间以及输入输出等方面。
虽然C++是C的超集,但二者之间存在许多关键区别。以下是一些主要的区别:
1.面向对象:C++支持面向对象编程,这包括类,对象,继承,多态,封装等。而C语言是一个过程式编程语言,不支持这些特性。
- // 一个简单的C++类示例
- class Rectangle {
- int width, height; // 私有成员变量
- public:
- void set_values (int,int); // 成员函数
- int area() {
- return width*height;
- } // 成员函数
- };
此外如果你对对向对象的理解还不够深刻或者无法理解他们,可以看看我的这一篇博客:
【探索C++】用实例教你理解面向对象编程(看不懂打我版)_祐言QAQ的博客-CSDN博客
2.STL(Standard Template Library)模板库:C++有一个强大的标准模板库,提供了一些预定义的类和方法(函数),如向量,链表,集合,栈,队列,图等。C语言没有这样的库。
(1)vector:标准模板库(STL)提供的一个动态数组容器。它提供了动态大小的数组,能够在运行时动态地增加或减少元素的数量。末尾增减push_back ,删除pop_back.
(2)list:提供的双向链表容器。与vector不同,list以双向链表的形式存储元素,这意味着它可以在任何位置快速插入和删除元素.
(3)set和multiset都属于标准模板库(STL)提供的关联容器,用于存储一组有序的唯一元素。它们都基于红黑树实现.
(4)map和multimap是标准模板库(STL)提供的关联容器,用于存储一组键-值对(key-value pairs)。它们的主要区别在于:
map:map是一种关联容器,其中的每个元素都包含一个键和一个关联的值。键是唯一的,每个键对应一个值,因此不允许重复的键。
multimap:multimap也是一种关联容器,与map不同的是,它允许多个元素拥有相同的键。换句话说,multimap允许键重复。
(5)适配器(Adapters):通常指的是容器适配器(Container Adapters),它们是标准模板库(STL)提供的一种包装容器的方式,用于提供不同的接口和功能。常见的容器适配器包括stack、queue和priority_queue。
3.异常处理:C++通过try、catch和throw关键字支持异常处理。而C语言没有内置的异常处理支持。
C++是一种多范式编程语言,它具有诸多优势,包括:
1.性能:C++的运行速度非常快,这使得它在需要大量计算的领域,如游戏编程,很受欢迎。
2.面向对象:C++的面向对象特性使得代码更加模块化,更容易维护和复用。
3.丰富的库支持:C++有大量的库和工具,可以处理各种任务,从图形用户界面到3D图形,从数据库操作到网络编程。
4.强类型检查:C++ 在类型检查方面更加严格,可以减少很多常见的错误。
在C++中,流是一个抽象概念,用于处理输入/输出操作。想象一下现在有一条河流,而cin、cout等像是河边垂钓者,数据就像是鱼,等待着这些垂钓者也就是流将其钓起。
常见的流有:
cin(用于从标准输入读取数据);
cout(用于向标准输出写入数据);
cerr(用于输出错误消息);
clog(用于记录程序的一般信息)等。
- #include <iostream>
- using namespace std;
-
- int main() {
- int myNumber;
- // 使用 << 操作符将信息输出到cout流
- cout << "Please enter a number: ";
- // 使用 >> 操作符从cin流读取输入
- cin >> myNumber;
- cout << "Your number is: " << myNumber << endl;
- return 0;
- }
命名空间是 C++ 中用于避免命名冲突的机制。通过将一组相关的变量、函数、类等放在命名空间中,可以有效组织代码。
- #include <iostream>
- using namespace std; // 使用std命名空间
-
- int main() {
- cout << "Hello, World!"; // 实际上是std::cout
- return 0;
- }
如果你不想使用 using namespace std;
,你也可以直接使用 std::
前缀来访问std命名空间中的元素:
- #include
-
- int main() {
- std::cout << "Hello, World!";
- return 0;
- }
当然你也可以自己写一个属于自己的命名空间,下面就举一个简单的例子,写一个自定义命名空间teacher,存放一个名字“小明”,然后打印出小明。
- #include <iostream>
-
- using namespace std;
-
- namespace teacher {
- // 在命名空间里定义字符数组并初始化
- char name[20] = "xiaoming";
- // 命名空间内部可以定义任何内容
- }
-
- int main() {
- // 因为 name 是定义在 teacher 命名空间里,所以要么先声明使用 teacher 命名空间,要么在 name 前面加上 teacher::
- cout << teacher::name << endl;
- return 0;
- }
命名空间的别名:可以使用 namespace
的别名来简化命名空间的名称。例如:
namespace tc = teacher;
命名空间的嵌套:可以在一个命名空间中嵌套另一个命名空间。例如:
- namespace OuterNamespace {
- namespace InnerNamespace {
- // 内部命名空间中的代码
- int innerFunction(int y) {
- return y + 10;
- }
- }
- }
要访问内部命名空间中的成员,可以使用 ::
操作符。
C++ 中的输入输出通过流来实现,可以使用 控制符“<<
” 将数据输出到流中,使用控制符 “>>
” 从流中读取数据,这个“<<
” 看起来很像C中的移位操作符:左移,那么为什么在C++中就成了输出控制符了呢,实际上这就是C++的一个特点:重载,这里简单提一句,后续还会专门讲。
下面我们举几个例子来简单理解一下C++中的输入和输出用法。
- #include <iostream>
- using namespace std;
-
- int main() {
- int age;
- cout << "Enter your age: ";
- cin >> age;
- cout << "You are " << age << " years old." << endl;
- return 0;
- }
- #include <iostream>
- #include <string>
- using namespace std;
-
- int main() {
- string s1;
-
- // 使用getline函数来读取整行输入,直到按下回车键
- getline(cin, s1);
-
- cout << s1 << endl;
-
- return 0;
- }
这里我们用到了getline()函数,它的功能就是获取整行输入,如果我们使用cin,空格就会被吃掉,从而只显示Zhang 或者Li 而不是全名。
getline还有两种写法,这是在使用char类型字符串时可以使用的,而不是我们写的string类,关于string类我们在上一篇博客中有详细讲到,链接:【探索C++】string类:更强大的字符串处理_祐言QAQ的博客-CSDN博客
char name[20];
cin.getline(name,20);
cin.get(name,20);
这些是 C++ 中基础的输入输出操作,当然还有更多高级用法可以进一步探索。
更多C/C++语言、Linux系统、数据结构和ARM板实战相关文章,关注专栏:
一键三连喔
~