新手求助!类的数组型成员变量的长度问题

buctcn2000 2016-07-26 09:50:18
我是一个C++ 初学者,今天在学习语法时,写了如下一段代码,发现了一些问题,在此向各位请教,不胜感激。问题如下:
(1) C++语法是否允许类内数组型成员变量的 [ ] 运算符内什么都不写?从代码执行结果来看,是可以的,但是并没有找到相关说明;
(2)为什么静态的类型的(1)中所指的数组在初始化后,sizeof计算长度是初始化后的长度,而非静态类型的就是0;
(3)不论是初始化后的静态类型的数组成员变量还是普通的数组成员变量,都可以越界访问并且不报错?
#include <iostream>
using namespace std;
class A
{
public:
static int arr[];
static int arr2[10];
int arr1[];
int arr3[3];
};
int A::arr[] = {1,2,3,4,5,6,7,8,9,10};
int A::arr2[10] = {1,2,3,4,5,6,7,8,9,10};
int main()
{
cout << sizeof(int) << endl;//4
cout << sizeof(A::arr) << endl;//40
A::arr[11] = 888;
cout << A::arr[11] << endl;//正常输出 888
cout << sizeof(A::arr2) << endl;//40
A::arr2[11] = 888;
cout << A::arr2[11] << endl;//正常输出 888
A a;
a.arr1[10] = 999;
cout << sizeof(a.arr1) << endl;//0
cout << a.arr1[10] << endl;//正常输出 999
a.arr3[5] = 123;
cout << a.arr3[5] << endl;//正常输出 123
return 0;
}
...全文
796 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-07-27
  • 打赏
  • 举报
回复
int A::arr[] = {1,2,3,4,5,6,7,8,9,10}; 数组大小为初始化元素的数量,也就是说{1,2,3,4,5,6,7,8,9,10}中有几个,数组就元素就为几 你要相关说明看这里:http://en.cppreference.com/w/cpp/language/array
buctcn2000 2016-07-27
  • 打赏
  • 举报
回复
引用 4 楼 qq_33583069 的回复:
[]就是运算符啊 a【10】 访问是 loc(a) + 10 * sizeof(a) 基地址+下标x类型长度 a是指向基地址的指针
谢谢你的回答~~~
buctcn2000 2016-07-27
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
int a[] 缺省看作0个元素的数组, 这是因为,允许0个元素数组的的原因 早期定义成员变量,是不允许的 至于 初始化的数组,那是因为 可以从初始化表,得到数组大小的信息。 所以,就不直接写了,它的容量,就是容纳下,初始化表中的元素的容量。 另外,越界访问,对c,c++ 语言来说,根本就不是错误 越界访问,只是一种程序逻辑错误,运行时错误 不是语言层面的错误。
非常感谢你的及时解答~~~谢谢!!!非常有用
buctcn2000 2016-07-27
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
int A::arr[] = {1,2,3,4,5,6,7,8,9,10}; 数组大小为初始化元素的数量,也就是说{1,2,3,4,5,6,7,8,9,10}中有几个,数组就元素就为几 你要相关说明看这里:http://en.cppreference.com/w/cpp/language/array
非常感谢版主的回答~之前绕糊涂了,类内声明,类外初始化,怎么就忘记初始化这一说了呢……
真·skysys 2016-07-27
  • 打赏
  • 举报
回复
[]就是运算符啊 a【10】 访问是 loc(a) + 10 * sizeof(a) 基地址+下标x类型长度 a是指向基地址的指针
真·skysys 2016-07-27
  • 打赏
  • 举报
回复
不写就是指针啊, *a 等价于 a[] 等价于a
lm_whales 2016-07-26
  • 打赏
  • 举报
回复
int a[] 缺省看作0个元素的数组, 这是因为,允许0个元素数组的的原因 早期定义成员变量,是不允许的 至于 初始化的数组,那是因为 可以从初始化表,得到数组大小的信息。 所以,就不直接写了,它的容量,就是容纳下,初始化表中的元素的容量。 另外,越界访问,对c,c++ 语言来说,根本就不是错误 越界访问,只是一种程序逻辑错误,运行时错误 不是语言层面的错误。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧