C/C++:01. C过渡到C++

news/2024/12/29 18:47:59/

文章目录

  • 前言
  • 1 C++和C的历史渊源
  • 2 C++中的`class`和C中的`struct`
  • 3 C++命名空间(名字空间)详解
    • 3.1 `namespace` 是C++中的关键字,用来定义一个命名空间,语法格式为:
    • 3.2 `namespace`的使用规范
      • 使用域解析操作符`::`
      • 使用`using`关键字
  • 4 C++头文件和`std`命名空间
    • 4.1 C和C++头文件历史变革
  • 5 C++ 的标准输入输出
  • 6 C++ `new`和`delete`运算符简介
  • 7 C++ `inline`内联函数详解
  • 8 C++ 函数的默认参数详解
  • 9 C++函数的重载
  • 10 C++ 引用
    • 10.1 参数传递带来的problem
    • 10.2 C/C++传递数组
    • 10.3 引入`引用`(Reference)
      • 引用的定义
  • 总结


前言


1 C++和C的历史渊源

C++ 读作“C加加”,是“C Plus Plus”的简称。顾名思义,C++ 是在C语言的基础上增加新特性,玩出了新花样,所以叫“C Plus Plus”。随着 C++ 的流行,它的语法也越来越强大,已经能够很完善的支持面向过程编程、面向对象编程(OOP)和泛型编程,几乎成了一门独立的语言,拥有了自己的编译方式。 所以C和C++真正分家了。

2 C++中的class和C中的struct

C++中的Class 是C中的 Struct的 更高级版本,所以在学C++时候,虽然它也支持结构体,但class对结构体进行了一些扩展,使得它更好用,尽量都使用class没毛病。

3 C++命名空间(名字空间)详解

命名空间是为了解决合作开发时的命名冲突问题,如下:个体在自己的命名空间内使用同样的变量名。

namespace Li{FILE* fp = NULL;
}
namespace Han{FILE* fp = NULL;
}

3.1 namespace 是C++中的关键字,用来定义一个命名空间,语法格式为:

namespace name{//vaiables, functions, classes.
}

name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围。

3.2 namespace的使用规范

使用域解析操作符::

Li::fp = fopen("one.txt", "r");  //使用小李定义的变量 fp
Han::fp = fopen("two.txt", "rb+");  //使用小韩定义的变量 fp

使用using关键字

或者声明整个命名空间 using namespace Li

using Li::fp;  
fp = fopen("one.txt", "r");  //使用小李定义的变量 fp
Han :: fp = fopen("two.txt", "rb+");  //使用小韩定义的变量 fp

如果命名空间 Li 中还定义了其他的变量,那么同样具有 fp 变量的效果。在 using 声明后,如果有未具体指定命名空间的变量产生了命名冲突,那么默认采用命名空间 Li 中的变量。

4 C++头文件和std命名空间

4.1 C和C++头文件历史变革

  1. 早期,C++不支持命名空间,没有自己的编译器,将C++翻译成C再通过C编译器进行编译。这时依然使用C语言的库,也开发了一些自己的库。
  2. 后来,C++引入了命名空间,打造的第一个命名空间就是std标准命名空间,即原来头文件里面实现的内容都在stl命名空间中重写了。
  3. C++现状
    1. 旧的 C++ 头文件,如 iostream.h、fstream.h 等将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在命名空间 std 中。

    2. 新的 C++ 头文件,如 iostream、fstream 等包含的基本功能和对应的旧版头文件相似,但头文件的内容在命名空间 std 中。
      注意:在标准化的过程中,库中有些部分的细节被修改了,所以旧的头文件和新的头文件不一定完全对应。

    3. 标准C头文件如 stdio.h、stdlib.h 等继续被支持。头文件的内容不在 std 中。

    4. 具有C库功能的新C++头文件具有如 cstdio、cstdlib 这样的名字。它们提供的内容和相应的旧的C头文件相同,只是内容在 std 中。

5 C++ 的标准输入输出

cout 和 cin 都是 C++ 的内置对象,而不是关键字,cout 和 cin 就分别是 ostream 和 istream 类的对象,只不过它们是由标准库的开发者提前创建好的,可以直接拿来使用。

6 C++ newdelete运算符简介

C++除了支持malloc和free之外,还增加了两个新的关键词 new 和delete,new用来动态分配内存,delete用来释放内存。

int *p = new int;  //分配1个int型的内存空间
delete p;  //释放内存int *p = new int[10];  //分配10个int型的内存空间
delete[] p;

C++中,建议使用 new 和 delete 来管理内存,它们可以使用C++的一些新特性,最明显的是可以自动调用构造函数和析构函数

7 C++ inline内联函数详解

使用内联函数的初衷函数调用时有时间和空间开销的,程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。

这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。

内联函数的定义规范:在函数头加inline

inline void swap(int *a, int *b)
{///}

注意,要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。

8 C++ 函数的默认参数详解

如下 :如果调用func的时候没有传递参数,就使用默认值(默认值只能放在形参最后,即后面的变量使用默认赋值)

//带默认参数的函数
void func(int n, float b=1.2, char c='@'){cout<<n<<", "<<b<<", "<<c<<endl;
}

9 C++函数的重载

void swap1(int *a, int *b);      //交换 int 变量的值
void swap2(float *a, float *b);  //交换 float 变量的值
void swap3(char *a, char *b);    //交换 char 变量的值
void swap4(bool *a, bool *b);    //交换 bool 变量的值

函数的重载的规则:

  • 函数名称必须相同。
  • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
  • 函数的返回类型可以相同也可以不相同。
  • 仅仅返回类型不同不足以成为函数的重载。

10 C++ 引用

10.1 参数传递带来的problem

参数传递其实就是一次赋值过程,而赋值是对内存进行拷贝,耗时耗力(尤其是数组、结构图、对象)。

10.2 C/C++传递数组

C/C++禁止在函数调用的时候直接传递数组的内容,而是强调传递数组指针,而对于结构体和对象没有这种限制。

10.3 引入引用(Reference)

引用是一种比指针更加便捷的传递聚合类型(除了char int float等基本类型)数据的方式。
引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据,也可以修改这份数据。引用类型类似于Windows中的快捷方式,通过这些快捷方式和可执行程序本身都可以运行程序。

引用的定义

  • 引用的定义方式类似指针,只是用&取代了*
    type &name = data;
  • type 是被引用的数据的类型,name 是引用的名称,data 是被引用的数据。引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(const 变量)

&的三种用法

  • 定义时使用&是定义引用变量 如:type &name = data;
  • 使用时使用&表示去地址
  • &的第三种用法是位运算中的与运算

总结


http://www.ppmy.cn/news/72273.html

相关文章

线性插值提高DDS相位分辨率

DDS&#xff08;Direct Digital Synthesizer&#xff09;即直接数字频率合成技术&#xff0c;主要由正弦查找表与控制器组成&#xff0c;通过控制器给出的相位&#xff0c;在正弦查找表中查找对应的正余弦值并予以输出。通过多个 DDS 信号的组合&#xff0c;可以进一步构建出 A…

IPB60R099CP-ASEMI代理英飞凌高压MOS管IPB60R099CP

编辑&#xff1a;ll IPB60R099CP-ASEMI代理英飞凌高压MOS管IPB60R099CP 型号&#xff1a;IPB60R099CP 品牌&#xff1a;英飞凌 封装&#xff1a;TO-263 最大漏源电流&#xff1a;31A 漏源击穿电压&#xff1a;600V RDS&#xff08;ON&#xff09;Max&#xff1a;99mΩ …

详解事务模式和 Lua 脚本,带你吃透 Redis 事务

先说结论&#xff1a; Redis 的事务模式具备如下特点&#xff1a; 保证隔离性&#xff1b;无法保证持久性&#xff1b;具备了一定的原子性&#xff0c;但不支持回滚&#xff1b;一致性的概念有分歧&#xff0c;假设在一致性的核心是约束的语意下&#xff0c;Redis 的事务可以…

mathtype公式符号显示不对

文章目录 问题解决方法结果 记录攥写论文遇到的问题及解决方法 问题 使用mathtype编辑公式过后&#xff0c;发现公式显示不对&#xff0c;出现两种问题&#xff1a; 1&#xff1a;部分符号变为方框 2&#xff1a;符号大小异常 例如&#xff1a; 解决方法 第一种&#xff1a…

VB实例源码

课前体验 Private Sub Form_Click() For i 1 To 10 For j 1 To i Print “* “; Next j Print Next i End Sub 【例3-1】 Private Sub Form_Click() c1$ Chr ( 13 ) C h r (13) Chr (13)Chr(10) msg1$ “请输入您的名字: " msg2$ “输入后按回车键” msg3$ “或单…

1684. 统计一致字符串的数目

题目&#xff1a; 给你一个由不同字符组成的字符串 allowed 和一个字符串数组 words 。如果一个字符串的每一个字符都在 allowed 中&#xff0c;就称这个字符串是 一致字符串 。 请你返回 words 数组中 一致字符串 的数目。 示例 1&#xff1a; 输入&#xff1a;allowed “…

Python实验二 程序流程控制

7-1 sdut-sel-10 直角坐标系象限判断 while(1):try:n, m map(int, input().split())if n > 0 and m > 0 :print(1)elif n < 0 and m > 0 :print(2)elif n < 0 and m < 0 :print(3)elif n > 0 and m < 0 :print(4)except:break 7-2 sdut-sel-2 汽车超…

探索Vue的组件世界-组件复用

目录 Mixin【混入】 缺陷 HOC&#xff08;higher order component&#xff09;【高阶组件】 相比较Mixin的优点&#xff1a; 不足&#xff1a; Renderless组件【函数式组件&#xff0c;无渲染组件&#xff0c;Vue社区使用比较多的一种业务复用模式】 优点&#xff1a; M…