1.有以下程序,程序的输出结果是 0
#include <stdio. h>
int fun( int a )
{
int b = 0;
static int c = 3;
a = ( c + +,b + + );
return ( a );
}
main( )
{
int a = 2,i,k;
for( i = 0;i<2;i + + )
k = fun( a + + );
printf("%d\n",k );
}
解:基础知识牢记心中
a++:先操作再赋值
++a:先赋值再操作
2.对于以下结构定义,(*p)->str++中的++加在 语法错误
struct { int len; char *str; } *p;
解:
p是指针,可以写p->str,但是(*p)只能写(*p).str
这样:++加在指针 str 上
3.在C++语言中,以下说法正确的是 AD
A 多态是通过虚表实现的
B 构造函数可以声明为虚函数
C 析构函数不可以声明为虚函数
D 抽象类中至少包含一个纯虚函数
解:
构造函数为什么不能声明为虚函数?
1 )构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。无法确定。
2 )虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行。 析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。
析构函数为什么声明为虚函数?
1)如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全
4.关于float的知识点
(1)float的指数取值范围是-127,+128
(2)float的取值范围是-3.4E+38,3.4E+38
(3)float的指数位有8位
(4)float的尾数位有23位
5.静态的使用注意事项:
(1)静态方法只能访问静态成员(包括成员变量和成员方法)
非静态方法可以访问静态也可以访问非静态
(2)静态方法中不可以定义this,super关键字
因为 一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。静态方法在优先于对象存在,所以静态方法中不可以出现this,super关键字。
(3)主函数是静态的。
程序运行的时候,静态成员已经加载在内存里面了,但是包含静态成员的对象共享这些静态成员,比方说,A有一个静态成员public static int i;那么程序运行的时候,这个i就加载进内存了,A的所有对象的i变量都指向这个静态空间的i,也就是说创建对象之前,它就占空间了
(4)只有类的成员函数才能说明为虚函数;
(5)静态成员函数不能是虚函数;
(6)内联函数不能为虚函数;
(7)构造函数不能是虚函数;
(8)析构函数可以是虚函数,而且通常声明为虚函数
6.当执行下面的程序时,如果输入ABC,则输出结果是ABC6789
#include “stdio.h"
#include “string.h"
void main()
{
char ss[10]="1,2,3,4,5";
gets (ss);
strcat (ss,"6789");
printf ("%s\n",ss);
}
解:
第一步 ss[10] = “1,2,3,4,5”;
第二步gets()之后,ss[10] = “A,B,C,\0,5"
第三步strcat()之后,ss[10] = “A,B,C,6,7,8,9”
strcat会在遇到第一个\0时开始拼接