![](/img/trans.png)
[英]C++ Class Variables: Initialization vs. Assignment and Initialization of vectors
[英]Specifying class variables vs. method variables C++
這是我的問題的一個非常基本的例子。
#include <iostream>
#include <string>
using namespace std;
int x;
void test(int x) {
x += 3;
cout << x << endl;
}
int main() {
test(x);
cout << x << endl;
return 0;
}
輸出為:“3”(新行)“0”
如何在“test()”函數內部指定我希望類的 'x' 變量添加 3 而不是函數內部的臨時變量?
在 java 中,您可以使用“this”指定您正在處理函數/方法的變量。 在 C++ 中是否有類似的方法來做到這一點?
在您的情況下,您可以使用::
指定使用全局變量,而不是本地變量:
void test(int x) {
::x += 3;
cout << ::x << endl;
}
它不是class member
等,只是全局和本地。
在C++語言中,創建一個類或結構體,可以像Java語言中的this.x
一樣使用this->x
。
首先,感謝您聲明您來自Java。 這將在幫助您方面對我們有很大幫助!
現在,讓我們分析您的代碼
#include <iostream>
#include <string>
using namespace std;
包括一些標題,使用std
命名空間(不推薦,順便說一句),這里一切正常。
int x;
您在全局范圍內聲明了一個名為x
的int
類型變量,初始值為零(這僅適用於全局范圍內的對象!)。
void test(int x) {
x += 3;
cout << x << endl;
}
您聲明了一個函數test
,它接受一個int
類型的參數x
並返回void
(又名:nothing)。 該函數將其內部x
變量的值增加 3,然后通過std::cout
將其打印到標准輸出。 需要明確的是,一旦你聲明了int x
參數,它就會在全局范圍內“隱藏” int x
,因此如果你想訪問后者,你必須使用另一種方式(見下文)。
int main() {
test(x);
cout << x << endl;
return 0;
}
您聲明了特殊的main
函數,不帶參數並返回int
。 函數以全局int x
為參數調用test
,然后通過std::cout
將全局x
的值打印到標准輸出,最后return
s 零,表示執行成功。
現在,您有一個很大的誤解,認為您可以歸因於 Java 語言的單一范式設計。 在 Java 中,沒有“全局函數”的概念,更不用說根本沒有“函數”了。 你只有“類”和“方法”。
在 C++ 中,情況並非如此。 C++ 語言是一種多范式語言; 它允許您進行命令式編程、結構化編程、面向對象編程,甚至函數式編程(您不必完全理解最后一句話)! 當你在沒有指定作用域的情況下聲明任何東西時,它被稱為位於全局作用域中。 任何地方都可以訪問全局范圍。 在您提供的示例中,沒有涉及任何類!
在全局范圍內,像void test(int)
這樣的東西不是方法,而是函數。 沒有類“擁有”該功能; 假設它屬於“每個人”;)。 一個函數只是一個代碼塊,你可以通過給它參數來重用它,如果函數有參數的話。 在 C++ 中,您使用類將數據和相應的代碼封裝在一個“打包”的黑盒實體中,而不是像 Java 那樣用於任何東西。
現在,(這有點像 Java,但要小心!),當你傳遞一個“普通”對象,比如一個int
或者更時髦和復雜的東西,比如std::
:(你不應該理解......)到一個函數,該函數獲取該對象的副本。 的int x
在test
是不一樣的所述一個main
傳遞給它。 如果您在test
內部分配給它,您會注意到main
“沒有區別”。 在 Java 中,這也適用,但僅適用於int
等基本類型,但在 C++ 中適用於所有類型。
如果您希望能夠更改您獲得的變量,只需使用引用即可。 您可以通過鍵入T&
獲得任何類型T
的引用。 因此,如果您在現在修改的test
分配給int& x
, 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.