C ++问题与构造函数中的函数

时间:2014-09-17 18:51:17

标签: c++

我遇到了一个非常奇怪的问题,我无法自己解决这个问题,它考虑了简单的C ++程序。

我知道我可以并且可能应该使用setFunction而不是list来初始化变量,但我这样做只是为了了解它是如何工作的。

让我向您介绍我的代码,这个代码是完全可编译的(这一个与另一个之间的区别已被标记):

#include <iostream> 
#include <string> 

using namespace std; 

class SimpleClass
{
private: 
  string name; 
public: 
  SimpleClass(string z): name(z)
  {
    string getName(z); // ***HERE WE HAVE getName() function with return type string

  }

  string getName()
  {
    return name; 
  }
}; 

int main(void)
{
   SimpleClass object("Pussycat"); 
   cout << object.getName() << endl; 
}

这个没有用,因为我没有指定函数getName()的返回类型,它曾用于返回值名称:

#include <iostream> 
#include <string> 

using namespace std; 

class SimpleClass
{
private: 
  string name; 
public: 
  SimpleClass(string z): name(z)
  {
     getName(z); // *** WITHOUT STRING TYPE BEFORE FUNCTION NAME
  }

  string getName()
  {
    return name; 
  }
}; 

int main(void)
{
   SimpleClass object("Pussycat"); 
   cout << object.getName() << endl; 
}

为什么第二个不起作用的任何想法?

3 个答案:

答案 0 :(得分:3)

在这段代码中,

SimpleClass(string z): name(z)
{
  string getName(z); // ***HERE WE HAVE getName() function with return type string
}

您有一个名为getName的函数局部变量string。它是使用z构造的并被丢弃。它与类成员函数getName无关。

在这段代码中,

SimpleClass(string z): name(z)
{
   getName(z); // *** WITHOUT STRING TYPE BEFORE FUNCTION NAME
}

您正在使用getName作为参数调用成员函数z,因为getName()没有参数,因此无法编译。

答案 1 :(得分:0)

首先,getName()不接受任何参数。你不应该在构造函数中这样调用它。

其次,为什么你甚至打电话给名字?您已使用其构造函数name(z)初始化名称。

答案 2 :(得分:0)

在构造函数体内的第一种情况下,您定义名为getName的本地对象,并使用字符串z对其进行初始化。退出构造函数后,此本地对象将被销毁

  SimpleClass(string z): name(z)
  {
    string getName(z); // ***HERE WE HAVE getName() function with return type string

  }

为此,上述代码将更加清晰,等同于

  SimpleClass(string z): name(z)
  {
    string getName = z;

  }

在第二种情况下,您调用成员函数getName并为其设置参数。但是声明该函数没有参数。查看您的声明

  SimpleClass(string z): name(z)
  {
     getName(z); // *** WITHOUT STRING TYPE BEFORE FUNCTION NAME
  }

  string getName()
  {
    return name; 
  }

如果你想要编译代码,你必须写至少像

  SimpleClass(string z): name(z)
  {
     getName();
  }

  string getName()
  {
    return name; 
  }