指针数据类型变量如何包含对象?

时间:2019-12-10 10:19:26

标签: c++ qt pointers qtcpsocket

我对C ++ / QT还是很陌生,我很难理解TCP套接字教程(https://www.bogotobogo.com/Qt/Qt5_QTcpSocket_Signals_Slots.php)中的大量代码。

这是 mytcpsocket.h 文件(类声明):

#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

因此,有一个名为“ socket”的私有属性,它是类声明中的指针类型。

这是 mytcpsocket.cpp 文件(类定义):

// 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()方法中看到它正在使用QTcpSocket类中的对象初始化“套接字”属性(是指针,对吗?)。

怎么可能? 我的意思是,根据我所学到的知识;

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); 

在这里,“套接字”应该只包含一个内存地址,不是吗?我们如何影响它呢?

另外,还有一个小问题; 为什么我们不使用“ this”关键字来初始化类声明中的属性? :

this->socket = new QTcpsocket(this);

我很抱歉,如果这些问题看起来有点愚蠢,但我在周围找不到任何好的解释... 预先感谢!

1 个答案:

答案 0 :(得分:2)

operator new返回指向新分配的内存的指针。

对于this->socket,它是隐式假定的,我们可以直接使用socket变量。

谢谢@CinCout和@vahancho!