以下代码无法编译.
int a = 1, b = 2, c = 3;
int& arr[] = {a,b,c,8};
Run Code Online (Sandbox Code Playgroud)
C++标准对此有何看法?
我知道我可以声明一个包含引用的类,然后创建该类的数组,如下所示.但我真的想知道为什么上面的代码不能编译.
struct cintref
{
cintref(const int & ref) : ref(ref) {}
operator const int &() { return ref; }
private:
const int & ref;
void operator=(const cintref &);
};
int main()
{
int a=1,b=2,c=3;
//typedef const int & cintref;
cintref arr[] = {a,b,c,8};
}
Run Code Online (Sandbox Code Playgroud)
可以使用struct cintref而不是const int &模拟引用数组.
哎呀,暂时不在那个套接字库上工作.我正在尝试用C++教育自己一点.
对于类,有没有办法让变量只读公开,但私有访问时读取+写入?例如:
class myClass {
private:
int x; // this could be any type, hypothetically
public:
void f() {
x = 10; // this is OK
}
}
int main() {
myClass temp;
// I want this, but with private: it's not allowed
cout << temp.x << endl;
// this is what I want:
// this to be allowed
temp.f(); // this sets x...
// this to be allowed
int myint = temp.x;
// this NOT to be allowed
temp.x …Run Code Online (Sandbox Code Playgroud) int x = 10;
int& y = x;
Run Code Online (Sandbox Code Playgroud)
为此,x在堆栈上分配为2/4/8字节,并将00 ... 1010写入这些字节.内存布局及其内容会是什么样的y?
我想知道参考变量是否c在这段代码中:
int a = 5;
int & c = a;
Run Code Online (Sandbox Code Playgroud)
从堆或堆栈分配.有人可以帮忙吗?谢谢
读完这个答案后,我不太确定引用是否确实占用内存。我发现当编译器用引用的变量替换引用时,它不会占用内存,就像用引用的变量交换引用一样。
然而,
在一般情况下,编译器通常将引用实现为指针。但他们通常有更多关于参考可能指向的信息,并将其用于优化。
由于指针确实占用内存,那么由于编译器将其设置为指针,该引用现在不会导致占用内存吗?在编译器选择使引用成为指针而不是仅仅交换它的情况下,可以说引用实际上确实占用了内存,但以一种稍微隐式的方式?
事实上,编译器什么时候选择将引用实现为指针而不是交换,或者编译器之间的情况不同?
从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.相反,它们被视为它们引用的完全相同的变量,但具有另一个名称.
但是,当我运行以下代码时,似乎并非总是如此:
#include <cstdio>
struct A
{
int m[3];
};
struct B: A
{
B():x(m[0]), y(m[1]), z(m[2]){}
int& x;
int& y;
int& z;
};
int main(){
printf("%u, %u\n", sizeof(A), sizeof(B));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
12, 40
Run Code Online (Sandbox Code Playgroud)
为什么B比A大得多?
有没有其他方法可以访问,例如Bm [0]与Bx?
有人告诉我,当引用是类的数据成员时,它们会占用内存,因为它们将被编译器转换为常量指针。这是为什么?就像为什么编译器(我知道它通常是特定于实现的)在它们是类的一部分时而不是在它们是临时变量时将引用作为指针?所以在这段代码中:
class A{
public:
A(int &refval):m_ref(refval){};
private:
int &m_ref;
}
Run Code Online (Sandbox Code Playgroud)
m_ref 将被视为常量指针(即它们确实占用内存)。
然而,在这段代码中:
void func(int &a){
int &a_ref = a;
}
Run Code Online (Sandbox Code Playgroud)
编译器只是用实际变量替换引用(即它们不占用内存)。
因此,为了简单一点,我的问题基本上是:当常量指针是数据成员时,比它们是临时变量时,对它们进行引用更有意义吗?
我对C++中引用的想法不熟悉,我有一个关于引用纯数字常量的内存分配的问题.(我想先检查的另一件事是我怀疑const引用,我经常遇到它,意味着引用const,但我不确定.)
这是我在ideone.com上的测试:
#include <stdio.h>
int main() {
const int r0 = 123;
const int &r1 = 123;
const int &r2 = 123;
const int &r3 = r2;
printf("%p\n", (void *)&r0);
printf("%p\n", (void *)&r1);
printf("%p\n", (void *)&r2);
printf("%p\n", (void *)&r3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:
0x7ffee3bd74c4
0x7ffee3bd74c8
0x7ffee3bd74cc
0x7ffee3bd74cc
Run Code Online (Sandbox Code Playgroud)
原因与此答案清楚r2相同- C++参考如何看待内存?,这说它取决于编译器.但是我在想,为什么编译器不也令,,都是一样的,因为所有具有相同的纯恒定值.(如果没有错误的搜索,则称为prvalue)r3r0r1r2123
作为一个注释:经过对该网站的一些搜索,我发现了一个最相关的问题 - 但在python中.虽然不同的语言,但我认为这个想法应该是相同/相似的:从链接,如果我的程序是用python编写的,那么123在内存空间中只有一个用于节省空间.
我读过的其他一些答案:
int &x实现为*(pointer_to_x) …