Eclipse CDT中变量未在构造函数初始化及程序输出异常咨询
问题分析与解决办法
嘿,我一眼就看出问题出在哪了——你在构造函数里犯了个很容易踩的小坑!
错误根源
Eclipse CDT提示的'Member x (and y) was not initialized in this constructor',还有输出的诡异数字,本质都是同一个问题:你在构造函数里重新声明了局部变量x和y,完全没碰类的成员变量!
举个例子,你的构造函数大概是这么写的:
Rectangle(int width, int height) { int x = width; // 这里的int是关键! int y = height; }
这里的int x会让编译器认为你要创建一个新的局部变量x,和类私有部分的成员变量x半毛钱关系都没有。类的成员变量x和y根本没被初始化,内存里存的是随机垃圾值,所以运行时输出了"310598136"这种奇怪的数字,同时CDT的静态检查也揪出了成员变量未初始化的问题。
两种修复方案
方案1:去掉构造函数里的变量类型声明
直接给类的成员变量赋值,不要加int:
#include <iostream> using namespace std; class Rectangle { private: int x, y; public: Rectangle(int width, int height) { x = width; // 没有int,直接操作成员变量 y = height; } void print() { cout << x << y << endl; } }; int main() { Rectangle rect(3, 4); rect.print(); return 0; }
方案2:推荐用成员初始化列表(更规范高效)
这是C++初始化成员变量的标准写法,不仅能避免局部变量覆盖的问题,还比构造函数体内赋值更高效:
#include <iostream> using namespace std; class Rectangle { private: int x, y; public: // 用初始化列表直接初始化成员变量 Rectangle(int width, int height) : x(width), y(height) {} void print() { cout << x << y << endl; } }; int main() { Rectangle rect(3, 4); rect.print(); return 0; }
额外提醒
以后写构造函数的时候,尽量优先用初始化列表,尤其是面对const成员变量或者引用类型的成员时,这是唯一的初始化方式,还能避免这类低级错误哦!
内容的提问来源于stack exchange,提问作者Joe Fanelli
相关产品推荐
相关产品推荐

