题目(1)
定义一个空类型,里面没有任何成员变量和成员函数,对该类型求sizeof,得到结果是()
A、 0 B、 1 C、 4 D、8
【解析】B
空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例,至于占用多少内存,
由编译器决定,Visual Studio中每个空类型的实例占用1个字节的空间。
#include <iostream> using namespace std; // 空类 class Fruits { }; // 继承空类的空类 class Apple : public Fruits { }; // 空结构体 struct Sports { }; // 主函数 int main(int argc, char **argv) { cout<<"sizeof(Fruits):"<<sizeof(Fruits)<<endl; cout<<"sizeof(Apple):"<<sizeof(Apple)<<endl; cout<<"sizeof(Sports):"<<sizeof(Sports)<<endl; return 0; }
题目(2)
如果在该类型中添加一个构造函数和析构函数,在对该类型求sizeof,得到的结果是()
A、 0 B、 1 C、 4 D、8
【解析】B
调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型有关,而与类型的实例无关,编译器也不会因为这两个函数而在实例内添加额外的信息。
题目(3)
题目(4)
下面是C++语言中两种if语句判断方式。请问哪种写法更好?为什么?
// 主函数 int main() { int n; // 第一种判断方式 if(n == 10) { } // 第二种判断方式 if(10 == n) { } return 0; }
【解析】第二种
第二种方法如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=
第一种不会报错 会变为赋值语句
来源:剑指Offer(何海涛)
题目(5)
32位环境下,int *p=new int[10];请问sizeof(p)的值为()
A、4 B、10 C、40 D、8
【解析】A
指针就是一个地址值,在32位系统下,占用4个字节,
用sizeof求枚举类型的长度,等于一个int型的长度,而与有几个枚举值无关.所以a也是占4个字节
来源:2014迅雷校园招聘
题目(6)
我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量)。请问:能不能同时用static和const修饰类的成员函数?
【解析】
答案是不可以。C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时static的用法和const是冲突的。
我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。
来源:剑指Offer(何海涛)
题目(7)
#include<stdio.h> #include<string.h> int main() { char str1[] = "I love you"; char str2[] = "I love you"; char* str3 = "I love you"; char* str4 = "I love you"; if(str1 == str2){ printf("str1 and str2 are same.\n"); } else{ printf("str1 and str2 are not same.\n"); } if(str3 == str4){ printf("str3 and str4 are same.\n"); } else{ printf("str3 and str4 are not same.\n"); } if(strcmp(str1,str2) == 0){ printf("the value of str1 and str2 are same.\n"); } else{ printf("the value of str1 and str2 are not same.\n"); } return 0; }
【解析】
c/c++把敞亮字符串放到一个单独的一个内存区域。当几个指针赋值给相同的敞亮字符串时,他们实际上会指向相同的内存地址。但常量内存初始化数组,情况却不一样。
str1和str2是两个字符串数组,我们会为他分配两个长度为12个字节的空间,并把“I love you”的内容分别复制到数组中去。这是两个初始化地址不同的数组。所以str1和str2是不相同的。
str3和str4是两个指针,我们无需为他们分配内存以存储字符串的内容,只需要把他们指向“I love you”在内存中的地址就可以了。由于内容是常量字符串,他在内存中只有一个拷贝,因此他们指向的是同一个地址。所以str3和str4是相同的。
strcmp()只是判断字符串中的内容(值)是不是一样。
题目(8)变量的声明与定义
变量的声明和定义有什么区别
【解析】
为变量分配地址和存储空间的称为定义,不分配地址的称为声明。
一个变量可以在多个地方声明,但是只在一个地方定义。
加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。
说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。
题目(9)sizeof与strlen
请说明sizeof 和 strlen 的区别
【解析】
sizeof 和 strlen 有以下区别:
sizeof 是一个操作符,strlen 是库函数。
sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\ 0‘的字符串作参数。
编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。
数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。
注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定
要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是 sizeof。