带有operator = overload的引用变量,以便编写S& S = 5;而不是S& S = A [5];

时间:2014-08-26 13:30:45

标签: c++

问题How to use operator= with a reference是基础,但措辞不同。

struct S{
    int a,b;
    void operator=(int i);
    S(int i);
    S(){};
};

S A[0x10];

S::S(int i){*this=A[i];}
void S::operator=(int i){*this=A[i];}

int main(){
    //S s0=S{15,20};
    S s1;s1=5;
    S s2;s2=7;
    S s3=9;
    S s4;
//  S& s5=8;   

}

上面的代码我可以写:S s=5而不是S s=A[5]现在我需要相同的引用,以便能够写:S& s=5;而不是{{1 }}

4 个答案:

答案 0 :(得分:1)

您只能使用常量参考。那不是

S& s5;s5=10;
S& s6=10;

(顺便说一下这句话

S& s5;s5=10;

无效,因为引用应在其定义时初始化)

你必须写

const S& s5 = 10;
const S& s6 = 10;

答案 1 :(得分:1)

除了数字之外,您不能将5文字用于其他用途,但您可以声明自己的用户定义的文字

struct S
{
};

S A[10];

S& operator "" _(unsigned long long int i)
{
    return A[i];
}

int main()
{
    S& s = 5_;
}

Live demo link.

答案 2 :(得分:0)

s=5表示 s必须与使用5初始化的对象具有相同的值。
s=A[5]表示 s必须与A的第六个元素具有相同的价值。

此外,您似乎无法理解参考文献。

引用(S&)是指引用变量的创建。在创建它时,你必须说出它指向的变量。

S& s6=10;
在这种情况下,10临时变量。它很快就会消失。如果你想修改它,你应该使用引用临时S&&),在C ++ 11中添加。或者,您可以使用 const reference const S&),这在以前的标准中是可行的。

答案 3 :(得分:0)

我认为缺少的是C ++中为参考定义构造函数的可能性,而不是它自己的对象。

正如莫斯科的Vlad指出,当引用变为常量时,代码会编译,尽管结果是指刚构造的新对象(从索引为i的A复制的新S)。

为了获得所需的东西,编译器应该提供类似

的引用构造函数的可能性
S&(int i){....}

但编译器(和语言 - 我不知道)并没有提供限制将构造函数重载到非引用的可能性的可能性。