【cpp】引用、指针、const

xiaoxiao2021-02-28  91

说明

引用

引用不是对象,他只是给已经存在的对象所起的另一个名字,因此你不能引用一个引用,只能引用已存在的对象。 可以把引用看作约束化的指针,它同样可以被传递,间接访问,但是更加安全,因为它只是对象的“小名”,就比如鲁迅和周树人的关系。引用虽然也地址相关,但只是内存块的别名。

指针

指针就很熟悉了,它本身就是一个变量,void*和T*类型的指针可以存储T类型对象的地址。因为是一个变量,可以被赋值。

const引用

const 声明定义的量是只读的常量,因此可以引用,但是引用也不能改变它只读的性质,同样的,不可以用普通引用去引用常量(或者常量的引用,其实也是常量)。

有一种值得讨论的情况: 就是形如:

double i = 1.0; const double &S = 3.14*i*i; //(1)

这时候编译器会有一个暂时变量用于保存3.14*i*i的计算结果 计作tmp那么语句(1)其实等效为:

const double tmp = 3.14*i*i; const double &S = tmp;

并且这里的tmp也是只读的

定义

引用

int val1 = 42, val2 = 666; int &val1_ref = val1, other_val = val2; //val1_ref是ref1的引用,other_val是另一个无关的int型的变量,只是被val2初始化了

指针

int i = 42; int *iptr = &i; // (*iptr)--;

const引用

double i = 1.0; const double &r = i; //r是i的只读引用 const double &C = 2*3.14*r; //C是中间变量的常量引用 const double &S = 3.14*i*i; //同上,即使i变化S、C的值都不会变化

区别

definition

#include<iostream> using namespace std; int main() { int i = 42; //reference int &i_ref = i; //pointer int *iptr = &i; //const reference const int &i_conref = i; cout << "i = " << i << ", i_ref = " << i_ref <<endl; i_ref--; cout << "now i = " << i << ", i_ref = " << i_ref <<endl; (*iptr)--; cout << "now *iptr = " << *iptr << ", i_con-ref = " << i_conref <<endl; return 0; }

compare

#include<iostream> using namespace std; int main() { double i = 1.0; const double &r = i; double &ii = i; const double &C = r*2; const double &S = i*i*2; cout << "r = " <<r<< " rr = " <<ii<<" C = "<<C<<" S = "<<S<< endl; i++;cout << "r = " <<r<< " rr = " <<ii<<" C = "<<C<<" S = "<<S<< endl; i++;cout << "r = " <<r<< " rr = " <<ii<<" C = "<<C<<" S = "<<S<< endl; i++;cout << "r = " <<r<< " rr = " <<ii<<" C = "<<C<<" S = "<<S<< endl; //point of reference double const *tptr = &r; cout << "point of i via reference r "<< (*tptr) << endl; //point of tmpvarible double const *sao = &C; cout << "point of C "<< (*sao) << endl; //(*sao)++; cout << "point of C "<< (*sao) << endl; // read-only //reference of point double *iptr = &i; double *&iref = iptr; (*iref)++; cout << "now *tptr = " << *iptr << " pref = " << *iref << endl; return 0; }

output as fellow:

pi@pi:~/script/cpp$ ./out r = 1 rr = 1 C = 2 S = 2 r = 2 rr = 2 C = 2 S = 2 r = 3 rr = 3 C = 2 S = 2 r = 4 rr = 4 C = 2 S = 2 point of i via reference r 4 point of C 2 now *tptr = 5 pref = 5

参数传递

#include<iostream> using namespace std; void swap1(int *a, int *b) { (*a) = (*a) ^ (*b); (*b) = (*a) ^ (*b); (*a) = (*a) ^ (*b); } void swap2(int &a, int &b) { a = a ^ b; b = a ^ b; a = a ^ b; } int main() { int a = 1 , b = 2; cout << "1 a = " <<a<<" b = "<<b<<endl; swap1(&a,&b); cout << "2 a = " <<a<<" b = "<<b<<endl; swap2(a,b); cout << "3 a = " <<a<<" b = "<<b<<endl; return 0; }

reference

[1] c++ Primer [2] http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html [3] http://blog.csdn.net/listening_music/article/details/6921608 [4] http://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html

转载请注明原文地址: https://www.6miu.com/read-39742.html

最新回复(0)