c++中不知道的事儿

一 c++11趣事

  • NULL、0和nullptr的区别
#include <iostream>
using namespace std;

void fun(int){
    cout << "hello \n";
}

void fun(void*){
    cout << "world \n";
}

int main(int argc, char *argv[])
{
    cout << "Hello World!" << endl;

    fun(0); //调用第一个函数
    fun(NULL); //调用第一个函数
    fun(nullptr); //调用第二个函数

    return 0;
}

调用结果:

Starting D:\code\qt\build-untitled18-Desktop_Qt_5_8_0_MinGW_32bit-Debug\debug\untitled18.exe…
Hello World!
hello
hello
world

这个现象的解释:nullptr事c++11的一个新关键字,c++11允许你使用nullptr取代0活NULL,用来表示一个pointer(指针)指向所谓的 no value. 而NULL表示的正是前面提到的不确定的值

  • c++11标准库中的并发

先上一段代码(func1 和func2是两个函数都会返回一个int)

future<int> result1(std::async(func1));
int result2 = func2();
int result = result1.get() + result2;
cout << "\nresult of func1() + func2():" << result
       << endl;

std:async(func1) 尝试(也有可能不启动)启动func1()于后台的一个分离线程。
result1.get(),以下三件事情之一会发生:

  1. 如果func1() 被async()启动于一个分离线程中并且已结束,你会立即获得器结果。
  2. 如果func1()被启动但尚未结束,get()会引发停滞(block)待func1()结束后获取结果
  3. 如果func1()尚未被启动,会被强迫启动如同一个同步调用;get()会引发停滞直到产生结果

get()的调用很重要,在单线程环境中,或是当async()无法启动新线程时,程序任然有效运行

future<int> result1 = std::async(launch::async, func1);

像这样,明确的指示调用async()的时候,以一步的方式启动线程,调用func1(),启动失败抛出异常。在这种情况get()不是必须的。
但是必须把结果赋值出去,否则调用者会block在调用处,直到这个线程返回,等同于同步
也可以发射launch::deferred,确保在没有get()或wait()的情况下,func1()绝对不会调用

二 Qt中关于改变按钮text和颜色的问题

  • 先上代码,说现象
for(int i = 0; i < 20; ++i)
{
    int tmp;
    double res;
    read(fd, &tmp, sizeof(tmp));
    res = double(tmp / 10);
    string = QString("%1 `C").arg(res);
    lcdunmber->display(double(res));
    label->setText(string);
    sleep(1);
}

现象:label的text属性每循环一次都改变,但是显示的只有最后一次的字符串。

  • 原因:因为setText()不会立即调用paintEvent进行绘图。程序会等你退出循环后才有机会进行绘图。所以你看到的是最后一次读回来的值。

  • 解决办法:在每次setText()候调用label->repaint()立即重绘

猜你喜欢

转载自blog.csdn.net/a119258/article/details/77163501