我有以下代碼:
主檔案
#include "Test.h"
int main() {
Create();
}
測驗.h
#pragma once
#include <iostream>
#include "Function.h"
class Test {
public:
Test();
};
extern Test* g_pTest;
inline void Create() {
g_pTest = new Test;
std::cout << "On Test.h: " << std::endl;
PrintAddr();
}
測驗.cpp
#include "Test.h"
Test* g_pTest = nullptr;
Test::Test() {
std::cout << "On Test.cpp:" << std::endl;
PrintAddr();
}
函式.h
#pragma once
void PrintAddr();
函式.cpp
#include "Function.h"
#include "Test.h"
void PrintAddr() {
std::cout << "g_pTest address is " << g_pTest << std::endl;
}
當我運行它時,我得到以下輸出:
在 Test.cpp 上:
g_pTest 地址為 0000000000000000
在 Test.h 上:
g_pTest 地址為 000002008A5EAE40
我認為外部變數應該在代碼的任何地方都具有相同的值,那為什么不呢?我嘗試運行相同的代碼,但不是 Test 類,我只有一個函式:
測驗.h
#pragma once
#include <iostream>
#include "Function.h"
void Test();
extern int* g_pTest;
inline void Create() {
g_pTest = new int;
Test();
std::cout << "On Test.h: " << std::endl;
PrintAddr();
}
測驗.cpp
#include "Test.h"
int* g_pTest = nullptr;
void Test() {
std::cout << "On Test.cpp:" << std::endl;
PrintAddr();
}
如果以這種方式完成它會以某種方式起作用,我不明白邏輯......我在這里做錯了什么?為了使用類并可以訪問任何代碼檔案中的相同外部變數,我該怎么做?
uj5u.com熱心網友回復:
int main() {
Create();
}
main
呼叫Create()
,它這樣做:
g_pTest = new Test;
Test
首先得到new
ed 。在的建構式完成并構造物件后分配。g_pTest
Test
Test
的建構式呼叫PrintAddr
它列印的值,g_pTest
因為它仍然是 nullptr:
Test* g_pTest = nullptr;
在 Test
完成構建之前,情況仍然如此。
只有在建構式完成其業務之后,指向新物件的指標才被分配給g_pTest
,然后對printAddr
(from Create
) 的第二次呼叫列印指標的值,該指標現在指向新物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/508346.html
標籤:C
上一篇:std::conditional_t,當兩個分支不同時編譯時,如何有條件地定義變數的型別?
下一篇:避免從庫中覆寫方法