Qt中的赋值运算符没有重载是怎么实现初始化的?

newboy686 2019-05-21 09:25:13
今天,在写代码的时候,参考了一些Qt自带的例程,发现了好几处某个类的实例在用赋值运算符(=)进行初始化,可是查看帮助没有发现有对应类型的重载函数,例如:QBrush的初始化函数包括以下的构造函数和赋值运算符重载函数。

QBrush();
QBrush(Qt::BrushStyle style);
QBrush(const QColor & color, Qt::BrushStyle style = Qt::SolidPattern);
QBrush(Qt::GlobalColor color, Qt::BrushStyle style = Qt::SolidPattern);
QBrush(const QColor & color, const QPixmap & pixmap);
QBrush(Qt::GlobalColor color, const QPixmap & pixmap);
QBrush(const QPixmap & pixmap);
QBrush(const QImage & image);
QBrush(const QBrush & other);
QBrush(const QGradient & gradient);
QBrush & operator=(const QBrush & brush);
QBrush & operator=(QBrush && other);

但是,在Qt自带的例程中可以看到下面的用法,是我自己简化出来的,但是可以编译、运行。

QBrush brush = Qt::blue;
qDebug() << brush;

经过调试,输出结果为:
QBrush(QColor(ARGB 1, 0, 0, 1) , SolidPattern )

请问:这是怎么一个初始化原理呢?
...全文
323 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdghchj 2019-05-22
  • 打赏
  • 举报
回复
变量声明后面用的=表示隐式调用拷贝构造函数进行初始化,但会被编译器省略。

#include<iostream>
using namespace std;
class A{
public:
    A(int a){
        cout<<"A(int a)"<<endl;
    }
    A(const A&){
        cout<<"A(const A&)"<<endl;
    }
private:
    A& operator=(const A&){
    }
};

int main()
{
    A a(1); //直接显示调用A(int)
    A b(A(1)); //先显示调用A(int),再显式调用A(const A&),编译器优化省略掉A(const A&)的调用,最后只调用A(int)
    A c = A(1); //先显示调用A(int),再隐式调用A(const A&),编译器优化省略掉A(const A&)的调用,最后只调用A(int)
    A d = 1; //先隐示调用A(int),再隐式调用A(const A&),编译器优化省略掉A(const A&)的调用,最后只调用A(int)
    return 0;
}


#include<iostream>
using namespace std;
class A{
public:
    explicit A(int a){ //必须显示调用
        cout<<"A(int a)"<<endl;
    }
    A(const A&){
        cout<<"A(const A&)"<<endl;
    }
private:
    A& operator=(const A&){
    }
};

int main()
{
    A a(1); //直接显示调用A(int)
    A b(A(1)); //先显示调用A(int),再显式调用A(const A&),编译器优化省略掉A(const A&)的调用,最后只调用A(int)
    A c = A(1); //先显示调用A(int),再隐式调用A(const A&),编译器优化省略掉A(const A&)的调用,最后只调用A(int)
    A d = 1; //1个错误
    return 0;
}


#include<iostream>
using namespace std;
class A{
public:
    A(int a){ 
        cout<<"A(int a)"<<endl;
    }
    explicit A(const A&){ //必须显示调用
        cout<<"A(const A&)"<<endl;
    }
private:
    A& operator=(const A&){
    }
};

int main()
{
    A a(1); //直接显示调用A(int)
    A b(A(1)); //先显示调用A(int),再显式调用A(const A&),编译器优化省略掉A(const A&)的调用,最后只调用A(int)
    A c = A(1); //1个错误
    A d = 1; //1个错误
    return 0;
}

#include<iostream>
using namespace std;
class A{
public:
    explicit A(int a){ //必须显示调用
        cout<<"A(int a)"<<endl;
    }
    explicit A(const A&){ //必须显示调用
        cout<<"A(const A&)"<<endl;
    }
private:
    A& operator=(const A&){
    }
};

int main()
{
    A a(1); //直接显示调用A(int)
    A b(A(1)); //先显示调用A(int),再显式调用A(const A&),编译器优化省略掉A(const A&)的调用,最后只调用A(int)
    A c = A(1); //1个错误
    A d = 1; //2个错误
    return 0;
}
newboy686 2019-05-22
  • 打赏
  • 举报
回复
谢谢楼上各位了,#3讲的太详细了,意思明白了,但是原理不太懂
真相重于对错 2019-05-22
  • 打赏
  • 举报
回复
class A{ public: A(S s); }; S s1 A a1=s1 //这里不是赋值,而是初始化,是构造。 如果要调用赋值 A a1=.... ...... a1=s//所谓的赋值是在要修改原对象时候才会调用。
Italink 2019-05-21
  • 打赏
  • 举报
回复
这跟QT无关吧,C++类支持这个操作

#include<iostream>
using namespace std;
class MyClass
{
public:
MyClass(int i) {
data = i;
}
//MyClass(int i) :data(i) {}
private:
int data;
};
int main() {
MyClass my = 1;
return 0;
}

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧