Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从静态成员函数-C+;访问私有非静态类变量+;_C++_Oop_Private_Static Methods - Fatal编程技术网

C++ 从静态成员函数-C+;访问私有非静态类变量+;

C++ 从静态成员函数-C+;访问私有非静态类变量+;,c++,oop,private,static-methods,C++,Oop,Private,Static Methods,在静态函数中是否可以访问私有非静态变量/方法?如果是, 那么“私有”访问修饰符的用途是什么?。请通读下面的代码 //Testclassheader.h文件 类TestClass{ 私人: int TestVariable;//私有变量 int TestFunction();//私有方法 公众: 静态void TeststaticFn();//静态方法 }; void TestClass::TeststaticFn() { TestClass TestObj; TestObj.TestVariab

在静态函数中是否可以访问私有非静态变量/方法?如果是, 那么“私有”访问修饰符的用途是什么?。请通读下面的代码

//Testclassheader.h文件
类TestClass{
私人:
int TestVariable;//私有变量
int TestFunction();//私有方法
公众:
静态void TeststaticFn();//静态方法
};
void TestClass::TeststaticFn()
{
TestClass TestObj;
TestObj.TestVariable=10;//编译非常完美
TestObj.TestFunction();//编译非常完美
}
//另一类
//#包括“Testclassheader.h”
另一类{
公众:
int DummyFunc();
};
int-AnotherClass::DummyFunc()
{
测试类AnotherObj;
AnotherObj.TestVariable=15;//错误:“TestVariable”是“TestClass”的私有成员
AnotherObj.TestFunction();//错误:“TestFunction”是“TestClass”的私有成员
}
我在VisualStudio12中尝试了上述代码。有人能解释为什么私有变量/方法在静态方法中是可访问的(实际上它不应该访问)

在静态函数中是否可以访问私有非静态变量/方法

是的,私有非静态变量/方法可由属于同一类的静态函数访问

如果是,那么“私有”访问修饰符的用途是什么

它阻止其他类访问该类的私有类成员和私有实例成员

有人能解释为什么在静态方法中可以访问私有变量/方法吗

因为一个类的所有部分都是这个类的一部分

实际上哪些[私有变量/方法]不应该[被同一类的静态方法访问]


这是不正确的。

给定类的所有函数都可以通过任何实例访问该类的
私有
成员。您似乎认为
private
限制对该特定实例的成员函数的访问,这是不正确的

class-foo
{
私人:
int-bar;
//访问函数并不重要,但让我们使用public
公众:
//你认为唯一合法的案例是:
void baz()
{
bar=1;
}
//但这是完全合法的
无效qux(foo其他foo)
{
otherFoo.bar=1;
}
//正如你所发现的,这也是合法的。
静态void qux(foo-ipittythefo)
{
iPittyTheFoo.bar=1;
}
};
给别人上课
{
//这里没有任何函数(静态或其他)可以访问baz。
//除非你在foo班里“交了其他班的朋友”
//“朋友”是一个好主意,这是一个有争议的问题。
};
void someGlobalFunction()
{
//也无法访问工具栏。
福阿;
a、 bar=1;//动臂
}
//没有。仍然无法访问工具栏。
富b;
someOtherClass实例(b.bar);//繁荣
另外,“
//抛出错误”
“也有误导性。“Throw”专门指异常处理,而不是编译时错误。编译器错误、链接器错误和运行时错误各不相同,需要解决不同类型的问题。当向没有查看实际错误输出的人寻求帮助时,您需要指定它是哪一个。只是复制粘贴错误本身通常是一个好主意,那么我们都有相同的信息

一般来说,我怀疑您误解了
公共:
受保护:
私有:
的目的。我们都必须在某个时候学习它

<>在C++中,<>代码>公共< /COD>函数/方法和变量/成员(不同的人使用不同的术语)代表一个类的“接口”。这些是该类之外的所有内容都允许使用的。界面背后发生的事情与他们无关(至少在理论上如此)

受保护的
函数和变量可用于从该类继承的类。“您的此类版本可以通过以下方式进行自定义”

private
函数和变量与其他人无关。不敏感。随着程序的变化,给定类中的实现细节可能会有很大的变化。类的初始实现可能(抖动)返回一个硬编码值:

X类
{
...
私人:
int Y(){return 1;}
};
同一函数的更高版本可能会在数据库中查找值,从文件中读取,等等。“哪个数据库?”好的,现在我们需要一个参数

   int Y(WhichDb thisOne) { return thisOne.lookupY(); }
所以所有调用Y的地方现在都需要传入WhichDb(这可能是一个const引用,但这是一个完全不同的主题)。通过更改Y的“函数签名”,我们已经破坏了所有调用Y的代码。换句话说,所有现有的对Y的调用现在都是编译器错误,因为它们不会在WhichDb中传递。从某种意义上说,public/protected/private定义了给定更改将影响/破坏多少代码

私人的?就是那个班。没问题,我负责这个类(因为我可以更改它的标题),所以修复它没有问题

保护?那个类,加上从它继承的所有东西。这很容易破坏其他人的代码,这通常是不好的。破坏你不负责的代码是失去客户的好方法

公众?任何人,任何地方都可以调用该函数。应避免对公共接口进行“破坏性更改”

所以,也许你的类只在你的公司内部,在你的部门,被你使用过。在这一点上,公众的改变不是什么大不了的。另一方面,一些流行的图书馆确实不能做到这一点。我是说。。。他们可以,但他们可能会激怒很多人

有一些方法可以在不破坏现有代码的情况下更改公共接口。您可以添加新函数,您可以向具有默认值的现有函数添加新参数:
void foo(int bar=2)。调用
foo()
的人将