对于初学者来说,这是一个有点压缩的例子,但你问的问题很好。
1) t_data 和 t_name 是进入构造函数的参数。当您创建此类的实例时,您将执行以下操作:
MyClass * myNewClassInstance = new MyClass("My name", &myData);
现在构造函数将“我的名字”(以 std::string 形式)作为 t_name 并将指向 myData 的指针作为 t_data。
2)这里的冒号不是指派生类。 这里它说要遵循一个“初始化列表”。查看 Prashant 的答案链接,或者对此进行一些挖掘。基本上,这是将成员变量设置name
为t_name
(这是我们在上面示例中传递给构造函数的 std::string)和data
(t_data
void 指针)。(见下面的附加说明)
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;
}
上面的版本做了完全相同的事情(初始化列表和构造函数中的传统初始化之间有一些细微的差异,你可能还不关心——再次,如果你好奇,请参阅其他参考资料)。
很明显,这会占用更多空间,这正是经常使用压缩程度更高的格式的原因。但是当你刚刚开始时,这样做会让事情变得更加清晰。当涉及到函数(即构造函数)时,了解声明和定义之间的区别很重要,因为您发布的示例通常在它们分开时同时进行。