如果变量名称不跟在 char* 后面,const char* 是否有效?



我有一个赋值,其中我们得到了一个名为Mystring的不完整类,目标是实现C++字符串类的所有功能。

好吧,一些函数声明和定义const char*为参数,但没有变量名称跟随,我没有从中得到任何编译器错误。

我的问题是:如果这是一个有效的参数,它意味着什么?如果它无效,为什么它不会生成错误? 以下是使用它的示例:

bool operator==(const Mystring&, const char *);
Mystring& operator=(const char * );

我应该实现这些函数,但我无法围绕这个看似不完整的参数。

参数名称不是必需的。 这只是C++语法的一个怪癖。 如果拒绝在函数定义中为参数命名,则无法访问其值。

相关:为什么函数原型在不需要参数名称时包含参数名称?

bool operator==(const Mystring&, const char *);行只是一个声明。 它告诉编译器此函数采用 2 个类型const Mystring&const char*的参数。此时编译器不需要确切的变量名称。

在.cpp要定义函数的文件中,必须提供变量名称,就像在逻辑中使用变量名称一样。编译器将编译此代码并使用此代码生成可执行文件。

bool operator==(const Mystring& str, const char* subStr)
{
//Logic here which uses variable str and subStr
}

你拥有的语法(没有主体的函数(是一个函数声明。它只是说有一个稍后将定义或链接的函数,该函数具有布尔返回类型和给定类型的两个参数,按该顺序排列;此时,名称无关紧要。此函数声明也是在人类的任务规范中指定输入和输出的便捷方法。这在 C++ 和 C 中都有效。

具体来说,C++,您甚至可以从函数定义(带有主体的函数(中省略参数名称。正如其他人所说,这是合法的,您只是无法访问此类参数。在 C 中不允许这样做。

当你根据任务实现你的函数时,几乎可以肯定你会想要插入名称;它们是什么将取决于你。

欢迎来到 Stack Overflow,Nate!

您为我们提供的行实际上是一个函数声明。这用于在实际定义主体之前声明函数的签名:

// Function declaration
bool operator==(const MyString&, const char*);
// Function that uses operator==
int main()
{
MyString str = new MyString();
char* ptr = nullptr;
if (str == ptr)
{
...
}
}
// Function definition
bool operator==(const MyString& left, const char* right)
{
...
}

如果这是一个有效的 [正式] 参数,它是什么意思?

是的。。。未命名的 [formal] 参数至少在两个方面是有效和有用的。

1( 调用代码可以提供 [实际] 参数,即使 [formal] 参数未命名。 这不需要实现使用它,并且是避免某些特定警告的常用方法。

例:

int main (int, char**) {  return foo();  }
int main (int argc, char* argv[]) { return foo(argc, argv); }

两者都是有效的实现。 首先,foo对参数没有用处,通过不命名它们,编译器不会生成有关"未使用的参数"的警告。是的,运行时始终显示一个 argc,但当 shell 找不到参数时,它将为 0。 请注意,在第一个示例中,将提供 int(对于 argc((值 0 表示数组没有(,并且 foo(( 的调用永远不会引用它。

2(函数参数有助于函数的"签名"。

Mystring& foo(const char * ); // 1
Mystring& foo();              // 2
Mystring& foo(const int&  );  // 3

3 foo(...('s 是唯一的。 这允许编译器选择最佳匹配项(或生成调用与任何版本都不匹配的错误(,并允许链接器查找 foo(( 的适当实现。

如果它无效,为什么它不会生成错误?

[形式]和[实际]函数参数一直是语言的一部分,即它们是有效的。所以没有错误。 如果您不记得它们,则应查看该主题。

最新更新