繁体   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