引用变量,运算符=重载,以写入S&s=5;而不是S& s=A[5];

Reference variable with operator= overload in order to write S& s=5; instead of S& s=A[5];

本文关键字:变量 引用 重载 运算符      更新时间:2023-10-16

如何对引用使用operator=这个问题是基础,但它的措辞不同。

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;而不是S& s=A[5];

只能使用常量引用。而不是

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

(顺便说一下,这个语句

S& s5;s5=10;

无效,因为引用必须在定义时初始化)

你必须写

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

您不能将5文字用作数字以外的其他用途,但是您可以声明您自己的用户定义的文字:

struct S
{
};
S A[10];
S& operator "" _(unsigned long long int i)
{
    return A[i];
}
int main()
{
    S& s = 5_;
}

实时演示链接。

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

而且,你似乎不懂引用。

Reference (S&)是对变量的创建。在创建它的时候,你必须说明它指向的是哪个变量。

S& s6=10;
在本例中,10临时变量。它很快就会消失。如果你想修改它,你应该使用对临时 (S&&)的引用,在c++ 11中添加。或者,您可以使用const reference (const S&),在以前的标准中可用。

我认为c++中缺少的是为引用定义构造函数而不是为对象自身定义构造函数的可能性。

正如来自莫斯科的Vlad所指出的,代码在引用为常量时编译,尽管结果指向刚刚构造的新对象(从a复制的索引为i的新S)。

为了获得需要的东西,编译器应该提供引用构造函数的可能性,例如

S&(int i){....}

但是编译器(或者语言-我不知道)没有提供这种可能性,限制可以将构造函数重载为非引用。