复杂引用
1.通過引用來引用數組(一維數組)
#include <iostream>
#include <stdlib.h>
?
/*引用就是給原來的變量有一個別名同一個地址*/
void main()
{
??? int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
??? int(&ra)[10](a);
??? int i = 0;
??? for (auto data:ra)? //C++11的循環
??? {
??????? data = i + 5;
??????? std::cout << data << std::endl;
??? }
??? std::cout << a << " " << ra << std::endl;
??? std::cout << &a << " " << &ra << std::endl;
?
??? system("pause");
}
2.引用二維數組的方式
#include <iostream>
#include <stdlib.h>
?
void main()
{
??? int a[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
??? //引用就是給原來的變量有一個別名同一個地址
??? int(&ra)[2][5](a);
??? for (int i = 0; i < 2;i++)
??? {
??????? for (int j = 0; j < 5;j++)
??????? {
??????????? std::cout << " " << ra[i][j];
??????? }
??????? std::cout << "\n";
??? }
?
??? std::cout << a << " " << ra << std::endl;
??? std::cout << &a << " " << &ra << std::endl;
?
??? system("pause");
}
?
3.引用函數指針
#include <iostream>
#include <stdlib.h>
?
int jia(int a, int b)
{
??? return a + b;
}
?
int jian(int a, int b)
{
??? return a - b;
}
?
//函數指針int (*rp)(int a,int b)
void change(int(* & rp)(int, int))
{
??? rp = jian;
}
?
int(*& changep(int(*&rp)(int, int)))(int, int)
{
??? rp = jian;
??? return rp;
}
?
void main()
{
??? int(*p)(int a, int b)(jia);
??? std::cout << p(1, 2) << std::endl;
??? change(p);
??? std::cout << p(1, 2) << std::endl;
?
??? std::cout << "-----------------------" << std::endl;
??? p = changep(p);
??? std::cout << p(1, 2) << std::endl;
?
??? system("pause");
}
4.數組中的元素不能為引用
5.引用的本質是指針,直接sizeof引用,就是引用的數據大小,引用變量占據4個字節
#include <iostream>
?
class MyClass{
??? char & a;
??? char & b;
??? char & c;//引用的本質是指針,直接sizeof引用,就是求引用的數據大小
??? //引用變量占據4個字節
};
?
void main()
{
??? int num = 10;
??? int & rnum(num);
??? double db = 10.9;
??? double & rdb(db);? //直接作用引用的變量
?
??? std::cout << sizeof(rnum) << std::endl;
??? std::cout << sizeof(rdb) << std::endl;
??? std::cout << sizeof(MyClass) << std::endl;
??? system("pause");
}
運行結果如下:
?
?
?
#include <iostream>
?
int? getdata(int && num)//右值引用,節約內存拷貝,內存優化所必須
{
??? std::cout << num << std::endl;
??? num += 10;
??? return num;
}
?
void? main7()
{
??? int a = 5;
??? int b = 4;
?
??? std::cout << getdata(a + 1) << std::endl;
??? system("pause");
}
?
//左值,一般可以取地址就是左值
//右值某些情況可以,某些情況不可以
void main8()
{
??? int a = 3;
??? int b = a + 1;//右值->左值
??? std::cout << getdata(std::move(a)) << std::endl;
??? //std::move將左值轉換為右值,C++11
}
void main9()
{
??? //const int num(6);
??? char str[10]("hello");//限定字符串不被修改
??? const char *pc(str);//指向常量的指針限定了指向的數據無法修改,+1,+2,+3
??? str[3] = 'x';//可以,
??? //pc[3] = 'y';
??? //*(pc + 3) = 'y';
??? pc = "world";
??? system("pause");
}
?
void main10()
{
??? char str[10]("hello");
??? const char(&rstr)[10](str);//常量引用
??? const char(&rrstr)[10](rstr);//引用可以給另一個引用初始化
??? str[4] = 'X';
??? //rstr[4] = 'Y';
}
?
void? main11()
{
??? int(*p)(int a, int b)(jia);
??? std::cout << p(1, 2) << std::endl;
??? int(*const &rp)(int a, int b)(p);//引用函數指針
??? //rp=jian;//()僅僅適用于初始化
}
總結
- 上一篇: 固安御湖园电动车怎么充电有充电桩吗?
- 下一篇: 用模板元实现50个台阶问题,一次走一步或