private
语法
private: [member-list] private base-class
备注
当位于类成员列表之前时,private 关键字指定这些成员仅可从成员函数和该类的友元中进行访问。这适用于声明到下一个访问指示符或类的末尾的所有成员。
当位于基类的名称之前时,private 关键字指定基类的公共成员和受保护成员为派生类的私有成员。
类中成员的默认访问是私有的。结构或联合中成员的默认访问是公共的。
基类的默认访问对于类是私有的,而对于结构是公共的。 联合不能具有基类。
例子
// keyword_private.cpp class BaseClass { public: // privMem accessible from member function int pubFunc() { return privMem; } private: void privMem; }; class DerivedClass : public BaseClass { public: void usePrivate( int i ) { privMem = i; } // C2248: privMem not accessible // from derived class }; class DerivedClass2 : private BaseClass { public: // pubFunc() accessible from derived class int usePublic() { return pubFunc(); } }; int main() { BaseClass aBase; DerivedClass aDerived; DerivedClass2 aDerived2; aBase.privMem = 1; // C2248: privMem not accessible aDerived.privMem = 1; // C2248: privMem not accessible // in derived class aDerived2.pubFunc(); // C2247: pubFunc() is private in // derived class }
protected
语法
protected: [member-list] protected base-class
备注
protected 关键字指定对 member-list 中的成员直到下一个访问说明符(public 或 private)或类定义的末尾的访问。只能通过以下项使用声明为 protected 的类成员:
最初声明这些成员的类的成员函数。
最初声明这些成员的类的友元。
使用公共或受保护访问(派生自最初声明这些成员的类)派生的类。
也对受保护成员具有专用访问权限的以私有方式派生的直接类。
当以基类的名称开头时,protected 关键字指定基类的公共成员和保护成员是其派生类的保护成员。
保护成员不像 private 成员那样专用,private 成员仅对从中声明它们的类的成员可访问,但保护成员也不像 public 成员那样公开,public 成员在任何函数中均可访问。
也声明为 static 的保护成员对派生类的任何友元或成员函数均可访问。也声明为 static 的保护成员对派生类中的友元或成员函数可访问,但只能通过指向派生类的指针、对派生类的引用或派生类的对象。
例子
// keyword_protected.cpp // compile with: /EHsc #include <iostream> using namespace std; class X { public: void setProtMemb( int i ) { m_protMemb = i; } void Display() { cout << m_protMemb << endl; } protected: int m_protMemb; void Protfunc() { cout << "\nAccess allowed\n"; } } x; class Y : public X { public: void useProtfunc() { Protfunc(); } } y; int main() { // x.m_protMemb; error, m_protMemb is protected x.setProtMemb( 0 ); // OK, uses public access function x.Display(); y.setProtMemb( 5 ); // OK, uses public access function y.Display(); // x.Protfunc(); error, Protfunc() is protected y.useProtfunc(); // OK, uses public access function // in derived class }
public
语法
public: [member-list] public base-class
备注
当位于类成员列表前面时,public 关键字指定这些成员可从任何函数访问。这适用于声明到下一个访问指示符或类的末尾的所有成员。
当位于基类名称前面时,public 关键字指定基类的公共和受保护成员分别是派生类的公共成员和受保护成员。
类中成员的默认访问是私有的。结构或联合中成员的默认访问是公共的。
基类的默认访问对于类是私有的,而对于结构是公共的。 联合不能具有基类。
例子
// keyword_public.cpp class BaseClass { public: int pubFunc() { return 0; } }; class DerivedClass : public BaseClass {}; int main() { BaseClass aBase; DerivedClass aDerived; aBase.pubFunc(); // pubFunc() is accessible // from any function aDerived.pubFunc(); // pubFunc() is still public in // derived class }
问题内容: 是在类级别还是在对象级别的私有成员访问权限。如果是在对象级别,则以下代码不应编译 请说明在sub的messWithI()方法中访问obj的成员i是否有效 问题答案: 正如DevSolar所说的,它处于(顶级)类级别。 从Java语言规范的6.6节开始: 否则,如果将成员或构造函数声明为私有,则仅当访问发生在包含成员或构造函数的声明的顶级类(第7.6节)的主体内时,才允许访问。 请注意,
注意:如果friend函数只是在类中声明并在外部实现,那么Clang和GCC都会拒绝该代码。
我只是碰巧发现,可以使用指令在封闭类之外直接访问嵌套私有模板类: 标记为“error:__xxx is private”的行在未注释时正确报告错误。但是使用的行编译时不会受到编译器的任何抱怨。 我在GCC-4.9.2、Clang-3.5.0和visual studio 2013 Express上尝试了这一点。GCC命令行:
我正在阅读这本Java SCJP的书,我偶然发现了以下内容: 但是我得到了这个错误: 那么,出什么问题了?
问题内容: 什么时候以及为什么要在类中使用,和函数以及变量?它们之间有什么区别? 例子: 问题答案: 你用: 范围,以使该属性/方法可从任何位置,对象的其他类和实例使用。 当您希望您的属性/方法仅在其自己的类中可见时。 要使属性/方法在扩展当前类的所有类(包括父类)中可见时显示范围。 更多:( 有关全面信息) PHP手册-可见性
这是我课堂的一部分: 我想访问Lambda的私有成员变量output_文件,它位于公共成员函数dump_dvars中。当我捕获this指针时,我无法访问该变量,因为它是私有的,但我也不想将其公开!我已经读过这个问题(如何让lambda成为一个类的朋友?)但我不想创建另一个函数。因此,我目前解决这个问题的方法是创建对私有成员的引用,并通过引用捕获列表将该变量传递给我的Lambda。 这是一个好的解决