【问题标题】:New to c++, can you explain this constructor syntax?c++新手,你能解释一下这个构造函数语法吗?
【发布时间】:2013-06-12 01:21:29
【问题描述】:

这可能是非常基本的,但是对于来自 .Net 背景的我来说,语法看起来有点陌生。我正在尝试学习 c++ 来做一些爱好游戏开发,我在教程中遇到了这一行:

sf::RenderWindow window(sf::VideoMode(800, 600), "My Game");

对我来说,这看起来像 RenderWindow 可能是 sf 类的静态方法,而 window 是实例名称?我无法弄清楚这一点或想出适合谷歌的搜索词。谁能帮我打破这条线?

另外,请随意重命名标题,我不知道如何描述这一行,所以我无法想出一个描述性的标题。

【问题讨论】:

    标签: c++


    【解决方案1】:
      sf::RenderWindow window(sf::VideoMode(800, 600), "My Game");
    

    它创建了一个sf::RenderWindow的对象,对象的名字是window。它将通过将以下参数传递给sf::RenderWindow 的构造函数来初始化window

    第一个参数:

     sf::VideoMode(800, 600)
    

    sf::VideoMode的对象,根据sf::VideoModerefrence由sf类对应的构造函数/静态函数初始化;

    VideoMode 定义了视频模式(宽度、高度、bpp、频率),并提供静态函数来获取显示设备支持的模式

    第二个参数:

     "My Game"
    

    是一个字符串,大概意思是窗口的标题(我猜),你可能需要了解VideoMode这个类是如何定义的。

    【讨论】:

    • 谢谢,这是在 c++ 中构造对象的正常方式吗?我习惯于看到类似 Type myType = new Type("whatever");如果它是一种不寻常的构造对象的方式,是否有它的名称以便我可以更轻松地查找它?
    • @Justin984,您可以使用new 将对象放入堆中,或者使用此语法将对象放入堆栈中。这就是本质的区别。这并不罕见。
    • @Justin984 是的,这是在 C++ 中构造对象的正常方式。这只是标准的方法。大概你可以搜索调用构造函数来创建对象?
    • 根据我的经验,这是正常的方式,除非你正在做一个指针:Type * myType = new Type(...)。我不知道这种语法的任何名称,但另一种只是新语法; aka - “使用 new 创建类实例”
    • 实际上 - 非常重要,这个区别 - new 从堆中分配内存,而不是从堆栈中分配。堆上的对象作用域关闭时不会被删除,这会导致内存泄漏。规则:不输入“delete”就不要输入“new”
    【解决方案2】:

    该行声明并初始化了一个名为 window 的变量,类型为 sf::RenderWindow

    C++中的类型有构造函数,构造函数可以在创建变量时调用,例如这将创建一个名为 x 的整数并将其初始化为值 3

    int x(3);
    

    被调用的sf::RenderWindow 类的构造函数接受sf::VideoModestring 类型的变量。传递的第一个参数sf::VideoMode(800, 600) 是创建sf::VideoMode 类型的新实例并将其传递给函数的简写。相当于:

    sf::VideoMode mode(800, 600);
    sf::RenderWindow window(mode, "My Game");
    

    注意xy的区别如下:

    Type x(3);
    Type* y = new Type(3);
    

    x分配在栈上,而y分配在堆上。由于x 在堆栈上,因此当变量超出范围时,它将被解除分配(并且将调用 Type 类型的析构函数)。 y 将一直存在,直到您致电 delete

    【讨论】:

      【解决方案3】:

      我能看到的两件事。

      sf 是类,RenderWindow 是静态类,VideoMode 是类中的成员函数,或者sf 是命名空间,它们是命名空间中的类和/或方法。如果是我的钱,我可能会选择命名空间的概念。

      【讨论】:

        【解决方案4】:

        大概……

        sf::RenderWindow 是一个类型,它是来自sf 命名空间的RenderWindow

        window 是您在此处声明的sf::RenderWindow 类型变量的名称,在() 之间有用于构建window 对象的构造函数的参数,最后一个是常量,第一个是sf::VideoMode(800, 600)返回的值。

        【讨论】:

          【解决方案5】:

          sf 可以是命名空间或类

          RenderWindow 是函数 window() 返回的类型

          VideoMode 是 VideoMode 类的构造函数(或者有一点机会成为 sf 中的函数)

          【讨论】:

          • 我不认为window是一个函数,我认为window是一个RenderWindow实例
          • 啊,你没看错,window大概是在这里构造实例吧。
          • RenderWindowVideoMode 都是 sf 命名空间中的类,是 SFML 库的一部分。
          【解决方案6】:

          您指出的是对名为 window 的静态函数的调用。

          电话:

          sf::RenderWindow window(sf::VideoMode(800, 600), "My Game");
          

          返回类型为sf::RenderWindow,该函数接受两个参数,sf::VideoMode(800, 600) 和一个文字字符串"My Game"

          【讨论】:

          • 不是静态函数,是变量声明。
          • 然而,sf:VideoMode(800, 600) 是一个静态函数。
          • @Narfanator:确实不是。这一行没有调用静态方法,只有构造函数。 sf::VideoMode()VideoMode 类型的 temporary 对象的声明,将 800 和 600 作为构造函数参数传递。 RenderWindowVideoModesf namespace 中都是 classes。
          • @greyfade 你说得对,先生。好吧,部分——仅从用法来看,sf::VideoMode(...) 也可能是命名空间中的一个函数。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-21
          • 2023-03-15
          • 2015-11-27
          • 1970-01-01
          • 2016-12-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多