博客
关于我
初夏小谈:叩响C++世界的大门
阅读量:790 次
发布时间:2019-03-25

本文共 2707 字,大约阅读时间需要 9 分钟。

今天开始学习C++,这个因C语言而衍生的语言虽然带来了一些改进,但仍然存在许多有趣的问题等待我们去探索和解决。C++之所以值得我们认真学习,不仅因为它在排行榜中紧随老大哥C语言的身后,更因为它的力大无穷。让我们从C++的基础知识说起。

1. 关键字

C语言标准下规定了32个关键字,而C++98则有63个关键字。这些关键字在编程中扮演着至关重要的角色。C++在这些基础上又逐渐发展出各种新的功能,使得我们在编程时更加便利。

2. 命名空间

为了应对多个源文件一起工作时可能导致的命名冲突问题,C++引入了命名空间的概念。每个源文件都可以定义自己的命名空间,这样在不同命名空间中定义的成员就不会发生重定义的问题。命名空间就像地球上的国家和省市,帮助我们区分不同地方的同名资源。

命名空间分为三种类型:

  • 普通命名空间:能与其他命名空间直接使用。
  • 嵌套命名空间:像国家下设省市一样,有层级结构。
  • 文件内多个相同命名空间:即便定义多次,但编译器会将它们合并为一个。

命名空间可以使用三种方式:

  • 偶尔使用:直接使用命名空间名称加成员,例如 命名空间::成员
  • 频繁使用:使用 using 命名空间名::成员,调用时无需显式说明。
  • 全局访问:使用 using namespace 命名空间名;,将命名空间内的成员以全局方式访问,但可能导致命名冲突。
  • 3. 输入输出

    C语言的输入输出功能虽然基础,但也有不少不足之处。例如,scanf 函数要求开发者手动处理指针,若不做地址取讫,程序运行时会崩溃。printf 函数又不具备参数类型检测功能,容易出错。此外,输入输出语句格式复杂且容易记错。

    C++为了解决这些问题,引入了 cincout,简化了输入输出操作,支持连续输入输出。这些自定义的输入输出流与内部实现也进行了改进,使得开发者不需要像C语言那样手动管理内存。

    4. 缺省参数

    缺省参数是让函数调用时不需要手动传递参数的特性,默认值可以通过函数定义或声明进行设置。缺省参数分为全缺省和部分缺省两种。

    全缺省参数要求所有函数参数都设定默认值,并且只能在函数定义或声明中设定,不能在同时使用定义和声明。

    部分缺省参数则允许某些参数设定默认值,而其余参数必须手动传递。要注意部分缺省参数的默认值必须连续设置,且从右向左依次设定。全缺省参数在实现中通常只留给声明进行设置,以便编译器可以正确获取函数符号和缺省参数信息。

    缺省参数的赋予可以是常量或全局变量,但不能是表达式。C语言不支持缺省参数功能,而C++则进行了完善。

    5. 函数重载

    函数重载是C++中一个重要的特性。它允许在同一个作用域内为同一个函数名定义多个具有不同参数列表的函数。函数重载的本质是在编译阶段对函数的参数类型进行推断,并根据推断结果决定调用哪个函数。

    函数重载的条件包括:

  • 函数名必须相同。
  • 参数列表必须不同(可以是参数类型不同、参数个数不同,或两个均不同)。
  • 函数在同一个作用域内(全局作用域或命名空间)。
  • 函数重载的引入主要是为了应对不同类型的数据调用同一个函数名所需的需求。然而,使用全缺省参数和无参函数时要小心搭配合规,否则可能会导致调用混乱。

    6. extern

    在一个C++程序中嵌入C语言代码的需求时,extern 关键字登场。将 extern "C"放在所需嵌入的C语言代码之前,就可以实现这一目的。

    7. 引用

    引用是给程序中的变量取一个别名的一种方式。引用在内存分配上与指针有相似之处,但与指针不同的是引用变量在定义时必须初始化,并且共享变量的内存区域。引用类型必须与所引用对象的类型一致,不支持跨类型引用。

    在使用引用时,由于引用的内存通常位于堆上,引用变量的生命周期通常比实际对象的生命周期长。此外,引用并不支持多级引用的概念,一个引用只能引用一个具体对象。

    引用在函数参数中的应用更多,通过引用可以避免参数的变值问题。const 引用类似于万能引用,可以引用常量或普通变量,但修改的是不允许的。不过,在实际应用中,为了提高安全性,尽量避免非必要的情况使用引用。

    传着引用传递参数的优势是传参开销低且不会改变原变量值,但其局限性主要体现在没有指针类型的判空机制和较难处理多级引用问题。尽管底层实现上引用与指针无别,但从语法和使用方式上有明显区别。

    8. 内联函数

    内联函数(inline 修饰)让编译器在编译阶段将函数调用替换为函数体,减少了函数调用的开销。此外,内联函数的使用还可以提高代码的执行效率。需要注意的是,内联函数不能在定义和声明分开,否则会导致编译错误。

    内联函数与宏的主要区别在于:

    • 宏的替换发生在预处理阶段,不会进行参数类型检测。
    • 内联函数的替换发生在编译阶段,功能更为灵活且不容易出错。

    虽然内联函数的使用具有一定的副作用,但当函数没有复杂循环或递归调用时,使用内联函数可以提高代码性能。

    9. auto 关键字(C++11)

    auto 关键字的作用是根据赋值的类型自动推断变量的类型。它最初在C语言中用于声明具有自动存储用的局部变量,在C++11版本中也被扩展到支持引用类型声明。

    auto 的使用规则包括:

    • 可以声明任意类型的变量,包括指针。
    • 引用类型的 auto 必须加 &
    • 多个变量的类型必须一致。
    • 不能用于函数参数,也不能指定数组类型。

    auto 的引入大大简化了代码书写,但需要注意自动类型的变量必须初始化。

    10. 基于范围的 for 循环(C++11)

    传统的 for 循环通常需要明确指定数组的范围,容易出错且不够直观。基于范围的 for 循环通过接受可迭代对象和结束条件来避免这些问题。

    基于范围的 for 循环的使用场景主要有以下几个:

    • 它在每次迭代时将数组元素复制到临时变量 e 中。
    • 该循环能够处理直接基于范围的集合。

    11. 指针空值 nullptr(C++11)

    nullptr 是 C++11 版本引入的一个关键字,用来表示空指针。它避免了传统的 NULL 宏可能带来的问题,如解释性差和潜在的核心 dumped 错误。

    nullptr 的定义如下:

    • 代表一个空值的指针常量。
    • 类型为 nullptr_t
    • 不需要包含任何头文件即可使用。

    nullptr 的主要优点是提高代码的健壮性。尽量在代码中使用 nullptr 来表示空指针,以降低内存泄漏带来的潜在风险。


    通过以上内容的学习,我们可以逐步掌握 C++ 的基础知识,并为进一步深入学习做出充分准备。C++ 开发者精谨 周详 的特点在于最初的语言规范和不断的技术改进,让人们在享受编程乐趣的同时,推动技术的不断进步。

    转载地址:http://cncuk.baihongyu.com/

    你可能感兴趣的文章
    MTK Android 如何获取系统权限
    查看>>
    MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
    查看>>
    MySQL - ERROR 1406
    查看>>
    mysql - 视图
    查看>>
    MySQL - 解读MySQL事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql -存储过程
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>
    mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
    查看>>
    multi swiper bug solution
    查看>>
    MySQL Binlog 日志监听与 Spring 集成实战
    查看>>
    MySQL binlog三种模式
    查看>>
    multi-angle cosine and sines
    查看>>