为何main中指针pTwo获取Dog对象时age返回0而非19?Getage()是否合规?
Dog类GetAge()返回值异常的问题排查与解答
嘿,先给你吃颗定心丸:你的GetAge()本身是完全合法的成员函数,问题根本不在它身上——大概率是你带参数的构造函数实现出了纰漏,没正确给成员变量age赋值!
核心问题:构造函数的变量名冲突或未初始化
你声明了带参数的构造函数Dog(std::string dogName, int age);,但如果实现的时候没处理好参数和成员变量的关系,就会导致成员age没被正确设置,最终返回默认值0(而名字正常是因为你正确处理了aDogName)。
举个典型的错误例子:
// 错误的构造函数实现 Dog::Dog(std::string dogName, int age) { aDogName = dogName; age = age; // 这里完全无效!参数名和成员变量名重名了,相当于自己赋值给自己 }
这里的age参数和成员变量age同名,编译器会优先识别成参数,所以这行代码根本没修改到类里的age成员,它会保持默认初始化的0值。
几种修复方案
1. 用this->区分成员变量和参数
明确告诉编译器你要操作的是类的成员变量:
Dog::Dog(std::string dogName, int age) { aDogName = dogName; this->age = age; // this->age指向类成员,右边的age是传入的参数 }
2. 使用初始化列表(推荐的C++写法)
初始化列表是C++中初始化成员变量的标准方式,能避免变量名冲突,效率也更高:
Dog::Dog(std::string dogName, int age) : aDogName(dogName), age(age) { // 这里不需要额外写赋值语句,初始化列表直接完成成员变量的初始化 }
3. 修改参数名,避免冲突
给参数换个不会和成员变量重名的名字,比如initAge:
Dog::Dog(std::string dogName, int initAge) { aDogName = dogName; age = initAge; }
再确认GetAge()的写法
确保你的GetAge()是这样写的(建议加const,因为它不修改对象状态):
// 类的public部分声明 int GetAge() const; // 源文件实现 int Dog::GetAge() const { return this->age; }
这种写法完全合法,只要构造函数正确初始化了age,它就能返回你设置的19。
内容的提问来源于stack exchange,提问作者ejjm
相关产品推荐
相关产品推荐

