You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:21:55