概述
Q1:标识符命名规则
C、C++ 的标识符只能由英文字母、数字、下划线组成,其中第一个字符不能是数字。
Java 的标识符除了英文字符、数字、下划线之外,还可以有美元符号 $ ,第一个字符同样不能是数字。
Q2:空类占的内存大小?
问题:在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为()?
选项:A:0;B:1;C:2;D:3
解析:类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,空类的sizeof为 1,而不是 0。多重继承的空类的大小也是1。
答案: B。
Q3:析构函数
问题: 如果有一个类是 myClass , 关于下面代码正确描述的是:
myClass::~myClass() {
delete this;
this = NULL;
}
选项:
A:正确,我们避免了内存泄漏
B:它会导致栈溢出
C:无法编译通过
D:这是不正确的,它没有释放任何成员变量。
解析: this 是 myClass * const 类型的指针,因此给 this 赋值导致编译错误。如果没有 this = NULL;
那么 delete this;
会导致栈溢出。
Q4:数组指针
问题: 下列代码的运行结果
int a[5] = {1,3,5,7,9};
int *p = (int *)(&a+1);
printf(“%d,%d”,*(a+1),*(p-1));
解析: *(a+1)其实很简单就是指a[1],输出为3。 问题关键就在于第二个点,*(p-1)输出为多少? 解释如下,&a+1不是首地址+1,系统会认为加了一个整个a数组,偏移了整个数组a的大小(也就是5个int的大小)。所以intp=(int)(&a+1);其实p实际是&(a[5]),也就是a+5. 原因为何呢? &a是数组指针,其类型为int(*)[5]; 而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加5*sizeof(int),所以p实际是a[5],但是p与(&a+1)类型是不一样的,这点非常重要,所以p-1只会减去sizeof(int*),a,&a的地址是一样的,但意思就不一样了,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。
最后
以上就是天真摩托为你收集整理的牛客错题记录Q1:标识符命名规则Q2:空类占的内存大小?Q3:析构函数Q4:数组指针的全部内容,希望文章能够帮你解决牛客错题记录Q1:标识符命名规则Q2:空类占的内存大小?Q3:析构函数Q4:数组指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复