当前位置:  开发笔记 > 编程语言 > 正文

我可以为字段和构造函数参数使用相同的名称吗?

如何解决《我可以为字段和构造函数参数使用相同的名称吗?》经验,为你挑选了3个好方法。

是的,它是合法的,适用于所有平台.它会正确地将您的成员变量a初始化为传入的值a.

一些人认为它们更加干净,但它们的名称不同,但不是全部.我个人实际上经常使用它:)

具有相同变量名的初始化列表有效,因为初始化列表中的初始化项的语法如下:

<成员>(<值>)

你可以通过创建一个简单的程序来验证我上面写的内容:(它不会编译)

class  A
{

   A(int a)
   : a(5)//<--- try to initialize a non member variable to 5
   {
   }
};

您将收到类似于以下内容的编译错误:A没有名为"a"的字段.


在旁注:

可能不希望使用相同的成员名称作为参数名称的一个原因是您更容易出现以下情况:

class  A
{

   A(int myVarriable)
   : myVariable(myVariable)//<--- Bug, there was a typo in the parameter name, myVariable will never be initialized properly
   {
   }
   int myVariable;
};

在旁注(2):

可能希望使用相同的成员名称作为参数名称的一个原因是您不太容易出现以下情况:

class  A
{

   A(int myVariable_)
   {
     //<-- do something with _myVariable, oops _myVariable wasn't initialized yet
     ...
     _myVariable = myVariable_;
   }
   int _myVariable;
};

这也可能发生在大型初始化列表中,并且在初始化列表中初始化之前使用_myVariable.



1> Brian R. Bon..:

是的,它是合法的,适用于所有平台.它会正确地将您的成员变量a初始化为传入的值a.

一些人认为它们更加干净,但它们的名称不同,但不是全部.我个人实际上经常使用它:)

具有相同变量名的初始化列表有效,因为初始化列表中的初始化项的语法如下:

<成员>(<值>)

你可以通过创建一个简单的程序来验证我上面写的内容:(它不会编译)

class  A
{

   A(int a)
   : a(5)//<--- try to initialize a non member variable to 5
   {
   }
};

您将收到类似于以下内容的编译错误:A没有名为"a"的字段.


在旁注:

可能不希望使用相同的成员名称作为参数名称的一个原因是您更容易出现以下情况:

class  A
{

   A(int myVarriable)
   : myVariable(myVariable)//<--- Bug, there was a typo in the parameter name, myVariable will never be initialized properly
   {
   }
   int myVariable;
};

在旁注(2):

可能希望使用相同的成员名称作为参数名称的一个原因是您不太容易出现以下情况:

class  A
{

   A(int myVariable_)
   {
     //<-- do something with _myVariable, oops _myVariable wasn't initialized yet
     ...
     _myVariable = myVariable_;
   }
   int _myVariable;
};

这也可能发生在大型初始化列表中,并且在初始化列表中初始化之前使用_myVariable.


这是一个品味问题.我更喜欢给相同的东西赋予相同的名称.这就是我广泛使用命名空间的原因.

2> Dragonion..:

可能导致该主题混淆的一个原因是编译器如何对变量进行优先级排序.例如,如果其中一个构造函数参数与类成员具有相同的名称,则可以在初始化列表中编写以下内容:

MyClass(int a) : a(a)
{
}

但上面的代码是否具有与此相同的效果?

MyClass(int a)
{
    a=a;
}

答案是不.每当在构造函数体内键入"a"时,编译器将首先查找名为"a"的局部变量或构造函数参数,并且只有在找不到它时才会开始查找名为"a"的类成员. (如果没有可用的话,它将寻找一个名为"a"的全局变量,顺便说一下).结果是上面的语句"a = a"会将存储在参数"a"中的值赋给参数"a",使其成为无用的语句.

为了将参数的值赋给类成员"a",您需要通知编译器您正在引用此类实例中的值:

MyClass(int a)
{
    this->a=a;
}

很好,但如果你做了这样的事情(注意没有一个名为"a"的参数):

MyClass() : a(a)
{
}

好吧,在这种情况下,编译器首先会查找一个名为"a"的参数,当它发现没有任何参数时,它会将类成员"a"的值赋给类成员"a",这实际上什么都不做.

最后,您应该知道只能在初始化列表中为类成员分配值,因此以下内容将产生错误:

MyClass(int x) : x(100) // error: the class doesn't have a member called "x"
{
}



3> yesraaj..:

如果形式参数和成员命名相同,那么请注意在构造函数中使用此指针来使用成员变量

class C {
  T a;
public:
  C(T a): a(a) {
this->a.sort ;//correct
a.sort();//will not affect the actual member variable
}
};

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有