Const方法返回非const引用编译

时间:2018-01-30 09:54:12

标签: c++ const

我有一个简单的ssize_t bytes_recd = recv(sockfd, buf, sizeof buf, 0);类,实现了索引操作符。 来自this和其他相关问题,我不确定为什么以下代码编译:

Vector

Vector.h

int main()
{
    const Vector A(5);
    cout << "A :" << A << endl;
    A[0] = 5;
    cout << "A: " << A << endl;
}

Vector.cpp

#pragma once
#include <iostream> 
#include <functional>

namespace vector
{
    class Vector
    {
        friend std::ostream& operator<<(std::ostream&, const Vector&);

        int n;
        int *arr; 
    public:
        Vector(int = 0); 
        ~Vector();
        Vector(const Vector&);
        Vector& operator=(const Vector&);
    private:
        void copy(const Vector&);
    public:
        int& operator[](const int) const;   
    };
}

输出:

#include "Vector.h"
#include <algorithm>
#include <utility>
#include <functional>


namespace vector
{ 
    Vector::Vector(int n) : n(n), arr(new int[n])
    {
        std::fill(arr, arr + n, 0);
    }

    Vector::~Vector()
    {
        n = 0;
        delete[] arr;
    }

    void Vector::copy(const Vector& other)
    {
        arr = new int[n = other.n];
        std::copy(other.arr, other.arr + n, arr);
    }

    Vector::Vector(const Vector& other)
    {
        copy(other);
    }

    Vector& Vector::operator=(const Vector& other)
    {
        if (this != &other)  
        {
            this->~Vector();
            copy(other);
        }
        return *this;
    }

    int& Vector::operator[](const int index) const
    {
        return arr[index];
    }

    std::ostream& operator<<(std::ostream& stream, const Vector& vec)
    {
        for (int i = 0; i < vec.n; i++)
            stream << vec.arr[i] << " ";

        return stream;
    }

}

const方法如何返回非const引用(后来用于更改以前的const对象)甚至编译?

2 个答案:

答案 0 :(得分:10)

简而言之,这是你的责任。

const成员函数中,只有数据成员本身变为const。对于arr(应该是int*类型),它将变为int * const(即const指针),而不是int const *(即指向const的指针{1}});即指针变为const但指针变量不变为operator[]。所以从技术上讲,可以将非const引用返回给指针,即使它实际上也没有多大意义。

你最好在// const version int const & Vector::operator[](const int index) const { return arr[index]; } // non-const version int & Vector::operator[](const int index) { return arr[index]; } 上重载,就像大多数STL容器一样。 e.g。

www.mydomain.com/value to www.otherdomain.com/value

答案 1 :(得分:0)

方法声明中的

NsdServiceInfo serviceInfo = new NsdServiceInfo(); serviceInfo.setPort(Network.SERVICE_PORT); serviceInfo.setServiceName(Network.SERVICE_NAME); serviceInfo.setServiceType(Network.SERVICE_TYPE); Network.nsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, Network.registrationListener = new NsdManager.RegistrationListener() { public void onServiceRegistered(NsdServiceInfo serviceInfo) { Intent intent = new Intent(Network.INTENT_SERVICE_REGISTERED); LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { } public void onServiceUnregistered(NsdServiceInfo serviceInfo) { } public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { } }); 仅表示该方法对该实例本身具有只读访问权(就好像它接收show而不是const show = false; const tooltip = ( <Tooltip id="tooltip" show={show}> <strong>Holy guacamole!</strong> Check this info. </Tooltip> ); )。如果const是您班级const MyType *this的指针,则在MyType *this方法中使用时,它将分别视为arr。但请注意,它与int不同!这就是为什么取消引用它会产生int * const,而不是const