标签: const

为什么对不同类型的变量的常量引用是可接受的?

我正在查看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&有用呢?

我可以使用哪些类型限制?

编辑:为什么这个问题被投票?我相信我很好地解释了这个问题.

c++ const reference

0
推荐指数
1
解决办法
125
查看次数

使用虚函数和/或c ++中的const"丢弃限定符"错误

我研究这个问题越多,我似乎就越困惑.这是一个家庭作业问题,涉及增加我们教授给我们的代码.我知道这个问题与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)

c++ inheritance const

0
推荐指数
1
解决办法
1320
查看次数

Doom 3 source:为什么表示2向量的类会重载下标运算符两次?

我想我会通过查看最近发布的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返回浮动?这个类中没有其他七种浮点型方法可以做到这一点,所以我猜测效率不是一个因素(因为这个运算符可能比其他运算符更频繁地被称为).

欣赏有关这里发生的事情的任何见解......

c++ const operator-overloading

0
推荐指数
1
解决办法
274
查看次数

有没有办法声明函数的输入参数必须是const引用?

这样做的动机是(很少)我需要知道类构造函数或函数的输入参数通常是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)

c++ const

0
推荐指数
1
解决办法
133
查看次数

c ++将const对象引用传递给函数

错误:将'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 reference

0
推荐指数
1
解决办法
8147
查看次数

将'const'作为'this'参数传递给

可能重复:
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++ const this

0
推荐指数
1
解决办法
1万
查看次数

为什么std :: set <> :: find返回一个const?

可能重复:
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)

c++ stl const set

0
推荐指数
1
解决办法
3087
查看次数

const_cast c ++对我不起作用

试图了解const_cast的用法.代码如下:

const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;
Run Code Online (Sandbox Code Playgroud)

...生成运行时错误.

另一个问题,在内存中,运行时(它)如何知道这个区域是不是const,这是什么样的标志?

c++ casting const

0
推荐指数
1
解决办法
234
查看次数

与性能相关的问题将参数作为函数/方法的引用传递

将参数传递给将在短时间内调用数百万次的函数和方法时,传递所述参数的开销开始显示.

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)
  • 是否应该通过副本传递int/unsigned int?
  • 是否应该只在64位或更高目标上通过副本传递double?
  • 如果函数可以内联 - 参数如何在物质中传递?
  • 当通过ref/const ref传入时,别名如何影响问题?
  • 在什么情况下,参数的显式副本在堆栈上是有益的?

注意:这不是关于const正确性的问题.还在32/64位平台上寻找与gcc和msvc相关的答案.

一些可能相关的问答:

"const T&arg"与"T arg"

/sf/answers/149747811/

在C++中通过引用/值传递

为什么传递const引用而不是值?

c++ performance const function pass-by-reference

0
推荐指数
1
解决办法
401
查看次数

模板转换操作符,'const'关键字必需

我有一个模板类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.

另一方面,如果我删除此关键字,则转换根本不起作用.

我能做什么?

谢谢,抱歉我的英语不好.

c++ templates casting const

0
推荐指数
1
解决办法
112
查看次数