重载:面试问题:
1、什么函数重载 2、C++是如何支持函数重载的?为什么C语言不支持
编译过程
预处理
头文件展开
宏替换
条件编译
去掉注释
编译
检查语法
生成汇编代码
汇编
二进制代码转机器码
链接
将两个目标文件链接在一起
找不到就是链接错误
将声明的函数 将该函数实现的地址链接到声明
C语言直接是函数地址
C++ 是函数名修饰规则
修饰规则为【_Z+函数长度+函数名+类型首字母】
extern "C"
给符号表看
给c++调用C语言的命名规则看
在C和C++中,extern "C"
是一个链接指示符,用来告诉编译器,其包围的函数或变量应该按照C语言的链接规则来处理。这在C++程序中特别有用,因为C++支持函数重载,而C语言不支持。当C++编译器编译代码时,它可能会对函数名进行修饰(mangling),以区分同名但参数类型不同的函数。然而,C语言编译器不会对函数名进行这样的修饰。
使用 extern "C"
的主要场景包括:
兼容性:当你需要在C++程序中调用C语言写的库函数,或者在C语言程序中调用C++写的函数时,使用
extern "C"
可以确保函数名在C++代码中保持不变,从而避免链接错误。链接符号:在C++中,如果不使用
extern "C"
,编译器可能会改变函数的链接符号(即函数名),这会导致C语言代码无法识别C++中的函数。避免名称修饰:在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++中,指针和引用都是对内存地址的操作方式,但它们之间存在一些关键的区别:
定义方式:
指针:使用
*
来定义,它是一个变量,存储了另一个变量的内存地址。引用:使用
&
来定义,它不是变量,而是一个别名,为另一个已存在的变量提供了另一个名字。
存储:
指针:指针本身在内存中占有空间,它存储了它所指向的变量的地址。
引用:引用本身不存储地址,它没有自己的内存地址,它就是它所引用的变量的别名。
初始化:
指针:指针在定义时可以不初始化,也可以指向任何类型的数据或者为空(
nullptr
)。引用:引用在定义时必须被初始化,它必须绑定到一个已存在的变量上。
可变性:
指针:指针的指向可以改变,即可以在程序运行过程中指向不同的变量。
引用:一旦引用被初始化指向了一个变量,它就不能改变指向另一个变量。
语法:
指针:使用
->
操作符来访问指针指向的变量的成员。引用:使用
.
操作符,就像操作它所引用的变量一样。
数组和函数参数:
指针:指针常用于数组操作和作为函数参数传递,以避免复制大的数据结构。
引用:引用通常用于函数参数,以提供对传入数据的非const访问,并避免不必要的复制。
与const一起使用:
指针:可以有指向const的指针(
const int *
)和const指针(指向常量的指针,不能修改指针本身的值)。引用:可以有const引用(
const int &
),这意味着不能通过引用来修改它所绑定的变量的值。
内存操作:
指针:可以进行指针运算,如指针加法和减法。
引用:不进行引用运算,它仅仅是一个别名。
nullptr和NULL:
指针:可以赋值为
nullptr
,C++11引入的一个表示空指针的新标准。引用:不能使用
nullptr
,引用必须始终绑定到一个对象。
安全性:
指针:由于指针的灵活性,错误使用可能导致程序出错,比如野指针问题。
引用:相对更安全,因为它们提供了一种方法来确保引用始终与一个合法的对象相关联。
在实际编程中,选择使用指针还是引用取决于具体的应用场景和需求。引用通常用于函数参数,以避免复制并提供对参数的非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 炒鸡好用
自动推变量
不可做参数 不可声明数组