我有以下代码:
#include <iostream>
class Test {
public:
Test(int i) {
initialize(i);
}
void initialize(int i) {
std::cout<<"i: "<<i<<std::endl;
}
};
int main() {
Test* obj1(nullptr);
obj1 = new Test(2);
Test* obj2(nullptr);
obj2 = new Test(2);
obj2->initialize(3);
return 0;
}
当我这样编译时(GCC v11.2.0):
g++ -Wall --std=c++11 main.cpp
我看到以下警告:
main.cpp: In function ‘int main()’:
main.cpp:25:15: warning: variable ‘obj1’ set but not used [-Wunused-but-set-variable]
25 | Test* obj1(nullptr);
| ^~~~
我的问题是为什么 obj1 会发出警告,而 obj2 却做几乎相同的事情?
这里要认识到的关键是,您的代码中实际上有四个对象 - 类
Test
的两个实例和两个指针。 Test
的实例没有名称(它们是用 new
创建的),而指针有名称(obj1
和 obj2
)。
这里的警告是关于指针对象
obj1
,它仅被分配且未被使用。事实上,它在最终赋值之后指向的对象在该赋值之前已经产生了各种副作用,这一事实是不相关的。您可以删除赋值声明(但不能删除赋值中的新调用),而不会影响程序的行为或输出。
int main() {
new Test(2);
Test* obj2(nullptr);
obj2 = new Test(2);
obj2->initialize(3);
return 0;
}