網(wǎng)站首頁 編程語言 正文
引用變量延遲綁定
我們知道引用變量定義時要立刻賦值,告訴編譯器他是誰的引用.如果不賦值,編譯會失敗.
如果引用變量是單個定義的,對他賦值還比較簡單.
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ù)組很大.就不方便了.不方便用{}一個一個賦值了.
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];//沒有用{},編譯直接報錯
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ù)的時候先賦個默認值,真正的我們用的對象
引用,后面再慢慢賦值給它.
struct test_T
{
int data;
//...其他成員
test_T(int _data = 0) :data(_data){}
};
//******************************增加全局唯一默認值
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;
}
輸出:
怎么會這樣???.(我現(xiàn)在還是不理解)
通過上面的方式,可以做到延遲賦值,但是賦值很奇怪,單個可以被修改,但是所有成員的ref都會一起被更改,真是秀兒~.
行,那就只能換個思路了.引用不能延遲賦值,指針類型可以吧,我用指針類型.
struct test_T
{
int data;
//...其他成員
test_T(int _data = 0) :data(_data){}
};
//******************************全局唯一默認值
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;
}
哼~,可以了吧.
等一下,等一下,跑題了,雖然這樣做可以,但是不是用的引用實現(xiàn)的啊.
練劍的最高境界就是無劍勝有劍,達到人劍合一,劍既是我,我既是劍.
是時候,讓指針跟引用合二為一啦.
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();//得到一個引用
內(nèi)部:
每次保存的都是指針,每次使用的時候用引用.
從匯編角度,引用和指針,本是一家.
原文鏈接:https://www.cnblogs.com/jlh-/p/16868604.html
相關(guān)推薦
- 2023-03-01 Golang?Makefile示例深入講解使用_Golang
- 2022-12-14 Python如何對音視頻文件進行解析詳解_python
- 2022-08-12 解決IE9下JQuery發(fā)送ajax請求失效的方法_jquery
- 2023-05-14 Go結(jié)構(gòu)體的基本使用詳解_Golang
- 2024-03-03 layuiAdmin側(cè)邊欄菜單刷新保持當前頁面
- 2022-10-11 錯誤連接數(shù)據(jù)庫 [xxx] : org.pentaho.di.core.exception.Kett
- 2023-03-01 Python第三方庫undetected_chromedriver的使用_python
- 2022-08-03 GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支