【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. 短小函数定义 换用内联函数
相关推荐
小小、码农8 分钟前
〖Linux文件系统〗:彻底打通文件 IO 全链路
linux·开发语言·数据结构·c++·系统
大侠归来11 分钟前
cJSON 源码解析:parse_string 函数深入剖析
linux·网络·算法
東隅已逝,桑榆非晚22 分钟前
priority_queue的介绍和使用
c++·经验分享·笔记·学习
茉莉玫瑰花茶38 分钟前
OpenGL [ 纹理 ]
开发语言·c++·opengl
余额瞒着我当琳1 小时前
C++ map 底层与AVL 树
开发语言·c++·算法
释厄6231 小时前
物理发展史·量子力学=节点2·牛顿力学=节点3·宇宙的语言算法AI
人工智能·算法·microsoft
CQU_JIAKE1 小时前
9.30【A】
算法
INGNIGHT2 小时前
1897 · 会议室 3(扫描线)
数据结构·算法
All for pursuit.2 小时前
【贪心-2】253.会议室 II
数据结构·c++·算法·leetcode
垆边人似月.2 小时前
华为机考题(一):质数因子
算法·华为