一.引用的相关问题
1.权限放大
解释:如果一个变量本身不允许修改(如常数,被const修饰等),那他的引用也不能修改.
1.1 const修饰
int main()
{
//权限放大
const int c=10;
const int& d=c;
//权限缩小
int a =20;
const int& b=a;
return 0;
}
上述对于c的引用,如若使用 int&d=c; 编译器报错,原因是d可读可改,而c被const修饰不可改变
.
1.2 强制转变带来的临时变量
当类型发生转变,如int类型转成doule类型,
int main()
{
int i=1;
double d=(double)i;//此处发生类型转变,实质上是创建了一个临时变量
//在临时变量中完成i的强制转变,并赋值给d
//在强转之后i本身不改变
//double& e=i; 编不过 因为临时变量具有常性即会随着需求改变 不能人为改变
const double& e=i;//用const修饰 表示只读不修改
return 0 ;
}
double d=(double)i;//此处发生类型转变,实质上是创建了一个临时变量.在临时变量中完成i的强制转变,并赋值给d.在强转之后i本身不改变.
double& e=i; 编不过 因为临时变量具有常性(不可人为修改).
const double& e=i;//用const修饰 表示只读不修改
举例
void Func1(int n)
{}
void Func2(int& n)
{}
int main()
{
int a=10;
const int b=20;
Func1(a);//可以传变量
Func1(b);//被const修饰的变量
Func1(30);//常数
Func2(a);
//Func2(b); b不能被改变
//Func2(30); 30不能被改变
return 0;
}
总结:如果使用引用传参,且函数内不改变n,那么尽量用const引用传参.//给什么都可以 反正进函数里面不改变
void Func2(const int& n)
{}
二.C++的程序调用C的静态库 及 C的程序调用C++的静态库
C++调用C时
由于C++支持函数重载,使得在底层汇编时函数名修饰规则不同.
extern相当告诉C++编译器引用的函数是C的库实现的.
extern "C"
{
#include "../StackC/Stack.h"
}
C调用C++时
在C++程序中的函数声明中 进行如下操作
extern"C"
{
void StackInit(ST*ps);
void StackDestory(ST*ps);
}
由于C不认识 extern 这里要借助C++的识别宏
C中没有 __cplusplus这个宏 于是 extern就不读