Bootstrap

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

前言

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

目录

前言

一、认识c++

二、缺省参数

三、函数重载

四、引用

4.1什么是引用?

4.2 使用场景

4.2.1 做参数

4.2.2做函数返回值

4.3引用和指针的区别

五、内联函数

六、auto关键字

6.1使用细则

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;//该行代码会编译失败,因为cd的初始化表达式类型不同

3.不能推导的场景

1、auto不能作为函数的参数

// 此处代码编译失败, auto 不能作为形参类型,因为编译器无法对 a 的实际类型进行推导
void Test ( auto a )
{}

2、auto不能直接用来声明数组

面试题

宏的优缺点:

优点:

1. 增强代码的复用性。
2. 提高性能。
缺点:
1. 不方便调试宏。(因为预编译阶段进行了替换)
2. 导致代码可读性差,可维护性差,容易误用。
3. 没有类型安全的检查
C++ 有哪些技术替代宏
1. 常量定义 换用 const enum
2. 短小函数定义 换用内联函数
;