1.C++编译器自动为类产生的四个缺省函数是什么?
答:缺省的无参构造函数、缺省的拷贝构造函数、缺省的析构函数、缺省的赋值函数。
2.在类外有什么办法可以访问类的非公有成员。
答:友元、继承、公有成员函数。
3.引用与指针有什么区别?
答:
1、引用在创建时必须初始化,引用到一个有效对象;而指针在定义时不必初始化,可以在定义后的任何地方重新赋值。
2、指针可以是NULL,引用不行。
3、引用貌似一个对象的小名,一旦初始化指向一个对象,就不能将其他对象重新赋值给该引用,这样引用和原对象的值都会被更改。
4、引用的创建和销毁不会调用类的拷贝构造函数和析构函数。
4.静态内存、栈内存、堆内存各如何申请。
答:
1 、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 2、 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。因此,试图返回一个栈上分配的内存将会引发未知错误。
5.下面代码有什么问题?并改正。
void test()
{
char string[10],str1[10];
int i;
for(i = 0; i < 10; i++)
{
str1 = 'a';
}
strcpy(string,str1);
}
答:
1、数组名str为char *const类型的右值类型,根本不能赋值。
2、想对数组的第一个元素赋值,也要使用 *str1 = ‘a’;
3、使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,知道遇到 ‘\0’ 为止,所以拷贝的长度是不定的。如果一直没有遇到 ‘\0’ 导致越界访问非法内存,程序就会崩溃。
正确修改为:
void test()
{
char string[10],str1[10];
int i;
for(i = 0; i < 10; i++)
{
str1[i] = 'a';
}
str1[9] = '\0';
strcpy(string,str1);
}
写出完整版的strcpy函数:
char *strcpy(char * strDest, const char *strSrc)
{
assert((strDest != NULL) && (strSrc != NULL));
char *address = strDest;
while((*strDest++ = *strSrc++) != '\0');
return address;
}
6.请给出如下程序的结果:
#define MAX_NUM 100 + 300
int nTemp = MAX_NUM * 10;
则nTemp = 3100;
7.在32位操作系统下,C++程序,请计算出sizeof的值。
char str[] = "China";
char *p = str;
int n = 100;
请计算:
sizeof(str) = 6;
sizeof§ = 4;
sizeof(n) = 4;
void *op = malloc(100); sizeof(op) = 4;
8.如果某系统中15*4 = 112成立,则该系统采用的是几进制?
答:6进制;
9.请写出指向字符对象的常指针和指向常字符对象的指针变量的声明,并说明两者的有什么区别?
答:
const char *p ; p指向的内容不可修改。
char * const p; p这个地址无法修改。
10.以下程序运行后的输出结果是__1__;
main()
{
int a=1,b=2,c=3;
if(c=a)
printf("%d\n",c);
else
printf("%d\n",b);
}
11.已知字母A的ASCII码为65。以下程序运行后的输出结果是?
main()
{
char a,b;
a = 'A' + '5' - '3';
b = a + '6' - '2';
printf("%d %c\n",a,b);
}
答: 67 G
12.以下程序运行后的输出结果是__15__。
int f