gpt4 book ai didi

C++类派生与超构造函数混淆

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:23 25 4
gpt4 key购买 nike

嘿,在教程 C++ 代码中,我发现了这个特别的困惑:

PlasmaTutorial1::PlasmaTutorial1(QObject *parent, const QVariantList &args)
: Plasma::Applet(parent, args), // <- Okay, Plasma = namespace, Applet = class
m_svg(this), // <- A member function of class "Applet"?
m_icon("document") // <- ditto?
{
m_svg.setImagePath("widgets/background");
// this will get us the standard applet background, for free!
setBackgroundHints(DefaultBackground);
resize(200, 200);
}

我不是面向对象编程的新手,所以类派生和父类(super class)并不复杂,但这里的语法让我感到困惑。

头文件定义类如下:

class PlasmaTutorial1 : public Plasma::Applet
{

与上面类似,命名空间 Plasma 和类 Applet。但是 public 在那里做什么?

我担心我已经知道这个概念,但没有掌握 C++ 语法/方法。

this问题 我发现这些被称为“超构造函数”,至少那是我内存中的内容,但我没有完全理解这一点。

如果我们回顾第一个片段,我们会看到 Constructor::Class(...) : NS::SuperClass(...),到这里为止一切正常。但是 m_svg(this), m_icon("document") 在那里做什么?这是使派生类知道这些特定函数的某种方法吗?

这部分是 C++ 基础知识还是更直接?虽然我并没有完全迷失在 C++ 中,但我对 C 感觉更自在:)

到目前为止,我完成的大多数 OOP 都是用 D、Ruby 或 Python 完成的。例如,在 D 中,我将只定义 class MyClass : MySuperClass,覆盖我需要的内容,并在需要时调用父类(super class)的构造函数。


好吧,看了一些回答,是不是……

PlasmaTutorial1::PlasmaTutorial1(QObject *parent, const QVariantList &args)
: Plasma::Applet(parent, args), // <- Call the _parent_ constructor
m_svg(this), // <- set m_svg (in the _derived_ class) to "this"
m_icon("document") // <- set m_icon (in the _derived_ class) to "document"
{
...
}

...假设正确吗?


到目前为止,测试证实了我的假设。多谢!选择一个成功的答案是一个艰难的选择,但...

最佳答案

您看到的是 initialization list . C++ FAQ Lite 鼓励他们并加快成员初始化,因为您的成员在进入构造函数之前不需要采用默认值。

关于C++类派生与超构造函数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2821439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com