簡體   English   中英

指定類變量與方法變量 C++

[英]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;

您在全局范圍內聲明了一個名為xint類型變量,初始值為零(這僅適用於全局范圍內的對象!)。

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 xtest一樣的所述一個main傳遞給它。 如果您在test內部分配給它,您會注意到main “沒有區別”。 在 Java 中,這也適用,但僅適用於int等基本類型,但在 C++ 中適用於所有類型。

如果您希望能夠更改您獲得的變量,只需使用引用即可。 您可以通過鍵入T&獲得任何類型T的引用。 因此,如果您在現在修改的test分配給int& xmain將“看到”所有更改。

最后,還有::運算符。 它用於從其他范圍訪問某個范圍內的內容。 它的形式為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM