網(wǎng)站首頁 編程語言 正文
引用變量延遲綁定
我們知道引用變量定義時(shí)要立刻賦值,告訴編譯器他是誰的引用.如果不賦值,編譯會(huì)失敗.
如果引用變量是單個(gè)定義的,對(duì)他賦值還比較簡(jiǎn)單.
struct test_T
{
int data;
//...其他成員
test_T(int _data = 0) :data(_data){}
};
struct SaveTest
{
test_T & ref;
//...其他成員
SaveTest(test_T & _ref) :ref(_ref){}
};
int main(void)
{
test_T *t = new test_T[2];
SaveTest *s = new SaveTest[2]{t[0], t[1]};
for (int i = 0; i < 2; i++){
t[i].data = i + 1;
}
for (int i = 0; i < 2; i++){
printf("%d ", s[i].ref.data);
}
return 0;
}
如果數(shù)組很大.就不方便了.不方便用{}一個(gè)一個(gè)賦值了.
struct test_T
{
int data;
//...其他成員
test_T(int _data = 0) :data(_data){}
};
struct SaveTest
{
test_T & ref;
//...其他成員
SaveTest(test_T & _ref) :ref(_ref){}
};
int main(void)
{
test_T *t = new test_T[2000];
SaveTest *s = new SaveTest[2000];//沒有用{},編譯直接報(bào)錯(cuò)
for (int i = 0; i < 2000; i++){
t[i].data = i + 1;
}
for (int i = 0; i < 20; i++){
printf("%d ", s[i].ref.data);
}
return 0;
}
我的想法是:先要騙過編譯器,調(diào)用SaveTest構(gòu)造函數(shù)的時(shí)候先賦個(gè)默認(rèn)值,真正的我們用的對(duì)象
引用,后面再慢慢賦值給它.
struct test_T
{
int data;
//...其他成員
test_T(int _data = 0) :data(_data){}
};
//******************************增加全局唯一默認(rèn)值
test_T default_test(-1);
//******************************
struct SaveTest
{
test_T & ref;
//...其他成員 修改構(gòu)造函數(shù)
SaveTest(test_T & _ref = default_test) :ref(_ref){}
};
int main(void)
{
test_T *t = new test_T[2000];
SaveTest *s = new SaveTest[2000];//編譯ok
for (int i = 0; i < 10; i++){
t[i].data = i + 1;
s[i].ref = t[i];//重新賦值
}
for (int i = 0; i < 10; i++){
printf("%d ", s[i].ref.data);
}
return 0;
}
輸出:
怎么會(huì)這樣???.(我現(xiàn)在還是不理解)
通過上面的方式,可以做到延遲賦值,但是賦值很奇怪,單個(gè)可以被修改,但是所有成員的ref都會(huì)一起被更改,真是秀兒~.
行,那就只能換個(gè)思路了.引用不能延遲賦值,指針類型可以吧,我用指針類型.
struct test_T
{
int data;
//...其他成員
test_T(int _data = 0) :data(_data){}
};
//******************************全局唯一默認(rèn)值
test_T default_test(-1);
//******************************
struct SaveTest
{
test_T * ref;
//...其他成員
SaveTest(test_T * _ref = nullptr) :ref(_ref){}
};
int main(void)
{
test_T *t = new test_T[2000];
SaveTest *s = new SaveTest[2000];//編譯ok
for (int i = 0; i < 10; i++){
t[i].data = i + 1;
s[i].ref = &t[i];//重新賦值
}
for (int i = 0; i < 10; i++){
printf("%d ", s[i].ref->data);
}
return 0;
}
哼~,可以了吧.
等一下,等一下,跑題了,雖然這樣做可以,但是不是用的引用實(shí)現(xiàn)的啊.
練劍的最高境界就是無劍勝有劍,達(dá)到人劍合一,劍既是我,我既是劍.
是時(shí)候,讓指針跟引用合二為一啦.
struct test_T
{
int data;
//...其他成員
test_T(int _data = 0) :data(_data){}
};
union MyUnion
{
test_T * ptr;
test_T & ref;
MyUnion(){}
};
struct SaveTest
{
MyUnion u;
//...其他成員
SaveTest(test_T& _ref){
u.ptr = &_ref;
}
void set(test_T& _ref){
u.ptr = &_ref;
}
test_T& get(){
return u.ref;
}
};
int main(void)
{
test_T *t = new test_T[2000];
SaveTest *s = new SaveTest[2000];//編譯ok
for (int i = 0; i < 10; i++){
t[i].data = i + 1;
s[i].set(t[i]);//重新賦值
}
for (int i = 0; i < 10; i++){
printf("%d ", s[i].get().data);
}
return 0;
}
使用者角度:
SaveTest *s = new SaveTest[2000];//只是定義變量,沒有綁定
s[i].set(t[i]);//第一次具體賦值,綁定引用(站在使用者角度看)
s[i].get();//得到一個(gè)引用
內(nèi)部:
每次保存的都是指針,每次使用的時(shí)候用引用.
從匯編角度,引用和指針,本是一家.
原文鏈接:https://www.cnblogs.com/jlh-/p/16868604.html
相關(guān)推薦
- 2023-01-01 解決React報(bào)錯(cuò)Property?'X'?does?not?exist?on?type?'HTML
- 2022-10-17 多階段構(gòu)建優(yōu)化Go?程序Docker鏡像_Golang
- 2022-01-21 Flink中window 窗口和時(shí)間以及watermark水印
- 2022-11-30 React之錯(cuò)誤邊界?Error?Boundaries示例詳解_React
- 2022-09-29 Python組合數(shù)據(jù)類型詳解_python
- 2022-10-18 解決VMware?VCSA?5480?后臺(tái)登錄提示失敗的問題_VMware
- 2022-10-26 C#實(shí)現(xiàn)文件與字符串互轉(zhuǎn)的方法詳解_C#教程
- 2022-07-11 python利用多線程+隊(duì)列技術(shù)爬取中介網(wǎng)互聯(lián)網(wǎng)網(wǎng)站排行榜_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支