我有一个简单的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对象)甚至编译?
答案 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
。