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

C++默认构造函数创建对象时如何为成员变量赋默认值

问题根本原因

你遇到的报错并非默认构造函数无法给x赋值,而是写法触发了C++的「最令人头疼的解析」规则:foo ex2();不会被编译器识别为「调用默认构造函数创建foo类对象ex2」,而是会被识别为声明一个返回值为foo类型、无入参的函数ex2,后续你尝试访问ex2.y、ex2.x自然会报错。

修复方案

方案1:调整默认构造对象的声明写法

直接去掉foo ex2()的空括号,写成foo ex2;即可,此时会自动调用你已经写好的无参构造函数,x会被默认赋值为1,完全符合需求。

修正后的main函数代码:

int main()
{
    foo ex1(1);
    foo ex2; // 去掉括号,正确调用默认构造函数

    std::cout << ex1.y << "\t" << ex1.x << "\n";
    std::cout << ex2.y << "\t" << ex2.x << "\n";
    std::cin.get();
    return 0;
}

运行后输出为:

0	1
1	1

完全符合预期。

方案2:合并构造函数简化代码(可选优化)

如果希望进一步简化代码,可以用C++的默认参数特性,把两个构造函数合并为一个,不用单独写无参构造:

class foo {
public:
    int y;
    int x;
    static int counter;

    // 带默认参数的构造函数,不传参时xi默认值为1
    foo(int xi = 1) 
    {
        y = counter;
        counter++;
        x = xi;
    };
};

这种写法下,foo ex2;会自动使用默认值1初始化x,foo ex1(2)则使用传入的2初始化x,效果和之前两个构造函数完全一致,代码更简洁。

内容的提问来源于stack exchange,提问作者Finn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:24:03