问题收藏

来源:互联网 发布:mac可以玩什么游戏 编辑:程序博客网 时间:2024/05/15 13:36
  
匈牙利法,该命名规则的主要思想是在变量和函数名中加入前缀以增进人们对程序的理解
例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。
匈牙利法最大的缺点是烦琐,例如
int    i, j, k; 
float x, y, z;
倘若采用匈牙利命名规则,则应当写成
int    iI, iJ, ik; // 前缀 i表示int类型
float fX, fY, fZ; // 前缀 f表示float类型
 
1.怎样用最快的方法判断链表是否有环?
 答:可以在每个节点中设一个成员:int   count;初始化为0;遍历链表,每经过一个节点,
     就把这个节点的count加1   ,如果加1   前发现count   ==1;则有环,返回true;
     遍历链表结束,表示没有环,返回false;
 
2.c++中引用和指针有什么不同?指针加上什么限制等于引用?
 答:1.指针是变量,而引用不是变量,只是变量的别名;
     2.指针定义时可不被初始化,而引用必须初始化;
     3.指针可作数组元素,而引用不能作数组元素;
     4.可有空指针,没有空引用.
 
4.在房里有三盏灯,房外有三个开关,在房外看不见房内的情况,你只能进门一次,
 你用什么方法来区分那个开关控制那一盏灯.
 答:先将第一个和第二个开关打开,过一段时间将第一个开关关了,在过一段时间将第二个开关关了,
     然后进门,那个冷的灯泡就是第三个开关控制的,那个最烫的灯泡就是第二个灯泡控制的,那个温的
    就是第一个灯泡控制的.
 
5.有两根不均匀分布的香,每根香烧完的时间是一个小时,你能用什么方法来确定一段15分钟的时间.
 答:设两根香用A和B来表示,先将A两端点燃,同时将B一端点燃,等A全部燃烧尽时,时间花去了30分钟,
     B也燃烧了一半,然后将B的另一端也点燃,开始记时,等B全部燃烧掉时,记时结束,
     花去时间即是15分钟.
 
6.一个经理有三个女儿,三个女儿的年龄加起来等于13,三个女儿的年龄乘起来等于经理自己的年龄,
 有一个下属已知道经理的年龄,但仍不能确定经理三个女儿的年龄,这时经理说只有一个女儿的头发是黑的,
 然后这个下属就知道了经理三个女儿的年龄.请问三个女儿的年龄分别是多少?为什么?
 答:此经理有一对双胞胎女儿,她们的年龄分别是:2岁、2岁、9岁;经理的年龄是36岁。
     与生物学关系较密切. 发色与年龄之间的关系。
    下属知道经理的年龄, 只要把13分成三个数, 三数乘积等于经理年龄有多种可能性
    所以, 令下属猜不出答案的原因是: 缺乏附加条件, 三元方程无确定解,一定要转换成二元方程
    黑发是显性基因, 如果经理夫妇都不是黑发,那么这黑发的女孩就是...
    真相只有一个: 女孩中没有双胞胎, 但是有有两个女孩的年龄是相同的!
    然后, 解二元方程
    显然3个女儿的年龄都不为0,要不爸爸就为0岁了,因此女儿的年龄都大于等于1岁。
    这样可以得下面的情况:1*1*11=11,1*2**10=20,1*3*9=27,1*4*8=32,1*5*7=35,
    {1*6*6=36},{2*2*9=36},2*3*8=48,2*4*7=56,2*5*6=60,3*3*7=63,3*4*6=72,3*5*5=75,
    4*4*5=80因为下属已知道经理的年龄,但仍不能确定经理三个女儿的年龄,说明经理是36岁
   (因为{1*6*6=36},{2*2*9=36}),所以3个女儿的年龄只有2种情况,
   经理又说只有一个女儿的头发是黑的,说明只有一个女儿是比较大的,其他的都比较小,
   头发还没有长成黑色的,所以3个女儿的年龄分别为2,2,9!
 
19 请问C++的类和C里面的struct有什么区别?
答:c++的类的成员默认情况下是私有的,cstruct的成员默认情况下是公共的.
 
21 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
答:一些变量整个程序中都是可见的,它们称为全局变量,一些变量在函数内部定义且只在函数中可知,则称为局部变量。
全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区
 
24 多态。overload override的区别。
答:重载在相同范围(同一个类中),函数名字相同,参数不同,virtual关键字可有可无。
覆盖是指派生类函数覆盖基类函数,不同的范围,函数名字相同,参数相同,基类函数必须有virtual关键字。
 
7 Windows程序的入口是哪里?写出Windows消息机制的流程.
答:Winmain(),它定义窗口界面和消息循环。设置全局资源->登记实例->调入全局资源->初始化应用->消息循环(解释消息,分发消息)
 
9 C++里面是不是所有的动作都是main()引起的?如果不是,请举例.
答:在运行c++程序时,通常从main()函数开始执行。因此如果没有main(),程序将不完整,编译器将指出未定义main()函数。
例外情况:如,windows编程中,可以编写一个动态连接库(dll)模块,这是其他windows程序可以使用的代码。由于DLL模块不是独立的程序,因此不需要main().用于专用环境的程序--如机器人中的控制器芯片--可能不需要main().但常规的独立程序都需要main().
 
11 main()
{
int i;
void f(); /*
函数说明*/
for(i=1;i<=5;i++)
f(); /*
函数调用*/
}
void f() /*
函数定义*/
{
auto int j=0;
++j;
printf("%d/n",j);

程序中定义了函数f,其中的变量说明为自动变量并赋予初始值为0。当main中多次调用f时,j均赋初值为0,故每次输出值均为1。现在把j改为静态局部变量,程序如下:
main()
{
int i;
void f();
for (i=1;i<=5;i++)
f();
}
void f()
{
static int j=0;
++j;
printf("%d/n",j);

由于j为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。
静态变量一般在内存中只有一份拷贝,它的生存期是整个程序的执行期间。而动态变量可以有多份拷贝,它的生存期是随着程序的执行而生成和销毁。在类中更能体现它们的不同点。


例如下:
#include "iostream.h"
class sta_c
{
private:
    int a;//a为动态变量,每生成一个类时在内存中就会有一份不同的拷贝。
    static int b;//b为静态变量,生成的每个类都共享这份拷贝。
public:
    sta_c()
    {
        a=0;
        a++;
        b++;
        cout<<"a="<<a<<endl;
        cout<<"b="<<b<<endl;
    }
};
int sta_c::b=0;//在此初始化b=0.
void main()
{
    sta_c c1;
    sta_c c2;
    sta_c c3;
}
 
 
40.解释堆和栈的区别。
栈区(stack由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表.
 
42. 以下三条输出语句分别输出什么?[C]
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout << boolalpha << ( str1==str2 ) << endl; //
输出什么?
cout << boolalpha << ( str3==str4 ) << endl; //
输出什么?
cout << boolalpha << ( str5==str6 ) << endl; //
输出什么?
答:分别输出false,false,truestr1str2都是字符数组,每个都有其自己的存储区..
 
9.
void fun(char *a,char *b)
{
    a=b;
    (*a)++;
}
void main()
{
    char s1='A',s2='a';
    char *p1=&s1;
    char *p2=&s2;
    fun(p1,p2);
    printf("%c%c",s1,s2);
}
输出结果:?
答:输出结果为:Ab,因为在fun函数里,指针a指向s2存储区(a=b),接着让s2存储区的值加1'b' ((*a)++),所以s2等于'b's1不变
43. C++内建型别 A B,在哪几种情况下B能隐式转化为A[C++中等]
答:
a. class B : public A { ……} // B
公有继承自A,可以是间接继承的
b. class B { operator A( ); } // B
实现了隐式转化为A的转化
c. class A { A( const B& ); } // A
实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数
d. A& operator= ( const A& ); //
赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个
49. C++中的空类,默认产生哪些类成员函数?[C++]
答:
class Empty
{
public:
Empty(); //
缺省构造函数
Empty( const Empty& ); //
拷贝构造函数
~Empty(); //
析构函数
Empty& operator=( const Empty& ); //
赋值运算符
Empty* operator&(); //
取址运算符
const Empty* operator&() const; //
取址运算符 const
};
 
53. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面]
答:
void* mymemcpy( void *dest, const void *src, size_t count )
{
char* pdest = static_cast( dest );
const char* psrc = static_cast( src );
if( pdest>psrc && pdest {
for( size_t i=count-1; i!=-1; --i )
pdest[i] = psrc[i];
}
else
{
for( size_t i=0; i pdest[i] = psrc[i];
}
return dest;
}
int main( void )
{
char str[] = "0123456789";
mymemcpy( str+1, str+0, 9 );
cout << str << endl;
system( "Pause" );
return 0;
}

54 线程与进程的区别
进程:(在批处理系统中)是资源分配的最小单位
线程:独立运行的最小单位。
一个进程中可以一个或多个线程。当系统的资源分配给进程,线程从所属的进程中得到保证能运行的很少的资源,线程完成后把资源给进程,只有当进程中的线程全都完成后,进程才把占有的系统的资源释放(进程挂起除外)。 

73 对于C++中类(class) 与结构(struct)的描述正确的为:
A,
类中的成员默认是private,当是可以声明为public,private protected,结构中定义的成员默认的都是public;
D,
结构和类对象都必须使用new 创建;
F,
结构不可以存在继承关系,当是类可以存在继承关系.
:A,D,F
 
74,两个互相独立的类:ClassA ClassB,都各自定义了非静态的公有成员函数 PublicFunc() 和非静态的私有成员函数 PrivateFunc();
现在要在ClassA 中增加定义一个成员函数ClassA::AdditionalPunction(ClassA a,ClassB b);则可以在AdditionalPunction(ClassA x,ClassB y)的实现部分(函数功能体内部)
出现的合法的表达是最全的是:
A,x.PrivateFunc();x.PublicFunc();y.PrivateFunc();y.PublicFunc();
B,x.PrivateFunc();x.PublicFunc();y.PublicFunc();
C,x.PrivateFunc();y.PrivateFunc();y.PublicFunc();
D,x.PublicFunc();y.PublicFunc();
:B
75,C++
程序下列说法不正确的有:
A,
对调用的虚函数和模板类都进行迟后编译.
B,
基类与子类中函数如果要构成虚函数,除了要求在基类中用virtual 声名,而且必须名字相同且参数类型相同返回类型相同参数个数相同.
C,
重载的类成员函数都必须要:或者返回类型不同,或者参数数目不同,或者参数序列的类型不同.
D,
静态成员函数和内联函数不能是虚函数,友员函数和构造函数也不能是虚函数,但是析构函数可以是虚函数.
:A
77,
构造函数和析构函数是否可以被重载,为什么?
答:构造函数可以被重载,析构函数不可以被重载。因为构造函数可以有多个且可以带参数,而析构函数只能有一个,且不能带参数。
78,一个类的构造函数和析构函数什么时候被调用,是否需要手工调用?
答:构造函数在创建类对象的时候被自动调用,析构函数在类对象生命期结束时,由系统自动调用。
 
2 头文件的作用是什么?
答:一、通过头文件来调用库功能。
二、头文件能加强类型安全检查。
3 C++函数中值的传递方式有哪几种?
答:C++函数的三种传递方式为:值传递、指针传递和引用传递
4 内存的分配方式有几种?
答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。
二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
三、从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
5 实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;
答:双向链表删除一个节点P
template void list::delnode(int p)
{
int k=1;
listnode *ptr,*t;
ptr=first;
while(ptr->next!=NULL&&k!=p)
{
ptr=ptr->next;
k++;
}
t=ptr->next;
cout<<"
你已经将数据项 "<data<<"删除"<
ptr->next=ptr->next->next;
length--;
delete t;
}
在节点P后插入一个节点:
template bool list::insert(type t,int p)
{
listnode *ptr;
ptr=first;
int k=1;
while(ptr!=NULL&&k!=p)
{
ptr=ptr->next;
k++;
}
if(ptr==NULL&&k!=p)
return false;
else
{
listnode *tp;
tp=new listnode;
tp->data=t;
tp->next=ptr->next;
ptr->next=tp;
length++;
return true;
}
}
原创粉丝点击