您现在的位置是:首页 >技术交流 >从C到C++ | C++入门网站首页技术交流
从C到C++ | C++入门
目录
什么是C++?
1982年,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言,最初这种语言被称作“C with Classes”带类的C,后为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
C++发展史
C with classes | 类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符 重载等 |
C++1.0 | 添加虚函数概念,函数和运算符重载,引用、常量等 |
C++2.0 | 更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静 态成员以及const成员函数 |
C++3.0 | 进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处 理 |
C++98 | C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美 国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库) |
C++03 | C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性 |
C++05 | C++标准委员会发布了一份计数报告(Technical Report,TR1),正式更名 C++0x,即:计划在本世纪第一个10年的某个时间发布 |
C++11 | 增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循 环、auto关键字、新容器、列表初始化、标准线程库等 |
C++14 | 对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表 达式,auto的返回值类型推导,二进制字面常量等 |
C++17 | 在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文 本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等 |
C++20 | 自C++11以来最大的发行版,引入了许多新的特性,比如:模块(Modules)、协 程(Coroutines)、范围(Ranges)、概念(Constraints)等重大特性,还有对已有 特性的更新:比如Lambda支持模板、范围for支持初始化等 |
C++23 | 制定ing,C++23 - cppreference.com |
C++关键字
相对于C语言的32个关键字,C++98的关键字有63个。
C++最新关键字及其含义可前往关键字 (C++) | Microsoft Learn
asm | do | if | return | try | continue |
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
第一个程序
//C语言
#include <stdio.h>
int main()
{
printf(""hello world
);
return 0;
}
//C++
#include <iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
整体变化不大, 头文件不是 stdio 而是变成了 iostream ; using namespcae std , 展开空间命名, 不理解可以暂时先跳过, 在后面会讲解; printf 变成了 cout, 格式也由 " 函数() " 变成了 " cout << " ;而 endl , 其实就是 ' ' 换行符, 用 endl 和 ' ' 都一样。
头文件
在“第一个程序”中可以发现,C++和C语言的头文件最大的差异就是少了 " .h ",其实在早期,C++的头文件也是有 " .h "的,后由于C++的进化,引进了空间命名后,这种格式被取代了。
同时,C++是兼容C语言语法的,C语言的头文件在C++的写法也有些许变化,就比如在C语言中,stdio的写法为 #include <stdio.h>,而在C++中,stdio的写法为 #include <cstdio.h>,大家在cplusplus网站查看文档时,也会发现头文件的标签是 " <cassert>(assert.h) ",其实"< >"内为C++的写法,而 " ( ) " 内为C语言的写法。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
printf("hello, 这是C语言的语法, C++的程序
");
return 0;
}
空间命名
在用C语言的时候,有个很不舒服的点就是,当工程量多起来的时候,很容易造成命名冲突,比如这命名一个push,那也想命名一个push,就很难受,这还算好。当你在导入别人写的头文件和源码的时候,发现很多命名和自己的程序冲突了,这就是个大问题了。
为了防止命名冲突,C++引入了空间命名。这个空间命名其实很好理解,就是你叫张三,我也叫张三,但你是高三一班的张三,我是高三二班的张三,这样我们就不冲突了。
namespace class1
{
int a;
}
namespace class2
{
int a;
}
当然,空间命名也支持嵌套命名,就像这样:
namespace calss1
{
int a;
namespace class2
{
int a;
}
}
那么,我们该如何访问呢?
namespace calss1
{
int a;
namespace class2
{
int a;
}
}
//访问class1里的a
class1::a = 1;
//访问class2里的a
calss1::class2::a = 0;
如果我们要频繁地使用class1里面的a,但是 " class1::a " 这样子又太繁琐怎么办?
using class1::a;
//这样子 a 就直接是访问class1里的a了。
//class1::a
a = 1;
而我们第一个程序中的 " using namespace std " 是什么意思呢?其实就是展开空间命名std, std是C++库里自带的空间命名,比如我们在使用 cout 输出的时候,cout 是<iostream>库里的东西, 并不能直接 " cout << ",因为在<iostream>库里面cout是在空间命名std里的, 我们要使用cout, 而是要去访问库里的空间命名std, 就像这样: " std::cout << "。
输出&&输入
输出
从 " 第一个程序 " 中可以发现, 我们在C++中输出不是用 " printf " 而是用 " cout " , 比如我们要打印字符串 " hello world " , 则是 " cout << " hello world " << endl;
那如果是输出变量呢?
#include <iostream>
namespace test
{
int a = 0;
double b = 1.1;
}
int main()
{
//printf("%d
",test::a);
std::cout << test::a << std::endl; //输出整型变量a
//printf("%d
",test::b);
std::cout << test::b << std::endl; //输出整型变量b
return 0;
}
使用cout, 不用像C语言中的printf一样, 需要我们告诉它是int类型还是float类型的变量, cout 会自动识别。
输入
在C语言中, 我们用 scanf 函数来输入数据, 而在C++中, 用的是 cin >> ,就像这样:
#include <iostream>
using namespace std;
int main()
{
int a, b;
scanf("%d",&a);
cin >> b;
cout << a << " " << b << endl;
return 0;
}
说明:
1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
iostream >头文件中。
3. <<是流插入运算符,>>是流提取运算符。
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。