C++ 受保护成员的默认值c++; 代码: #包括 使用名称空间std; 课例 { 公众: 国际公众; friend ostream&operator
首先,请注意,阅读是未定义的行为。 您需要为类定义构造函数。 这与访问说明符无关。在您的情况下,C++ 受保护成员的默认值c++; 代码: #包括 使用名称空间std; 课例 { 公众: 国际公众; friend ostream&operator,c++,initialization,C++,Initialization,首先,请注意,阅读是未定义的行为。 您需要为类定义构造函数。 这与访问说明符无关。在您的情况下,受保护的成员恰好位于先前包含值0的地址 最好不要使用以下划线开头的变量名。它们是保留的。 允许在类范围内使用它们,但记住不要在全局范围内使用它们 5.10标识符[法名] 3,此外,某些标识符保留用于C++实现,不应使用;没有诊断是 必需。 (3.2)以下划线开头的每个标识符都保留给 在全局命名空间中用作名称的实现 类范围中的标识符没有问题。标准仅在全局命名空间中保留它们。我刚刚在VS 2017中运
受保护的
成员恰好位于先前包含值0的地址
最好不要使用以下划线开头的变量名。它们是保留的。
允许在类范围内使用它们,但记住不要在全局范围内使用它们
5.10标识符[法名]
3,此外,某些标识符保留用于C++实现,不应使用;没有诊断是
必需。
类范围中的标识符没有问题。标准仅在全局命名空间中保留它们。我刚刚在VS 2017中运行了上面的代码,得到的所有值都是
0
。运行了几次,但输出没有更改。它是特定于编译器的吗?@P.W是的,我只是出于此示例目的在类sc中使用它们ope.@SaileshD:编译器特定的表示实现定义的行为。读取未初始化的变量不是实现定义的行为,而是未定义的行为。另请参见返回流;
在operator@SaileshD哦,是的。谢谢!您看到了未定义行为的症状。显式初始化t他有一个成员变量,你就不用担心奇怪的值了。@RSahu是的,知道了。谢谢!
#include <iostream>
using namespace std;
class Example
{
public:
int _public;
friend ostream& operator<< (ostream& stream, Example& o);
protected:
int _protected;
private:
int _private;
};
ostream& operator<< (ostream& stream, Example& o) {
stream <<
"_public=" << o._public << endl <<
"_protected=" << o._protected << endl <<
"_private=" << o._private << endl;
return stream;
}
int main(int argc, char const *argv[])
{
Example e;
cout << e << endl;
return 0;
}