【c++入门】打开新世界大门之初遇c++

前言

在学习了c语言,初阶数据结构后,我们正式走进c++世界大门

目录

前言

一、认识c++

二、缺省参数

三、函数重载

四、引用

4.1什么是引用?

[4.2 使用场景](#4.2 使用场景)

[4.2.1 做参数](#4.2.1 做参数)

4.2.2做函数返回值

4.3引用和指针的区别

五、内联函数

六、auto关键字

6.1使用细则

[1. auto与指针和引用结合起来使用](#1. auto与指针和引用结合起来使用)

2.同一行定义多个变量

3.不能推导的场景


一、认识c++

我们刚在学c语言的时候,第一节课敲得第一次代码 hello world,我们用c++打出,如下

复制代码
#include<iostream>
using namespace std;
int main()
{
    cout<<"hello world"<<endl;
    return 0;
}

std 是c++标准库的命名空间

在上述代码中,用cout标准输出对象的和cin标准输入对象,相当于printf和scanf。cout和cin是全局的流对象,endl是特殊的符号,表示换行输出,都包含在头文件<iostream>种,

二、缺省参数

缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。

示例如下:

复制代码
#include<iostream>
using namespace std;
int add(int a=0)
{
    cout<<a<<endl;
}
int main()
{    
    add();//没有传参时,使用参数的默认值
    add(10);//传参时,使用指定的实参
    return 0;
}

三、函数重载

所谓的函数重载其实是函数的一种特殊情况,在c++中,允许同一作用域中声明功能类似的同名函数,这些函数的形参列表(即参数个数、类型、类型顺序)不同。

示例代码如下:

复制代码
#include<iostream>
using namespace std;
//参数类型不同
int add(int a,int b)
{
    
    return a+b;
}
double add(double a,double b)
{
    return a+b;
}
//参数个数不同
void dif()
{
    cout<<"wof wof"<<endl;
}
void dif(int m)
{
    cout<<"dif(int m)"<<endl;
}
//参数类型顺序不同
void sam(int x,char y)
{
    cout<<"sam(int x,char y)"<<endl;
}
void sam(chary,int x)
{
    cout<<"sam(chary,int x)"<<endl;
}

四、引用

4.1什么是引用?

引用是一个已存在的变量的别名,并不是一个新的变量,他和他引用的变量共用一个内存空间。

类型& 引用变量名(对象名) = 引用实体;

示例如下:

int m=10;

int &m1=m;

4.2 使用场景

4.2.1 做参数

示例如下:

复制代码
void change(int& a,int& b)
{
    int tmp=a;
    a=b;
    b=tmp;
}

4.2.2做函数返回值

复制代码
int& res()
{
    static int n=0;
    n++;
    return n;
}

4.3引用和指针的区别

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用 在定义时 必须初始化 ,指针没有要求
  3. 引用 在初始化时引用一个实体后,就 不能再引用其他实体 ,而指针可以在任何时候指向任何 一个同类型实体
  4. 没有 NULL 引用 ,但有 NULL 指针
  5. sizeof 中含义不同引用 结果为 引用类型的大小 ,但 指针 始终是 地址空间所占字节个数 (32
    位平台下占 4 个字节 )
  6. 引用自加即引用的实体增加 1 ,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同, 指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全
    1、语法概念上,引用就是个别名,没有独立空间,和引用实体公用一个空间
    2、在底层实现上是有空间的,因为 引用时按照指针方式来实现

五、内联函数

inline 修饰 的函数叫做内联函数, 编译时 C++ 编译器会在 调用内联函数的地方展开 ,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。
示例如下:

复制代码
inline int add(int a,int b)
{
    return a+b;
}

int main()
{
    int sum=0;
    sum=add(1,2);
    return 0;
}

特性:

  1. inline 是一种 以空间换时间 的做法,如果编译器将函数当成内联函数处理,在 编译阶段,会
    用函数体替换函数调用 ,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
    行效率。
  2. inline 对于编译器而言只是一个建议,不同编译器关于 inline 实现机制可能不同 ,一般建
    议:将 函数规模较小 ( 即函数不是很长,具体没有准确的说法,取决于编译器内部实现 ) 、
    是递归、且频繁调用 的函数采用 inline 修饰,否则编译器会忽略iinline特性
  3. inline 不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开,就没有函数地址
    了,链接就会找不到,应将生命和定义放在同一文件中
    示例如下:
复制代码
//f.h文件下
#include<iostream>
using namespace std;
inline void f(inti)
{
    cout<<i<<endl;
}

六、auto关键字

早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,
C++11 中,标准委员会赋予了 auto 全新的含义即: auto 不再是一个存储类型指示符,而是作为一
个新的类型指示符来指示编译器, auto 声明的变量必须由编译器在编译时期推导而得.

6.1使用细则

1. auto****与指针和引用结合起来使用

auto 声明指针类型时,用 auto auto* 没有任何区别,但用 auto 声明引用类型时则必须
加&

复制代码
int main()
{
    int x = 10;
    auto a = &x;
    auto* b = &x;
    auto& c = x;
}

2.同一行定义多个变量

auto a=2,b=3;

auto x=1,c=5.2;//该行代码会编译失败,因为c和d的初始化表达式类型不同

3.不能推导的场景

1、auto不能作为函数的参数
// 此处代码编译失败, auto 不能作为形参类型,因为编译器无法对 a 的实际类型进行推导
void Test ( auto a )
{}
2、auto不能直接用来声明数组

面试题

宏的优缺点:

优点:

  1. 增强代码的复用性。
  2. 提高性能。
    缺点:
  3. 不方便调试宏。(因为预编译阶段进行了替换)
  4. 导致代码可读性差,可维护性差,容易误用。
  5. 没有类型安全的检查
    C++ 有哪些技术替代宏
  6. 常量定义 换用 const enum
  7. 短小函数定义 换用内联函数
相关推荐
MC皮蛋侠客7 小时前
Google Test 单元测试指南
c++·单元测试·google test
艾莉丝努力练剑8 小时前
【Linux:文件】Ext系列文件系统进阶
linux·运维·服务器·c++·文件系统·文件io·ext
kkeeper~8 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs66610 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_8769641310 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
basketball61610 小时前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++
嗝o゚10 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本11 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Fre丸子_11 小时前
自定义文件夹选取功能
c++
Ulyanov12 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真