我遇到了一个非常奇怪的问题,我无法自己解决这个问题,它考虑了简单的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;
}
为什么第二个不起作用的任何想法?
答案 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;
}