您现在的位置是:首页 >技术交流 >从C到C++ | C++入门网站首页技术交流

从C到C++ | C++入门

福楠 2024-06-25 18:01:02
简介从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++98C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美
国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)
C++03C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
C++05C++标准委员会发布了一份计数报告(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

asmdoifreturntrycontinue
autodoubleinlineshorttypedeffor
booldynamic_castintsignedtypeidpublic
breakelselongsizeoftypenamethrow
caseenummutablestaticunionwchar_t
catchexplicitnamespacestatic_castunsigneddefault
charexportnewstructusingfriend
classexternoperatorswitchvirtualregister
constfalseprivatetemplatevoidtrue
const_castfloatprotectedthisvolatilewhile
deletegotoreinterpret_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++的输入输出可以自动识别变量类型。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。