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