引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
类型& 引用变量名(对象名) = 引用实体;
int main()
{
int a = 10;
int& b = a;//b是a的别名,b是a的引用,这里的&不是取地址符合。
printf("%p\n", &a);
printf("%p\n", &b);
return 0;
}
注意:引用类型必须和引用实体是同种类型的
void Test()
{
int a = 10;
int& ra;//未初始化,编译时会报错
int& b = a;//引用在定义的时候初始化
int& c = a;
int& d = b;//一个变量可以有多个引用
}
int main()
{
//指针和引用在出生赋值时,权限可以缩小,不能放大。
const int a = 10;
//int& b = a;
const int& b = a;
int c = 10;
const int& d = c;
const int& r = 10;
//整形和浮点数之间可以互相隐式类型转换
double dd = 2.22;
int i = dd;
const int& rd = dd;//引用的时中间的临时变量,临时变量具有常性。
return 0;
}
void Swap(int& x, int& y)
{
int tmp = x;
x = y;
y = tmp;
}
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
Add(3, 4);
cout << "Add(1,2) is :" << ret << endl;
return 0;
}
如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。
优点:
1.增强代码的复用性。
2.提高性能。
缺点:
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查
auto声明的变量必须是由编译器在编译时期推导而得,使用auto定义变量时必须对其进行初始化。
int main()
{
int a = 10;
auto b = a;
//这里b的类型时根据a的类型推导出来的
auto x = &a;
auto* c = &x;
//int* 类型
auto& d = a;
//int 类型
}
int main()
{
int array[]={
1,2,3,4};
//访问并打印数组中的内容
for(auto e : array)
{
cout<<e<<" ";//e会自动取范围内的东西
}
return 0;
}
使用条件
int main()
{
int* p1 = NULL;
//等价于
int* p2 = 0;
//空指针用nullptr
int* p3 = nullptr;
}