首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不能将非静态数据成员用作默认参数?

为什么不能将非静态数据成员用作默认参数?
EN

Stack Overflow用户
提问于 2021-10-20 09:34:01
回答 1查看 64关注 0票数 1

“C++ Primer”一书第7.6章指出:

非静态数据成员不能用作默认参数,因为它的值是它所属对象的一部分。使用非静态数据成员作为默认参数不提供从其中获取成员值的对象,因此是错误的。

成员函数可以访问类成员,那么当成员函数使用默认参数时,为什么会出现问题呢?

EN

回答 1

Stack Overflow用户

发布于 2021-10-20 09:38:17

简单的回答是:没有先验的理由可以解释为什么它是不可能的,但是在C++中没有机制(至少不是直接的)。

默认参数将在调用站点中替换。例如

代码语言:javascript
运行
复制
void foo(int x = 42);

然后

代码语言:javascript
运行
复制
foo();

实际上是

代码语言:javascript
运行
复制
foo(42);

对于非静态成员,这是行不通的:

代码语言:javascript
运行
复制
struct bar {
    int y;
    void moo(int x = y);
};

bar b;
b.moo(); // -> b.moo(y) ?!?

默认参数在调用站点被替换,这不一定在类的范围内。在类的作用域之外,您需要一个实例来访问一个成员。

当然,可以有规则使它工作,但C++只是说你不能这样做。但是,您不需要它,因为有一个简单的解决方法:

代码语言:javascript
运行
复制
struct bar {
    int y;      
    void moo(int x);
    void moo() { moo(y); }
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69643587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档