SDL2.0 C++:向构造函数传递对象时的语法困惑
拆解SDL 2.0渲染代码中rect构造函数的语法逻辑
嘿,我来帮你把这个构造函数的逻辑掰碎了讲清楚——其实这核心是C++的继承机制和构造函数初始化列表的知识点,和SDL本身关联不大,但刚好在你的渲染代码里用上了,咱们一步步来:
首先先确认一个前提:你的rect类肯定是继承自Window类的,对吧?不然这个Window(window)的写法就完全说不通啦。
先看你写的构造函数代码:
rect::rect(const Window &window, int otherValues):Window(window), _memberValues(otherValues)
冒号:后面的部分就是构造函数初始化列表,这是C++里初始化类成员和基类的标准方式,咱们拆成两部分看:
1. Window(window):初始化基类部分
这行代码的意思是:调用基类Window的拷贝构造函数,把你传入的window对象的状态,完整拷贝一份作为rect对象的基类部分。
为什么要这么做?
- 因为当你创建一个派生类(这里就是rect)的对象时,程序必须先初始化它的基类(Window)部分,这是C++继承的规则。
- 如果你的
Window类没有默认构造函数(比如SDL的窗口类通常不会给默认构造,因为窗口需要关联实际的系统资源),那你必须在派生类的构造函数初始化列表里显式调用基类的某个构造函数,不然编译器会直接报错。
2. _memberValues(otherValues):初始化派生类自身成员
这部分就简单了,就是直接把你传入的otherValues赋值给rect类自己的成员变量_memberValues。
为什么要用初始化列表,而不是在构造函数体内赋值?
举个对比的例子,如果你这么写:
rect::rect(const Window &window, int otherValues) { Window(window); // 这行根本不对,基类初始化必须在列表里 _memberValues = otherValues; }
首先基类的初始化在函数体内这么写是无效的,编译器会报错;其次,就算是成员变量_memberValues,在函数体内赋值的话,它会先被默认构造(如果是有默认构造的类型),然后再被赋值,效率比初始化列表的直接初始化要低——初始化列表是一步到位,直接给变量分配内存并赋值。
最后给你补个极简的代码例子,方便你对应理解:
// 假设Window类的大致结构(SDL的Window类逻辑类似) class Window { public: // 禁用默认构造,必须通过拷贝或其他方式初始化 Window() = delete; Window(const Window& other) { // 拷贝other的窗口句柄、尺寸、渲染器关联状态等 } }; // rect类继承自Window class rect : public Window { private: int _memberValues; // 你定义的待渲染矩形相关参数 public: // 构造函数用初始化列表完成基类和自身成员的初始化 rect(const Window &window, int otherValues):Window(window), _memberValues(otherValues) {} }; // 创建对象时的调用 rect ro(window, 100);
当你执行rect ro(window, 100)时,程序的执行顺序是:
- 调用
Window(window)初始化基类Window的部分 - 初始化
_memberValues为100 - 进入rect构造函数的函数体(如果你的构造函数里有代码的话)
内容的提问来源于stack exchange,提问作者user8940323
相关产品推荐
相关产品推荐

