我正在查看http://msdn.microsoft.com/en-us/library/szywdw8k%28VS.80%29.aspx,部分代码对我没有意义.
int iVar;
const long& LongRef3 = iVar; // OK
Run Code Online (Sandbox Code Playgroud)
为什么LongRef3可以引用iVar,即使LongRef3声明为常量时它们是不同的类型?
根据这个:为什么引用的常量会影响它是否可以用不同类型的变量初始化?
"因为它创建了一个临时的int,其中double被转换,并且可变引用不能绑定到temporaries,而const则可以." 这对我来说没有意义.什么临时int正在创建?
我为什么要这样做?什么时候比声明const int&有用呢?
我可以使用哪些类型限制?
编辑:为什么这个问题被投票?我相信我很好地解释了这个问题.
我研究这个问题越多,我似乎就越困惑.这是一个家庭作业问题,涉及增加我们教授给我们的代码.我知道这个问题与const关键字有关,还有一些令人困惑的新应用程序.
有一个泛型类Object,从中继承了几个子类(Sphere,Cone,Polygon).以下是Object中的类:
public: // computational members
// return t for closest intersection with ray
virtual float intersect(const Ray &ray) const = 0;
// return color for intersection at t along ray r
virtual const Vec3 appearance(const World &w,
const Ray &r, float t) const = 0;
//The following function is added by me
virtual const Vec3 normal(Vec3 p);
};
Run Code Online (Sandbox Code Playgroud)
我添加了最终功能,正常.
因此,在Sphere类中,这样实现:
const Vec3 Sphere::normal(Vec3 p)
{
return (p - d_center).normalize();
}
Run Code Online (Sandbox Code Playgroud)
当我'make'时,我收到以下错误:
Appearance.cpp: In member function ‘const Vec3 Appearance::eval(const World&, …Run Code Online (Sandbox Code Playgroud) 我想我会通过查看最近发布的Doom 3源代码来尝试增强我的C++和OpenGL.到目前为止学到的很多,但我已经碰壁了.这里详述的课程有方法
float operator[] (int index) const
Run Code Online (Sandbox Code Playgroud)
和
float & operator[] (int index)
Run Code Online (Sandbox Code Playgroud)
他们的身体都读了
return ( &x )[ index ];
Run Code Online (Sandbox Code Playgroud)
where x是一个类'两个数据成员(另一个是y;这个类是2向量).
虽然我可以理解每个版本的标题/原型的语法,但我不明白为什么它们都存在.
const似乎出现(或不出现,作为首选)只是为了充分区分标题以允许编译.(也就是说,删除const和VS2010拒绝编译,类似的,如果两个标题结束const.)
为什么要将ref返回浮动?这个类中没有其他七种浮点型方法可以做到这一点,所以我猜测效率不是一个因素(因为这个运算符可能比其他运算符更频繁地被称为).
欣赏有关这里发生的事情的任何见解......
这样做的动机是(很少)我需要知道类构造函数或函数的输入参数通常是const.通常当类是帮助程序"自动化"某些过程时.
示例:
这是从容器中获取随机元素的OK范围方法吗?
如果查看代码,很明显,如果更改传递给构造函数的容器,则以后类功能会被破坏.那么有没有办法让函数"需求"const而不是"promise"const.
例:
int f(const vector<int>& v)
{
return v.size();
}
int main()
{
vector<int> v;
v.push_back(42); // can f be changed to reject v because it is not const
cout << f(v);
}
Run Code Online (Sandbox Code Playgroud) 错误:将'const QByteArray'作为'this'参数传递给'QByteArray&QByteArray :: append(const QByteArray&)'丢弃限定符[-fpermissive]
因为作为函数参数传递时使对象成为常规,所以我已经完成了它.但现在我得到一个错误!!,我想让函数保持不变,因为我必须将qbyte数组中的数据转换为short,然后将其附加到另一个数组.
QByteArray ba((const char*)m_output.data(), sizeof(ushort));
playbackBuffer.append(ba);
Run Code Online (Sandbox Code Playgroud)
我真的需要将这个数组传递给playbackbuffer;
它给了我一个错误playbackBuffer.append(ba);
请
提前帮助谢谢
可能重复:
c ++将const对象引用传递给函数
void SpectrumAnalyserThread::calculateFFT(AnalogData &frame, const QByteArray &playbackBuffer)
{
fft->window(frame.data(),frame.size());
fft->fix_fftr(frame.data(), qFloor(log(frame.size()) / log(2)), 0);
for(int i = 0; i < m_numSamples; ++i)
{
m_output.push_back(frame[i]);
}
fft->fix_fftr(m_output.data(), qFloor(log(m_output.size()) / log(2)), 0);
const QByteArray ba((const char*)m_output.data(), sizeof(ushort));
const_cast<QByteArray &>(playbackBuffer);
playbackBuffer.append(ba);
m_output.clear();
calculateMagnitude(frame);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: passing 'const QByteArray' as 'this' argument of 'QByteArray& QByteArray::append(const QByteArray&)' discards qualifiers [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
如果我做了功能常量则在抛出错误
m_output.clear(),m_output.push_back(),这是显而易见的,但我需要清除缓冲区,这样当函数被再次调用以前的数据不会被追加.
可能重复:
C++ STL集更新很繁琐:我无法更改元素
我想使用a std::set<>来计算某个值的出现次数并同时对对象进行排序.为此,我创建了一个类RadiusCounter
class RadiusCounter
{
public:
RadiusCounter(const ullong& ir) : r(ir) { counter = 1ULL; }
void inc() { ++counter; }
ullong get() const { return counter;}
ullong getR() const { return r;}
virtual ~RadiusCounter();
protected:
private:
ullong r;
ullong counter;
};
Run Code Online (Sandbox Code Playgroud)
(析构函数不做任何操作)和比较运算符:
const inline bool operator==(const RadiusCounter& a, const RadiusCounter& b) {return a.getR() == b.getR();}
const inline bool operator< (const RadiusCounter& a, const RadiusCounter& b) {return a.getR() < b.getR();}
const inline bool operator> (const …Run Code Online (Sandbox Code Playgroud) 试图了解const_cast的用法.代码如下:
const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;
Run Code Online (Sandbox Code Playgroud)
...生成运行时错误.
另一个问题,在内存中,运行时(它)如何知道这个区域是不是const,这是什么样的标志?
将参数传递给将在短时间内调用数百万次的函数和方法时,传递所述参数的开销开始显示.
void foo(const SomeType&st){...}
对于像std :: string,std :: vector等类型...规则是通过引用传递,以便不会发生无意义的副本.然而,当处理诸如双打,英特等的POD时,故事却完全不同.
关于性能,如果函数/方法不需要改变参数,在决定是否应该通过引用,const引用或复制传递时,常见的"需要注意的事项"是什么?
void foo1(SomeType& st)
{
...
}
void foo2(const SomeType& st)
{
...
}
void foo3(SomeType st)
{
...
}
void foo4(SomeType* st)
{
...
}
Run Code Online (Sandbox Code Playgroud)
注意:这不是关于const正确性的问题.还在32/64位平台上寻找与gcc和msvc相关的答案.
一些可能相关的问答:
我有一个模板类OneCell,在这里定义:
template <class T>
class OneCell
{
.....
}
Run Code Online (Sandbox Code Playgroud)
我OneCell在这里有一个从T到T 的演员
operator T() const
{
getterCount++;
return value;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我想在此方法中增加变量,但因为关键字而出现错误const.
另一方面,如果我删除此关键字,则转换根本不起作用.
我能做什么?
谢谢,抱歉我的英语不好.