【发布时间】:2014-05-25 07:17:55
【问题描述】:
根据我的上一个问题Initialisation of static variable with itself,让我们考虑以下新示例:
#include <iostream>
class B
{
public:
B()
{
std::cout << "B()" << std::endl;
m = 17;
}
B(const B & o)
{
std::cout << "B(const B& o)" << std::endl;
m = o.m;
}
B & operator=(const B & o)
{
std::cout << "B & operator=(const B & o)" << std::endl;
m = o.m;
return *this;
}
int m;
};
int main()
{
B b = b;
std::cout << b.m << std::endl;
}
程序的输出是
B(const B& o)
1840828080
'b' 在这里使用未初始化,因为它在复制构造函数中用于构造自身。它导致未初始化的变量“m”,从而显示垃圾。为什么编译器在这里没有警告,'b' 未初始化使用(而 'int a = a' 产生这样的警告)。
【问题讨论】:
-
您使用的是什么编译器/平台/操作系统,大多数编译器都有会引发此类警告的标志
-
@EdChum 他的实时示例显示带有
-Wall和-Wextra的g++4.8 并没有警告它。 -
@JBL 添加
-Weffc++标志将生成:main.cpp:6:5: warning: 'B::m' should be initialized in the member initialization list [-Weffc++] -
编译器不负责报告所有情况的警告,甚至不可能。编译器只是尽力检测这些情况。
标签: c++