首先,感謝您聲明您來自Java。這將幫助我們很多幫助你!
現在,讓我們來分析代碼
#include <iostream>
#include <string>
using namespace std;
包括一些頭,使用std
命名空間(不推薦,BTW),一切都還好這裏。
int x;
你聲明一個名爲在全局範圍內int
型x
變量,具有初始值爲零(這僅適用於在全球範圍內的對象!)。
void test(int x) {
x += 3;
cout << x << endl;
}
你聲明函數test
這需要int
類型的參數x
並返回void
(a.k.a:無)。該函數將其內部變量x
的值增加3,然後通過std::cout
將其打印到標準輸出。需要說明的是,一旦聲明瞭int x
參數,它就會在全局範圍內「隱藏」int x
,因此如果您想訪問後者,則必須使用其他方式(請參見下文)。
int main() {
test(x);
cout << x << endl;
return 0;
}
您申報的特殊main
功能,不採取任何參數和返回int
。該函數調用test
作爲參數,並將全局參數int x
作爲參數,然後通過std::cout
將標準輸出的全局參數x
的值打印出來,最後將return
的值設置爲零,表示執行成功。
現在,你有一個很大的誤解,你可以歸因於Java語言的單範例設計。在Java中,沒有「全局函數」的概念,甚至根本就沒有「功能」。你只有「類」和「方法」。
在C++中,情況並非如此。 C++語言是一個多範例之一;它允許你執行命令式編程,結構化編程,面向對象編程,甚至函數式編程(你不應該完全理解最後一句)!當您聲明任何東西而沒有指定範圍時,據說它位於全局範圍內範圍內。全球範圍內可以通過任何東西,任何地方。在你介紹的例子中,沒有涉及的類!
在全球範圍內,像void test(int)
是不的方法,但功能。沒有班級「擁有」那個功能;讓我們說這是「每個人」;)。一個函數只是一個代碼塊,如果函數具有它們,它可以通過給它的參數來重用。在C++中,您可以使用類將數據和相應代碼封裝在單個「打包」黑盒實體中,而不是像Java中的任何東西。如果你傳遞一個「普通」對象,比如int
或者更復雜一些的東西,比如std::
(你並不期望明白這一點......)。 。)到一個函數,該函數獲得該對象的副本。在test
中的int x
是而不是與傳遞給它的那個main
相同。如果您在test
內指定它,您會注意到main
「看不到任何區別」。在Java中,這也適用,但只適用於基本類型,如int
,但在C++中它適用於所有類型。
如果你想能夠改變你得到的變量,只需使用引用。通過輸入T&
可獲得任何類型的參考文獻T
。因此,如果您將int& x
分配到現在修改的test
內,main
將「看到」所有更改。
最後,還有::
運營商。它用於從其他範圍訪問某些範圍內的內容。它有形式namespace-or-class::stuff
。舉例來說,std::cout
是指名稱空間std
中的標識符cout
。有一個特例:如果沒有給出左操作數,則::
訪問全局範圍。無論何時您從全局範圍「隱藏」某些東西,這都很有用。因此,例如,在test
中,您可以說::x
,並且這將涉及全球範圍內的x
!
void test(int x) {
// ...
::x += 123;
}
編輯:如果你好奇,你可以如何在類C++這項工作一目瞭然(我就不解釋了,因爲這是題外話)...
#include <iostream>
int x = 0;
class MyClass {
private:
int x;
public:
MyClass() : x(0) {}
void test(int x) {
this->report(x);
std::cout << "Doing some magic...\n";
this->x += x;
this->report(x);
}
void report(int x) {
std::cout << "this->x = " << this->x << '\n';
std::cout << "x = " << x << '\n';
}
};
int main() {
MyClass c;
c.report();
x += 123;
c.test(x);
x += 456;
c.test(x);
c.report();
}
你在說什麼'class'? – Nandu
只有函數和全局變量。 – Nandu
您可能想要通過值和參考來查看傳遞參數,並查看差異。因爲我認爲這基本上是你需要的。示例中沒有一個類。 ;) – DeiDei