指针数据类型变量如何包含对象?
How can a pointer data type variable can contain an object?
我是 c++/QT 的新手,我很难理解 TCP 套接字教程 (https://www.bogotobogo.com/Qt/Qt5_QTcpSocket_Signals_Slots.php) 中的一堆代码。
这是mytcpsocket.h文件(class声明):
#ifndef MYTCPSOCKET_H
#define MYTCPSOCKET_H
#include <QObject>
#include <QTcpSocket>
#include <QAbstractSocket>
#include <QDebug>
class MyTcpSocket : public QObject
{
Q_OBJECT
public:
explicit MyTcpSocket(QObject *parent = 0);
void doConnect();
signals:
public slots:
void connected();
void disconnected();
void bytesWritten(qint64 bytes);
void readyRead();
private:
QTcpSocket *socket;
};
#endif // MYTCPSOCKET_H
因此,在class声明中有一个名为"socket"的私有属性,它是指针类型。
这是 mytcpsocket.cpp 文件(class 定义):
// mytcpsocket.cpp
#include "mytcpsocket.h"
MyTcpSocket::MyTcpSocket(QObject *parent) :
QObject(parent)
{
}
void MyTcpSocket::doConnect()
{
socket = new QTcpSocket(this);
connect(socket, SIGNAL(connected()),this, SLOT(connected()));
connect(socket, SIGNAL(disconnected()),this, SLOT(disconnected()));
connect(socket, SIGNAL(bytesWritten(qint64)),this, SLOT(bytesWritten(qint64)));
connect(socket, SIGNAL(readyRead()),this, SLOT(readyRead()));
qDebug() << "connecting...";
// this is not blocking call
socket->connectToHost("google.com", 80);
// we need to wait...
if(!socket->waitForConnected(5000))
{
qDebug() << "Error: " << socket->errorString();
}
}
您可以在 doConnect() 方法中看到它正在使用来自 class QTcpSocket 的对象初始化 "socket" 属性(这是一个指针,对吧?)。
怎么可能?
我的意思是,根据我所学到的;
int number{10};
int *ptr_number = &number
ptr_number // variable that store number's memory address.
*ptr_number = number // deferencing ptr_pointer.
所以应该是:
*socket = new QTcpsocket(this);
而不是:
socket = new QTcpsocket(this);
这里,"socket"应该只包含一个内存地址,不是吗?我们如何影响它?
另外,还有一个小问题;
为什么我们不使用 "this" 关键字来初始化 class 声明中的属性? :
this->socket = new QTcpsocket(this);
如果这些问题看起来有点傻,我深表歉意,但我找不到任何好的解释...
提前致谢!
operator new
returns指向新分配内存的指针。
关于this->socket
,它是隐式假设的,我们可以直接使用socket
变量。
谢谢@CinCout 和@vahancho!
我是 c++/QT 的新手,我很难理解 TCP 套接字教程 (https://www.bogotobogo.com/Qt/Qt5_QTcpSocket_Signals_Slots.php) 中的一堆代码。
这是mytcpsocket.h文件(class声明):
#ifndef MYTCPSOCKET_H
#define MYTCPSOCKET_H
#include <QObject>
#include <QTcpSocket>
#include <QAbstractSocket>
#include <QDebug>
class MyTcpSocket : public QObject
{
Q_OBJECT
public:
explicit MyTcpSocket(QObject *parent = 0);
void doConnect();
signals:
public slots:
void connected();
void disconnected();
void bytesWritten(qint64 bytes);
void readyRead();
private:
QTcpSocket *socket;
};
#endif // MYTCPSOCKET_H
因此,在class声明中有一个名为"socket"的私有属性,它是指针类型。
这是 mytcpsocket.cpp 文件(class 定义):
// mytcpsocket.cpp
#include "mytcpsocket.h"
MyTcpSocket::MyTcpSocket(QObject *parent) :
QObject(parent)
{
}
void MyTcpSocket::doConnect()
{
socket = new QTcpSocket(this);
connect(socket, SIGNAL(connected()),this, SLOT(connected()));
connect(socket, SIGNAL(disconnected()),this, SLOT(disconnected()));
connect(socket, SIGNAL(bytesWritten(qint64)),this, SLOT(bytesWritten(qint64)));
connect(socket, SIGNAL(readyRead()),this, SLOT(readyRead()));
qDebug() << "connecting...";
// this is not blocking call
socket->connectToHost("google.com", 80);
// we need to wait...
if(!socket->waitForConnected(5000))
{
qDebug() << "Error: " << socket->errorString();
}
}
您可以在 doConnect() 方法中看到它正在使用来自 class QTcpSocket 的对象初始化 "socket" 属性(这是一个指针,对吧?)。
怎么可能? 我的意思是,根据我所学到的;
int number{10};
int *ptr_number = &number
ptr_number // variable that store number's memory address.
*ptr_number = number // deferencing ptr_pointer.
所以应该是:
*socket = new QTcpsocket(this);
而不是:
socket = new QTcpsocket(this);
这里,"socket"应该只包含一个内存地址,不是吗?我们如何影响它?
另外,还有一个小问题; 为什么我们不使用 "this" 关键字来初始化 class 声明中的属性? :
this->socket = new QTcpsocket(this);
如果这些问题看起来有点傻,我深表歉意,但我找不到任何好的解释... 提前致谢!
operator new
returns指向新分配内存的指针。
关于this->socket
,它是隐式假设的,我们可以直接使用socket
变量。
谢谢@CinCout 和@vahancho!