我是一个相当新的C ++程序员,我想在类声明中听到支持和反对命名参数的参数。
以下是一个例子:
Student.h
#ifndef STUDENT_H_
#define STUDENT_H_
#include <string>
using namespace std;
class Student
{
private:
string name;
unsigned int age;
float height, GPA;
public:
Student(string, unsigned int, float, float);
void setAge(unsigned int);
};
#endif /*STUDENT_H_*/
VS
#ifndef STUDENT_H_
#define STUDENT_H_
#include <string>
class Student
{
private:
string name;
unsigned int age;
float height, GPA;
public:
Student(string name, unsigned int age, float height, float GPA);
void setAge(unsigned int age);
};
#endif /*STUDENT_H_*/
Student.cpp
#include "Student.h"
Student::Student( string name,
unsigned int age,
float height,
float GPA) :
name(name),
age(age),
height(height),
GPA(GPA) {}
void Student::setAge(unsigned int age) { this -> age = age; }
我无法决定。一方面,我觉得在声明( .h )和定义( .cpp )中命名变量是多余的。特别是因为您不得不担心在两个地方更新名称以便它们匹配。另一方面,没有名称,通过查看声明来确定参数对应的变量通常会令人困惑。
那么,你有什么想法?
答案 0 :(得分:19)
在声明中使用参数名称要好得多,并使用好的参数名称。这样,它们就可以作为功能文档。否则,您将不得不在标题中写下额外的注释,使用好的参数/变量名称总是比使用注释更好。
异常:当函数由于外部原因必须具有某个签名时,但实际上并未使用这些参数。在这种情况下,您不应该在实现中为它们命名。
答案 1 :(得分:4)
将名字放在两个地方,清晰度是你在两个地方维护签名的任务的奖励。
答案 2 :(得分:3)
智能感知/自动完成/开发环境中的任何类似内容通常只能看到声明,并且只会将其显示为自动完成。因此,如果您未在声明中声明名称,则用户不会在自动填充中看到它们,除非他们去阅读源代码。这可能是可以忍受的,但不是很方便。
答案 3 :(得分:1)
即使多余,我发现最好在两个地方都有参数名称。这通常是因为更改参数名称通常会产生语义后果。在标题中遗漏它有助于搞砸文档(这是我倾向于放置大部分注释的地方,即API规范),并且在实现中遗漏它有助于我忘记为什么特定参数具有如此奇怪的名称。
我放弃参数名称的唯一一次是我必须实现第三方库回调并且我没有使用其中一个参数。即便如此,我也会这样做:
my_callback(int idx, Context* /*ctx*/) { ...
这样我就能很好地了解签名。
答案 4 :(得分:0)
如果您将代码作为库发布,并附带相关的.h文件,您的用户将永远不会看到定义,只会看到声明,给自己增加额外的文档负担。
答案 5 :(得分:0)
一方面,我觉得它是 冗余以命名变量 声明(.h)和 定义(.cpp)。特别是从 你不得不担心更新 这两个地方的名字都是这样的 匹配。
您不需要名称与字面匹配。指定接口的头文件有点像不完美的契约(不完美,因为它不包含前置条件和后置条件,除非你在注释中写下它们)和“调用者指南”。在99%的情况下,类的调用者想知道 的参数是什么。至少让他知道发生了什么。因此,您必须选择对调用者有意义的参数名称。这不需要与cpp中的名称相同。然而,这并不重要,因为我习惯于首先从.h复制/过去函数签名到.cpp。对我来说,用C ++编程意味着这个手册部分。
另一方面,没有名字,它 通常可能会混淆确定 参数有什么变量 只是看着对应 声明。
那是好手。
答案 6 :(得分:0)
我认为这取决于您的变量类型的描述性。如果您的方法签名包含用于多种用途的类型,那么它很有用:
double calculateTax(int, string);
如果类型是描述性的,那么包含名称是多余的。
Money calculateTax(Order, State);
我不想将名称保存在两个文件中。
答案 7 :(得分:-1)
是的,没有必要在.h文件中命名参数。头文件应该代表一个接口,因此不需要有不必要的细节。
HTH