为什么我可以将QObject*赋值给QObject ?
Why can I assign a QObject* to a QObject?
考虑以下代码:
#include <QObject>
class A : public QObject
{
Q_OBJECT
public:
A(QObject* parent = 0) : QObject(parent) {}
}
int main()
{
A a = new A();
return 0;
}
为什么我可以将类型为A*
的对象分配给类型为A
的变量而没有编译器(或运行时)抱怨?
在此代码中,A
的构造函数用于将和A*
转换为A
类型的对象,而不是赋值给。一般情况下,允许编译器隐式地使用匹配构造函数作为转换操作符,因此以下代码是合法的:
struct B
{
B(int i){}
}
int main()
{
B b = 5;
return 0;
}
在问题的代码中,由new
运算符得到的未命名的A*
用作A
的构造函数的parent
实参。这是允许的,因为A
是从QObject
派生的(因此匹配参数列表)。然而,这显然是不希望出现的行为,因为a
不是new
返回的对象,而是A
类型的父对象。(另外,new
'ed对象永远不会是delete
' d,从而导致内存泄漏。)
为了防止这种微妙的错误,通常建议将QObject
派生类的构造函数设置为explicit
,以防止编译器将其误用为转换操作符。(这也适用于类似的情况,而不仅仅是Qt。)使用以下修改后的代码,编译器将捕获错误:
class A : public QObject
{
Q_OBJECT
public:
explicit A(QObject* parent = 0) : QObject(parent) {}
}
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- cin >> int 给定一个字符串将 int 赋值为 0
- if 子句中的赋值不起作用
- 为什么我可以将QObject*赋值给QObject ?