#一、目前项目中遇到的继承、虚函数的问题。(函数不能运行,只是记录)
##1。在一个类(进程)中获取另一个类的参数:
//头文件
class UploadVideoThread : public QThread
{
Q_OBJECT
public:
UploadVideoThread();
virtual void run();
void stop();
void setPath(const QString &iPath); //建立引用函数传递参数
public slots:
signals:
void send(QString msg);
private:
QString folderpath;
}
//主函数
void RemoteView::OnVideoRecord(bool /*bcheck*/)
{
QString folderpath = "dsfdsfsda"
uploadvideothread.setPath(folderpath); //把目标传入setpath函数
uploadvideothread.start();
}
void UploadVideoThread::setPath(const QString & iPath)
{
folderpath = iPath;
}
void UploadVideoThread::run()
{
qDebug() << folderpath;//调用成功
}
##2.获得一个线程中的参数:
class VideoRecordThread :public QThread
{
。
public:
virtual void run() {};
virtual void stop() {};
virtual void videoStart() {};
virtual void videoEnd() {};
virtual QString getName(){return m_videoNamePath;}; //定义虚函数
public slots:
virtual void captureScreen() {};
protected:
QString m_videoNamePath;
void CVVideoRecordThread::videoStart()
{
m_videoNamePath = "/video" //要传的参数
}
void classs::video()
{
folderpath = videorecord->getName(); //调用
qDebug() << folderpath;
}
####################################################################################
##3.关于this指针:
1、指针永远指向当前对象;
2、解决命名上的冲突;
3、*this指向对象本体。
4、非静态的成员函数才有this指针。
class Person
{
Person(age)
{
//形参与成员变量同名,无法赋值
//age = age;
this->age = age;
}
//必须使用引用的方式返回
Person& PersonAddAge(Person p)
{
this->age += p.age;
return *this;
}
int age;
}
this->fun()
会提示this是NULL或者是冲突。
初略解决是在前面加上:
if (this == NULL)
{
return:
}
QString folderpath = this->getName();
当this为空的时候如何执行。
于QString类型的字符串截取:
- QString x = “Pineapple”;
- QString y = x.left(4); 结果:Pine
- QString z = x.right(4); 结果:pple
- QString 转换为string
- string f = x.toStdString();
线程:
建立两个线程的cpp和h文件
//线程的头文件
#ifndef THREAD_H
#define THREAD_H
#include<QThread>
#include<QString>
class Thread : public QThread
{
Q_OBJECT
public:
Thread();
virtual void run();
void stop();
signals:
void send(QString msg);
private:
};
#endif // THREAD_H
Thread::Thread()
{
}
void Thread::run()
{
//需要线程运行的代码
}
//主函数的调用。而且要在主函数的类中写入
//private:
// Thread thread;
thread.start();
}
虚函数:
引用:给一个变量起别名。格式:
数据类型 &别名=原名 int &b=a;(必须初始化,不可改变可赋值)
引用传递:
int myswap(int &a, int &b) //别名
{
int temp =a;
a=b;
b=temp;
}
代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的。
数据区:存放已初始化的全局变量、静态变量(全局和局部)、常量数据。
BBS区:存放的是未初始化的全局变量和静态变量。
栈区:由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须程序员手动管理。
堆区:堆是由malloc()函数分配的内存块,使用free()函数来释放内存,堆的申请释放工作由程序员控制,容易产生内存泄漏。
- auto存储类型
auto只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中 - extern存储类型
extern用来声明在当前文件中引用在当前项目中的其它文件中定义的全局变量。如果全局变量未被初始化,那么将被存在BBS区中,且在编译时,自动将其值赋值为0,如果已经被初始化,那么就被存在数据区中。全局变量,不管是否被初始化,其生命周期都是整个程序运行过程中,为了节省内存空间,在当前文件中使用extern来声明其它文件中定义的全局变量时,就不会再为其分配内存空间。 - register存储类型
声明为register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期。 - static存储类型
被声明为静态类型的变量,无论是全局的还是局部的,都存储在数据区中,其生命周期为整个程序,如果是静态局部变量,其作用域为一对{}内,如果是静态全局变量,其作用域为当前文件。静态变量如果没有被初始化,则自动初始化为0。静态变量只能够初始化一次。 - 字符串常量
字符串常量存储在数据区中,其生存期为整个程序运行时间,但作用域为当前文件.
C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区以及常量区,动态数据区包括堆区和栈区。
以下是各个区的作用:
(1)代码区:存放程序代码;
(2)数据区
a.静态数据区: 在编译器进行编译的时候就为该变量分配的内存,即全局变量和静态变量(用static声明的变量),存放在这个区的数据程序全部执行结束后系统自动释放,声明周期贯穿于整个程序执行过程。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。
b.堆区:这部分存储空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。这个区是唯一一个可以由程序员自己决定变量生存 期的区间。可以用malloc,new申请对内存,并通过free和delete释放空间。如果程序员自己在堆区申请了空间,又忘记将这片内存释放掉,就 会造成内存泄露的问题,导致后面一直无法访问这片存储区域。但程序退出后,系统自动回收资源。分配方式倒是类似于链表。
c.栈区:存放函数的形式参数和局部变量,由编译器分配和自动释放,函数执行完后,局部变量和形参占用的空间会自动被释放。效率比较高,但是分配的容量很有限。
d.常量区:
存放常量的区间,如字符串常量等,注意在常量区存放的数据一旦经初始化后就不能被修改。 程序结束后由系统释放。
在弄懂内存分配的问题过后,来看看函数调用的过程:
执行某个函数时,如果有参数,则在栈上为形式参数分配空间(如果是引用类型的参数则除外),继续进入到函数体内部,如果遇到变量,则按情况为变 量在不同的存储区域分配空间(如果是static类型的变量,则是在进行编译的过程中已经就分配了空间),函数内的语句执行完后,如果函数没有返回值,则 直接返回调用该函数的地方(即执行原点),如果存在返回值,则先将返回值进行拷贝传回,再返回执行远点,函数全部执行完毕后,进行退栈操作,将刚才函数内 部在栈上申请的内存空间释放掉。