重载:面试问题:

1、什么函数重载 2、C++是如何支持函数重载的?为什么C语言不支持

编译过程

  • 预处理

    • 头文件展开

    • 宏替换

    • 条件编译

    • 去掉注释

  • 编译

    • 检查语法

    • 生成汇编代码

  • 汇编

    • 二进制代码转机器码

  • 链接

    • 将两个目标文件链接在一起

    • 找不到就是链接错误

    • 将声明的函数 将该函数实现的地址链接到声明

  • C语言直接是函数地址

  • C++ 是函数名修饰规则

  • 修饰规则为【_Z+函数长度+函数名+类型首字母】

extern "C"

  • 给符号表看

  • 给c++调用C语言的命名规则看

在C和C++中,extern "C" 是一个链接指示符,用来告诉编译器,其包围的函数或变量应该按照C语言的链接规则来处理。这在C++程序中特别有用,因为C++支持函数重载,而C语言不支持。当C++编译器编译代码时,它可能会对函数名进行修饰(mangling),以区分同名但参数类型不同的函数。然而,C语言编译器不会对函数名进行这样的修饰。

使用 extern "C" 的主要场景包括:

  1. 兼容性:当你需要在C++程序中调用C语言写的库函数,或者在C语言程序中调用C++写的函数时,使用 extern "C" 可以确保函数名在C++代码中保持不变,从而避免链接错误。

  2. 链接符号:在C++中,如果不使用 extern "C",编译器可能会改变函数的链接符号(即函数名),这会导致C语言代码无法识别C++中的函数。

  3. 避免名称修饰:在C++中,类成员函数和非静态成员函数的名称在编译时会被修饰,以包含额外的信息,如类名。使用 extern "C" 可以防止这种修饰,使得C++的函数可以被C代码以未修饰的名称直接调用。

下面是一个简单的例子:

// 告诉编译器下面的函数应该按照C语言的规则进行链接
extern "C" {
    void myFunction();
}
​
// C语言中的函数声明
void myFunction() {
    // ...
}

在C++中,如果你想要一个函数可以被C语言代码调用,你可以这样声明它:

// 声明一个按照C语言规则链接的函数
extern "C" void myCFunction() {
    // 实现...
}

这样,myCFunction 就可以在C语言代码中以 myCFunction 的名字被调用,而不会被C++编译器进行名称修饰。

const

对于const

  • 在c++中 权限可以缩小不能放大

引用&

  • 引用做参数 输出型参数

  • 引用提高程序效率

  • 引用做返回值

一个函数使用引用返回 ,返回变量出了变量作用域存在可以使用引用返回,否则不安全

函数引用返回 会少创建一个临时变量

减少拷贝 提高效率

指针和引用的区别 kimi

在C++中,指针和引用都是对内存地址的操作方式,但它们之间存在一些关键的区别:

  1. 定义方式

    • 指针:使用*来定义,它是一个变量,存储了另一个变量的内存地址。

    • 引用:使用&来定义,它不是变量,而是一个别名,为另一个已存在的变量提供了另一个名字。

  2. 存储

    • 指针:指针本身在内存中占有空间,它存储了它所指向的变量的地址。

    • 引用:引用本身不存储地址,它没有自己的内存地址,它就是它所引用的变量的别名。

  3. 初始化

    • 指针:指针在定义时可以不初始化,也可以指向任何类型的数据或者为空(nullptr)。

    • 引用:引用在定义时必须被初始化,它必须绑定到一个已存在的变量上。

  4. 可变性

    • 指针:指针的指向可以改变,即可以在程序运行过程中指向不同的变量。

    • 引用:一旦引用被初始化指向了一个变量,它就不能改变指向另一个变量。

  5. 语法

    • 指针:使用->操作符来访问指针指向的变量的成员。

    • 引用:使用.操作符,就像操作它所引用的变量一样。

  6. 数组和函数参数

    • 指针:指针常用于数组操作和作为函数参数传递,以避免复制大的数据结构。

    • 引用:引用通常用于函数参数,以提供对传入数据的非const访问,并避免不必要的复制。

  7. 与const一起使用

    • 指针:可以有指向const的指针(const int *)和const指针(指向常量的指针,不能修改指针本身的值)。

    • 引用:可以有const引用(const int &),这意味着不能通过引用来修改它所绑定的变量的值。

  8. 内存操作

    • 指针:可以进行指针运算,如指针加法和减法。

    • 引用:不进行引用运算,它仅仅是一个别名。

  9. nullptr和NULL

    • 指针:可以赋值为nullptr,C++11引入的一个表示空指针的新标准。

    • 引用:不能使用nullptr,引用必须始终绑定到一个对象。

  10. 安全性

    • 指针:由于指针的灵活性,错误使用可能导致程序出错,比如野指针问题。

    • 引用:相对更安全,因为它们提供了一种方法来确保引用始终与一个合法的对象相关联。

在实际编程中,选择使用指针还是引用取决于具体的应用场景和需求。引用通常用于函数参数,以避免复制并提供对参数的非const访问,而指针则在动态内存分配、数组操作和更复杂的数据结构中更为常见。

c++ 内联函数

频繁调用小函数会有消耗

C语言使用宏函数

C++使用内联函数

inline void swap(int &a,int &b){
    int temp = a;
    a = b;
    b = temp;
}

inline 会在调用inline函数的时候展开

inline 根据编译器会展开

如果 代码很长【20line-30line】或者递归调用编译器就不会展开

inline 函数不建议 分开文件定义

是对编译器的建议 非必须 空间消耗会很大

在c++中建议 const 替代 define inline 代替宏函数


## auto 炒鸡好用

自动推变量

不可做参数 不可声明数组

nullptr 和 NULL