引用变量,运算符=重载,以写入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];
如何对引用使用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){....}
但是编译器(或者语言-我不知道)没有提供这种可能性,限制可以将构造函数重载为非引用。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 如果非动态变量被指针引用,何时超出范围?
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- 地址运算符是否返回变量引用的对象的地址
- 未在另一个函数中设置变量引用的问题
- 英特尔样式内联程序集和 AT&T 样式中的变量引用,C++
- 将成员变量引用为类成员
- 从静态变量引用非静态变量会使非静态变量先于静态变量进行析构函数
- 何时解析 C++11 lambda 表达式中的变量引用
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- C++强制对变量引用进行编译优化,使之成为直接的
- Boost变量引用和相等比较
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员
- 为什么要在Java中生成变量引用数组
- 捕获和调试对移动lambda内部局部变量引用的无效使用
- 在变量初始化后更改变量引用
- 从'C'程序中提取变量定义和变量引用