我有一个分配给我们的名为Mystring
的不完整类,目的是实现C ++字符串类的所有功能。
好吧,一些函数声明和定义都以const char*
作为参数,但是没有变量名,因此我没有得到任何编译器错误。
我的问题是:如果这是一个有效的参数,那意味着什么?如果无效,为什么不生成错误?以下是使用示例:
bool operator==(const Mystring&, const char *);
Mystring& operator=(const char * );
我应该实现这些功能,但是我无法绕过这个看似不完整的参数。
答案 0 :(得分:1)
不需要参数名称。这只是C ++语法的怪癖。如果您拒绝在函数定义中为参数指定名称,则将无法访问其值。
相关:Why do function prototypes include parameter names when they're not required?
答案 1 :(得分:0)
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
}
答案 2 :(得分:0)
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)
{
...
}
答案 3 :(得分:0)
您使用的语法(无主体的函数)是函数声明。它只是说有一个稍后将要定义或链接的函数,该函数具有布尔返回类型和两个给定类型的参数,顺序是:此时的名称无关紧要。此函数声明也是在人类任务规范中指定输入和输出的便捷方法。这适用于C ++和C。
特别是在C ++中,甚至可以从函数定义(函数 with 为主体)中省略参数名称。正如其他人所说,这是合法的,您只是无法访问此类参数。在C中是不允许的。
根据任务实现功能时,几乎可以确定要插入名称。它们是什么取决于您。
答案 4 :(得分:0)
如果这是有效的[formal]参数,这意味着什么?
是的……未命名的[formal]参数有效且至少在两种方面有用。
1)调用代码可以提供[actual]参数,即使[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(...)是唯一的。这样,编译器就可以选择最佳匹配项(或生成一个调用与任何版本都不匹配的错误),并允许链接程序找到foo()的适当实现。
如果无效,为什么不生成错误?
[formal]和[actual]函数参数始终是语言的一部分,即它们是有效的。因此没有错误。如果您不记得他们,则应查看该主题。