0

我是 C++ 的初学者,正在尝试通过查看示例来学习它。这是一个我不完全理解其含义的类的示例定义:

class MyClass{
public:
  std::string name;
  void *data;

  MyClass(const std::string& t_name, void *t_data) : name(t_name), data(t_data) {}
};

这是我的理解: name 和 *data 是类的变量, MyClass(...) 是构造函数。: 的含义是左侧类派生自右侧类。但是,这部分代码的含义是什么:

MyClass(const std::string& t_name, void *t_data) : name(t_name), data(t_data) {}

以下是问题:

  1. 什么是“t_data”和“t_name”?它们是“数据”和“名称”的初始值吗?在这里使用 t_ 的原因是什么?
  2. 上一行中的 : 是什么意思?
  3. 该行末尾的 {} 是什么?

谢谢您的帮助。TJ

4

5 回答 5

5

什么是“t_data”和“t_name”?它们是“数据”和“名称”的初始值吗?

它们是传递给构造函数的参数。如果一个对象被创建为

MyClass thing("Fred", some_pointer);

然后,在构造函数中,t_name具有值"Fred"并且t_data具有 的值some_pointer

在这里使用 t_ 的原因是什么?

有些人喜欢对参数进行标记,以便为类成员赋予不同的名称,但除非您愿意,否则无需这样做。

上一行中的 : 是什么意思?

这标志着初始化程序列表的开始,它初始化类成员变量。以下初始化name(t_name), data(t_data)程序使用构造函数的参数初始化这些成员。

该行末尾的 {} 是什么?

那是构造函数的主体,就像一个函数主体。他们中的任何代码都将在成员初始化后运行。在这种情况下,没有其他事情可做,所以身体是空的。

于 2012-07-12T17:56:03.940 回答
4

使用初始化列表来初始化成员是一个很好的 C++ 实践。

  1. t_name, t_data 是参数名称。
    • “t_”前缀仅用于将其与名称相似的成员字段区分开来。
    • 成员正在使用类似于函数调用的语法进行初始化,但它是正确的初始化/构造,因此您应该这样考虑。
  2. 冒号表示初始化列表的开始
  3. 空大括号 {} 表示构造函数的主体(在成员初始化之后发生)为空。
于 2012-07-12T17:50:46.347 回答
2

MyClass(const std::string& t_name, void *t_data) : name(t_name), data(t_data) {}

是您的类的构造函数,您应该使用字符串和 void* 参数初始化您的类,然后使用传递的参数初始化您的类字段(名称和数据)

于 2012-07-12T17:55:24.033 回答
0

对于初学者来说,这是一个有点压缩的例子,但你问的问题很好。

1) t_data 和 t_name 是进入构造函数的参数。当您创建此类的实例时,您将执行以下操作:

MyClass * myNewClassInstance = new MyClass("My name", &myData);

现在构造函数将“我的名字”(以 std::string 形式)作为 t_name 并将指向 myData 的指针作为 t_data。

2)这里的冒号不是指派生类。 这里它说要遵循一个“初始化列表”。查看 Prashant 的答案链接,或者对此进行一些挖掘。基本上,这是将成员变量设置namet_name(这是我们在上面示例中传递给构造函数的 std::string)和datat_datavoid 指针)。(见下面的附加说明)

3) {} 是构造函数的实际定义。它是空的——这里没有代码。所以构造函数要做的就是初始化成员变量(由初始化列表定义),仅此而已。

现在让我们以更适合初学者的格式查看完全相同的课程:

// The declaration of MyClass.  This would often show up in a header (.h) file
class MyClass {
public:
  // Member variables
  std::string name;
  void * data;

  // Declaration of constructor -- we haven't defined what actually does here, just
  // what parameters it takes in.
  MyClass(const std::string& t_name, void * t_data);
}

// We declared what the class "looks like" above, but we still have to define what
// the constructor does.  This would usually show up in a .cpp file

// This is the constructor definition.  We have to specify that it's part of the
// The extra "MyClass::" specifies that it's part of the MyClass namespace that we
// declared above.
MyClass::MyClass(const std::string& t_name, void * t_data)
{
  // Set our member variables to what was passed in.
  this.name = t_name;
  this.data = t_data;
}

上面的版本做了完全相同的事情(初始化列表和构造函数中的传统初始化之间有一些细微的差异,你可能还不关心——再次,如果你好奇,请参阅其他参考资料)。

很明显,这会占用更多空间,这正是经常使用压缩程度更高的格式的原因。但是当你刚刚开始时,这样做会让事情变得更加清晰。当涉及到函数(即构造函数)时,了解声明和定义之间的区别很重要,因为您发布的示例通常在它们分开时同时进行。

于 2012-07-12T18:22:26.803 回答
0

我是 C++ 的初学者,正在尝试通过查看示例来学习它。

无论出于何种原因,这在 C++ 中比在 Perl、Python、Java 甚至 C 中更难做到。我不推荐这门课程;我不推荐这门课程。相反,您可能会投资一本好书

这是我的理解:

让我们从那个开始。我认为您并没有像您声称的那样理解。

name 和 *data 是类的变量

name,并且data是类的变量。它们的类型分别是std::stringvoid*

MyClass(...) 是构造函数。

是的。

: 的含义是左侧类派生自右侧类。

不,:在不同的情况下意味着不同的东西。在您的示例中使用它的上下文中,它表示后面有一个初始化列表。

但是,这部分代码的含义是什么:

什么是“t_data”和“t_name”?

它们是构造函数中的局部变量。具体来说,它们是函数的传入参数。

它们是“数据”和“名称”的初始值吗?

这就是它们在本示例中的使用方式。具体来说,它们被传递给初始化器列表中的dataname初始化器。

在这里使用 t_ 的原因是什么?

这纯粹是这个特定作者的约定。我以前从未见过那个大会。

上一行中的 : 是什么意思?

它引入了一个初始化列表。此构造仅在构造函数成员函数中使用。每个命名成员都由列出的值初始化。(注意:值不需要来自参数——它们可以是任何合法的表达式,所以:MyClass(int ii) : i(ii), j(cos(0) / 2), k(&global_variable) {}可能是合法的构造函数。)

该行末尾的 {} 是什么?

构造函数成员函数的主体。由于构造函数的所有工作都在初始化列表中完成,因此函数的主体是空的。

于 2012-07-12T18:24:11.630 回答