从静态成员函数访问私有非静态类变量 - C++
Accessing Private non-static class variable from Static member function - C++
私有非静态变量/方法是否可以在静态函数中访问?如果是, 那么"私有"访问修饰符有什么用?请浏览以下代码。
// Testclassheader.h file
class TestClass{
private:
int TestVariable; //Private Variable
int TestFunction(); //Private Method
public:
static void TeststaticFn(); //Static Method
};
void TestClass::TeststaticFn()
{
TestClass TestObj;
TestObj.TestVariable = 10; // Compiles perfectly
TestObj.TestFunction(); //Compiles Perfectly
}
// Another Class
//#include "Testclassheader.h"
class AnotherClass{
public:
int DummyFunc();
};
int AnotherClass::DummyFunc()
{
TestClass AnotherObj;
AnotherObj.TestVariable = 15; //error: 'TestVariable' is a private member of 'TestClass'
AnotherObj.TestFunction(); //error: 'TestFunction' is a private member of 'TestClass'
}
我在Visual Studio 12中尝试了上面的代码。谁能解释为什么私有变量/方法可以在静态方法中访问(实际上它不应该(?
给定类的所有函数都可以通过任何实例访问该类的private
成员。 您似乎认为private
限制对该特定实例的成员函数的访问,这是不正确的。
class foo
{
private:
int bar;
// access of the function doesn't matter, but let's use public
public:
// the only case you thought was legal:
void baz()
{
bar = 1;
}
// but this is perfectly legal
void qux(foo otherFoo)
{
otherFoo.bar = 1;
}
// also legal, as you discovered.
static void quux(foo iPittyTheFoo)
{
iPittyTheFoo.bar = 1;
}
};
class someOtherClass
{
// no function here (static or otherwise) has access to baz.
// UNLESS you "friend someOtherClass" inside class foo. Whether or not
// "friend" is ever a good idea is a matter of some debate.
};
void someGlobalFunction()
{
// Also cannot access bar.
Foo a;
a.bar = 1; // boom
}
// nope. Still cannot access bar.
foo b;
someOtherClass instance(b.bar); // boom
此外,"// throws error
"具有误导性。 "抛出"仅指异常处理,而不是编译时错误。 编译器错误、链接器错误和运行时错误都非常不同,需要不同类型的问题解决方案来处理。 当向不查看实际错误输出的人寻求帮助时,您需要指定它是哪个。 只是复制粘贴错误本身通常是一个好主意,那么我们都有相同的信息。
总的来说,我怀疑你误解了public:
、protected:
和private:
的目的。 我们都必须在某个时候学习它。
在C++中,public
函数/方法和变量/成员(不同的人使用不同的术语(表示类的"接口"。 这些是允许该类之外的所有内容使用的。 该界面背后发生的事情与他们的无关(至少在理论上是这样(。
protected
函数和变量可用于从该类继承的类。 "您的此类版本可以通过以下方式进行自定义"。
private
函数和变量不是别人关心的问题。 没有敏感。 随着程序的变化,给定类中的实现细节可能会有很大差异。 类的初始实现可能会(颤抖(返回硬编码值:
class X
{
...
private:
int Y() { return 1; }
};
同一函数的更高版本可能会在数据库中查找值,从文件中读取,等等。 "哪个数据库?" 好的,现在我们需要一个参数...
int Y(WhichDb thisOne) { return thisOne.lookupY(); }
因此,现在调用 Y 的任何地方都需要传入 WhichDb(这可能应该是一个 const 引用,但这是一个完全不同的主题(。 通过更改 Y 的"函数签名",我们破坏了所有调用 Y 的代码。 换句话说,所有对 Y 的现有调用现在都是编译器错误,因为它们不会传入 WhichDb。 从某种意义上说,公共/受保护/私有定义了给定更改将影响/破坏多少代码。
私人? 就那堂课。 没问题,我负责那个类(因为我可以更改它的标题(,所以解决这个问题没有问题。
保护? 该类,以及从它继承的所有内容。 这很容易破坏别人的代码,这通常是不好的。 破坏您不负责的代码是失去客户的好方法。
公共? 任何人,任何地方都可以调用该函数。 应避免对公共接口进行"重大更改"。
所以也许你的课程只在你的公司内部,在你的部门里,由你使用。 在这一点上,公共变化没什么大不了的。 另一方面,一些流行图书馆确实无法做到这一点。 我的意思是。。。他们可以,但他们可能会惹恼很多人。
有一些方法可以在不破坏现有代码的情况下更改公共接口。 您可以添加新函数,也可以向现有函数添加新参数,这些函数具有默认值:void foo(int bar = 2);
. 调用foo()
的人仍然会编译(并且希望仍然会得到他们所依赖的相同行为(,但现在人们可以调用foo(3)
来获得新的行为。
私有非静态变量/方法是否可以在静态函数中访问?
是的,私有非静态变量/方法可以通过属于自相同类的静态函数访问。
如果是,那么"私有"访问修饰符有什么用?
它阻止其他类访问该类的私有类成员和私有实例成员。
谁能解释为什么私有变量/方法可以在静态方法中访问?
因为类的所有部分都是类的一部分。
实际上[私有变量/方法]不应该[同一类的静态方法可以访问](?
这是不正确的。
- 在C++中使用非静态类函数的函数
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 在C++中,为什么使用静态类函数而不是常规函数?
- C++模板类静态成员初始化
- 静态类属性,C++中的多个构造函数
- 如何从静态类函数初始化静态类对象
- 在 c++ 中使用字符串变量选择静态类结构,而不带对象
- 是否通过单元化指针UB访问静态类成员
- 类静态变量初始化顺序
- 如何在 c++ 中初始化静态类对象?
- 为静态类创建指向对象的指针是否合法?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- thread_local静态类在程序退出时在无效地址处销毁
- 确定类静态变量的总大小?
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 从静态成员函数访问私有非静态类变量 - C++
- 在子类中填充静态类成员
- 静态类变量的多重定义
- 作为成员的静态类模板实例会导致未解析的外部符号错误
- uninit_member:非静态类成员字段 m_cJobState.bstatus 未在此构造函数中初始化,也不在其调