C++引用

简介:

引用是别名而非指针,引用与指针的区别:

1、不存在空引用

2、所有的引用都要初始化

3、一个引用永远指向用来对它初始化的那个对象

本文地址:http://www.cnblogs.com/archimedes/p/cpp-reference.html,转载请注明源地址。

引用是一个现有对象的别名,用对象来初始化引用后,对象名字或引用的名字都可以用于指向该对象

int a=12;
int &ra=a;  //ra是a的别名
--ra;  //a==11
a=10;  //ra==10
int *ip=&ra;   //ip指向a

一些编译器可以捕捉到那些明显的创建空引用的尝试:

Employee &anEmployee=*static_cast<Employee*>(0)   //error!

有些却无法侦测到不那么明显的空引用:
Employee *getAnEmployee();
//...
Employee &anEmployee=*getAnEmployee();   //可能是糟糕的代码
if(&anEmployee==0)  //未定义的行为

如果getAnEmployee返回的是一个空指针,那么其后的代码行为就是未定义的,最好使用一个指针来存放getEmployee返回的结果:

Employee *employee=getAnEmployee();
if(employee)//...

引用常常成为函数参数的优秀选择:

template<typename T>
void swap(T &a, T &b) {
    T temp=a;
    a=b;
    b=temp;
}
//...
int x=1,y=2;
swap(x,y);

引用所指向的对象可以没有名字:

int grade[MAX];
//...
swap(grade[i],grade[j]);

考虑如下函数:

inline void set_2d(float *a, int i, int j, int m) {
    a[i*m+j]=a[i*m+j]*a[i*m+j]+a[i*m+j];
}

使用引用可以简化和优化:

inline void set_2d(float *a, int i, int j, int m) {
    float &r=a[i*m+j];
    r=r*r+r;
}

一个指向非常量的引用是不可以用字面值或临时值进行初始化的:
double &d=12.3 //错误!

swap(string("Hello"),string(", World"));

然而一个指向常量的引用就可以:

const double &cd=12.3;  //OK
template<typename T>
T add(const T &a, const T &b) {
    return a+b;
}
//...
const string &greeting=add(string("Hello"), string(", World"));  //OK
目录
相关文章
|
29天前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
40 9
|
1月前
|
存储 安全 编译器
【C++专栏】C++入门 | 函数重载、引用、内联函数
【C++专栏】C++入门 | 函数重载、引用、内联函数
27 0
|
1月前
|
存储 分布式计算 安全
我的C++奇迹之旅:值和引用的本质效率与性能比较2
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
1月前
|
编译器 C++
我的C++奇迹之旅:值和引用的本质效率与性能比较1
我的C++奇迹之旅:值和引用的本质效率与性能比较
|
2月前
|
安全 编译器 Linux
【C++练级之路】【Lv.1】C++,启动!(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for,nullptr)
【C++练级之路】【Lv.1】C++,启动!(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for,nullptr)
|
2月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
71 0
|
11天前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
2月前
|
设计模式 算法 数据安全/隐私保护
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
27 0
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
|
2天前
|
存储 安全 C++
深入理解C++中的指针与引用
深入理解C++中的指针与引用
5 0
|
11天前
|
编译器 C语言 C++
【C++入门】缺省参数、函数重载与引用(上)
【C++入门】缺省参数、函数重载与引用