请解释这个似乎不完整或缺少赋值的 C++ 语法?
Posted
技术标签:
【中文标题】请解释这个似乎不完整或缺少赋值的 C++ 语法?【英文标题】:Please explain this C++ syntax which seems to be incomplete or lacks assignment? 【发布时间】:2011-10-21 02:33:06 【问题描述】:reply_form::reply_form()
using cppcms::locale::translate;
author.message(translate("Author"));
comment.message(translate("Comment"));
send.value(translate("Send"));
*this + author + comment + send;
author.limits(1,64);
comment.limits(1,256);
在给定的构造函数定义中,请有人解释此语法的含义或其预期用途和好处:
*this + author + comment + send;
对我来说,似乎是在没有将其分配给任何东西的情况下完成的串联/加法,这真的让我很困惑,因为我无法理解它的目的。
我已经在网络上很好地搜索了这个问题,但可能我没有使用正确的术语来搜索它,因为我不知道这种语法到底是什么。
我觉得它好像是最新 C++1x 功能的一部分,但不确定,所以找不到合适的书。最后选择***进行救援:-)
编辑:
我能提供的最相关的是它在头文件中的声明,即:
struct reply_form : public cppcms::form
cppcms::widgets::text author;
cppcms::widgets::textarea comment;
cppcms::widgets::submit send;
reply_form();
;
EDIT2:Revision2(检查cmets后再次更正)
好的,我能够回溯 operator+ 的东西,并找出它的重载方式:
inline form &operator + (form &f)
add(f);
return *this;
这就是运算符重载的情况。感谢您的回答。我最近迁移到 C++ 并发现了一些奇怪的事情,正如我在此线程中发布的那样: Explain blank class functions in C++ 在我看来是带有空白主体的多功能列表,但后来我将其理解为一种语法和一种声明变量或调用基类构造函数的方式。
感谢您的回答,真的很有帮助,而且非常快!
【问题讨论】:
好吧,reply_form::operator+ (...)
是如何定义的,它有什么重载,它有什么作用?只有你能回答这个问题,你有代码......
Edit 2 中的重载与您想知道的行无关。 a + b
和 a++
是不同的运算符。
"但后来我把它理解为一种语法和一种声明变量或调用基类构造函数的方式" 不。这是一种初始化数据成员的方式,或者 显式 调用基本构造函数(而不是隐式不带参数调用)。
【参考方案1】:
由于我们不知道reply_form
是什么,所以这个问题无法完整回答。您的问题更多是关于程序而不是 C++。
如果reply_form::operator+
有副作用,那么*this + author + comment + send;
行可以有副作用。
但通常情况下,它不会(因为它不具有直观意义,正如您所发现的那样)。所以,要么这是类设计中的错误,要么该行应该是 *this += author + comment + send;
之类的内容。
【讨论】:
【参考方案2】:很可能是一个流利的运算符被覆盖以将字段添加到reply_form
。例如。
reply_form& reply_form::operator+ (const field& value)
this->add_field (value);
return *this;
【讨论】:
附言。这将是一个令人震惊的设计。 同意。这就是为什么所有语言设计者在意识到运算符重载会导致什么之后都回避它的原因......'你是什么意思operator ->()
调用 FireMissile()?`
:) 它仍然非常强大、有效且直观。它只需要正确使用,就像其他一切一样。
没有人在他理智的头脑中写出变异的operator+
,这就是operator+=
的用途。
@Remus:这与运算符重载无关。这只是糟糕的设计......'DrawCicle() 调用 FireMissile() 是什么意思?'【参考方案3】:
由于在 C++ 中,几乎所有运算符都可以重载,这可能意味着任何事情。实际上,有问题的行是对函数operator+
的一系列嵌套调用:
operator+(operator+(operator+(*this, author), comment), send);
您需要查看reply_form
类如何重载operator+
。
【讨论】:
【参考方案4】:小事:
这段代码
reply_form::reply_form()
using cppcms::locale::translate;
author.message(translate("Author"));
comment.message(translate("Comment"));
send.value(translate("Send"));
*this + author + comment + send;
author.limits(1,64);
comment.limits(1,256);
可以而且应该写成:
reply_form::reply_form()
using cppcms::locale::translate;
author.message(translate("Author"));
author.limits(1,64);
comment.message(translate("Comment"));
comment.limits(1,256);
send.value(translate("Send"));
add(author);
add(comment);
add(send);
实际上新代码应该使用这个更详细但更清晰的 API。
operator+
保留用于向后兼容并用于
在一些不是最新的例子中。
【讨论】:
哦,感谢artyom的澄清,现在看起来很简单! :)【参考方案5】:例如,
reply_form& operator+(reply_form& lValue,const reply_form& rValue);
在这种情况下可以正常工作。
【讨论】:
以上是关于请解释这个似乎不完整或缺少赋值的 C++ 语法?的主要内容,如果未能解决你的问题,请参考以下文章