分享

在C++中

 懒人海马 2023-07-19 发布于山东

C++中,当我们在一个源文件中包含头文件时,头文件中声明的类和函数会自动成为该源文件的一部分。因此,在file2.c中包含了config.h头文件后,其中的类ConfigReader的定义和函数声明会被视为file2.c的一部分,无需使用extern关键字来引用。

extern关键字通常用于在不同的源文件中引用全局变量,以便它们可以在多个文件之间共享。对于类和函数声明,头文件的包含就足够了,不需要使用extern关键字。

C++中,使用extern关键字可以声明一个变量或函数是在其他文件中定义的全局变量或函数。这样,编译器就知道该变量或函数是在其他文件中定义的,并且可以在当前文件中使用它。

如果不使用extern关键字,而直接在当前文件中定义一个同名的变量或函数,将会创建一个新的局部变量或函数,而不是引用其他文件中的全局变量或函数。这样,两个同名的变量或函数就成为了完全独立的实体,它们的修改和调用也是互相独立的。

因此,使用extern关键字可以将变量或函数的定义从当前文件扩展到其他文件,实现了不同文件之间的共享和访问。而不使用extern关键字,则只是在当前文件中定义了一个新的局部变量或函数,与其他文件中的同名变量或函数没有任何关联。

C++中,全局变量可以在函数中直接访问,不需要作为参数传递给函数。因此,在function1()中可以直接访问全局变量g的值。全局变量是在程序的全局作用域中定义的,可以被程序中的任何函数访问。在函数中直接访问全局变量可以简化代码,并且不需要显式地传递参数。以下是修改后的代码示例,演示在function1()中直接访问全局变量g的值:

#include <iostream>using namespace std;int g = 1;void function1() {    if (g) {
       g = 0;
    }
}void function2() {    if (!g) {
        g = 1;
    }
}int main() {
    cout << "初始值: " << g << endl;    
    function1();
    cout << "调用function1后的值: " << g << endl;    
    function2();
    cout << "调用function2后的值: " << g << endl;    
    return 0;
}

function1()函数中,我们直接访问全局变量g的值,并根据其值进行判断和修改。输出结果将显示全局变量在两个函数中的修改情况。如果您希望在function1()中传递参数g,可以将g作为参数传递给函数,并在函数中使用该参数进行操作。以下是修改后的代码示例:

#include <iostream>using namespace std;int g = 1;void function1(int& x) {    if (x) {
       x = 0;
    }
}void function2() {    if (!g) {
        g = 1;
    }
}int main() {
    cout << "初始值: " << g << endl;    
    function1(g);
    cout << "调用function1后的值: " << g << endl;    
    function2();
    cout << "调用function2后的值: " << g << endl;    
    return 0;
}

function1()函数的参数列表中,我们添加了一个引用参数x,并将全局变量g作为实参传递给该参数。在函数中,我们使用参数x来进行判断和修改操作。输出结果将显示全局变量在两个函数中的修改情况。请注意,这里修改的是全局变量g的值,而不是参数x的值。因为我们传递的是引用参数,所以对参数的修改会影响到原始变量g的值。

signals: void gdowork(QSqlQuery *query, QSqlDatabase *m_DB, ParaSerial serial, myfather *father);

中 serial 被声明了吗,是全局变量还是局部变量?

serial是作为一个参数进行声明的。它不是全局变量,也不是局部变量,而是一个信号的参数。

当你发出这个信号时,需要传递一个ParaSerial类型的参数给它。这个参数可以是一个局部变量、全局变量或者其他表达式的结果。

在信号的声明中,

serial只是一个占位符,表示这个参数的类型和名称。在槽函数中,你可以访问和使用这个参数。当你发出这个信号时,需要传递一个具体的参数值给它。总之,serial在信号的声明中只是一个参数的占位符,它的具体值需要在发出信号时传递给它。它既不是全局变量,也不是局部变量。

如果每次循环实例化后,worker指针变量将指向一个新的对象,具有不同的地址和内存空间, createAndStartThread()中加入QObject::connect( worker, &Worker::signal,this,SLOT(On()));还会起作用吗

是的,即使在每次循环中实例化后,worker指针变量指向一个新的对象,连接信号和槽的语句QObject::connect(worker, &Worker::signal, this, SLOT(On()));仍然会起作用。

这是因为每次实例化新的Worker对象后,都会将该对象的信号signal连接到this对象的槽函数On()上。只要信号和槽的参数类型和数量匹配,连接仍然有效。

所以,无论worker指针变量指向的是哪个Worker对象,只要该对象发出了信号signal
,与之连接的槽函数On()都会被调用。

请注意,如果在每次循环中实例化新的Worker对象后,不再将其连接到信号和槽上,那么之前的连接将不再起作用。因为每个Worker对象都是独立的,它们之间的信号和槽连接是独立的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多