首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将默认值分配给通过引用传递的参数

将默认值分配给通过引用传递的参数
EN

Stack Overflow用户
提问于 2012-02-09 05:34:19
回答 3查看 2.4K关注 0票数 1

我想做这样的事:

代码语言:javascript
运行
复制
int displayAll(Message *m, string &lastIndex, int &NumPrinted = 0 );

它给我带来了错误,把int转换成int&。

我也试过这个:

代码语言:javascript
运行
复制
int temp =0;

int displayAll(Message *m, string &lastIndex, int &NumPrinted = temp );

尽管如此,它还是会产生以下错误:

代码语言:javascript
运行
复制
error: ISO C++ forbids in-class initialization of non-const static member 'temp'

即使static int temp; 也会出错。

错误: ISO C++禁止非const静态成员“temp”的类内初始化。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-09 05:49:07

您提到的第一行代码的问题是,您正在尝试传递对临时变量的引用。

代码语言:javascript
运行
复制
class Foo {

    int displayAll(Message *m, bool &moreElements, string &lastIndex, int &NumPrinted = 0 );

};

第二段代码抱怨是因为您试图静态地初始化一个类成员。

代码语言:javascript
运行
复制
class Foo {

    int temp =0;

    int displayAll(Message *m, bool &moreElements, string &lastIndex, int &NumPrinted = temp );

};

(我正在将您的代码放入类声明中,以清楚所发生的事情)。

一个不引入静态变量的解决问题的简单方法是显式函数重载:

代码语言:javascript
运行
复制
class Foo {

    inline int displayAll(Message *m, bool &moreElements, string &lastIndex) {
        int dummy = 0;
        return displayAll(m, moreElements, lastIndex, dummy);
    }
    int displayAll(Message *m, bool &moreElements, string &lastIndex, int &NumPrinted);

};

有一些样板,但它实现了你想要的。希望这能有所帮助。

编辑:更多的澄清。问题的核心是函数必须引用它可以修改的内存这一事实。如果您传递它为一个临时变量(在术语的C++意义上是临时的,而不仅仅是英语语言术语)(就像在您的第一行代码中那样),它是非法的C++,因为在使用它作为函数的参数之前,通常会将一个临时变量复制到一个值:

代码语言:javascript
运行
复制
void bar( int someNum = 0 ); // think of this as creating a temporary rvalue 0
                             // and then copying it into the function for use.

// temporary rvalues arise in expressions like
int v = 5 + 5; // the result of 5 + 5 is stored in a temporary rvalue, and then
               // copied into v (which is an lvalue in this case).

所以我们需要一个"lvalue",或者某个全局变量,或者一个临时局部变量(在英语意义上),就像我在我的答案中所给出的那样。我正要使用静态变量编写一个解决方案,但存在一个很大的缺陷--因为静态变量将由类的所有实例共享,所以它将从0开始,然后在每次调用该方法时都会有所不同(因为之前的调用会对它进行修改)。更糟糕的是,在多个线程的情况下,您将从多个处理器读取/写入相同的内存位置,因此该值将是完全的垃圾,并且当每次写入将使每个其他内核的缓存失效时,您就会对处理器内核的缓存产生不良影响。太丑了,请别这么做。:P

通过使用我的第一个解决方案,您可以使临时变量非常本地,而不会对其他任何东西产生太大影响。

票数 1
EN

Stack Overflow用户

发布于 2012-02-09 05:40:19

除非您将temp声明为static:请参阅this堆栈溢出帖子,否则不能对非const引用执行此操作。

票数 0
EN

Stack Overflow用户

发布于 2012-02-09 07:09:07

我也想出了一种有趣的方法来实现这个目标:

代码语言:javascript
运行
复制
class demo {
public:
        void displayAll(int &x, int y = 0 ) {
            int *p;
            if(y)
                p = (int*)y;
            if(p) *p = 10;

        x = 4;
    }
};


int main() {
    int x=0, y=0;
    demo *obj = new demo();
    obj->displayAll((x);
    //obj->temp(x,(int)&y);
    cout << "\n x= " << x << " y " << y;
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9205893

复制
相关文章

相似问题

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