2015-11-06 87 views
-2

所以我相當陌生,來自Java的C++。我不太確定所有的東西都是用C++語言來稱呼的,對我來說是裸露的。指定類變量與方法變量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」

我怎麼能在裏面指定「測試()」函數,我想這個類的變量「x」有3添加到它而不是函數內的臨時變量?

在java中,您可以使用'「this指定處理函數/方法的變量。有沒有類似的方式來做到這一點我的C++?

謝謝。

+2

你在說什麼'class'? – Nandu

+0

只有函數和全局變量。 – Nandu

+1

您可能想要通過值和參考來查看傳遞參數,並查看差異。因爲我認爲這基本上是你需要的。示例中沒有一個類。 ;) – DeiDei

回答

2

在C++語言中,創建類或結構,並且可以使用this->x與Java語言中的this.x相同。

3

你的情況,你可以使用::指定要使用全局變量的 而非本地一個:

void test(int x) { 
    ::x += 3; 
    cout << ::x << endl; 

} 

而且這還不是class member左右就只是全局和局部。

0

首先,感謝您聲明您來自Java。這將幫助我們很多幫助你!

現在,讓我們來分析代碼

#include <iostream> 
#include <string> 

using namespace std; 

包括一些頭,使用std命名空間(不推薦,BTW),一切都還好這裏。

int x; 

你聲明一個名爲在全局範圍內intx變量,具有初始值爲零(這僅適用於在全球範圍內的對象!)。

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(); 
}