面试题
进程与线程的区别,进程如何同步?如何避免死锁?
1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)
int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?
答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;
改后答案依次为9,10,10,11
2.某32位系统下, C++程序,请计算sizeof 的值(5分).
char str[] = “www.ibegroup.com”
char *p = str ;
int n = 10;
请计算
sizeof (str ) = ?(1)
sizeof ( p ) = ?(2)
sizeof ( n ) = ?(3)
void Foo ( char str[100]){
请计算
sizeof( str ) = ?(4)
}
void *p = malloc( 100 );
请计算
sizeof ( p ) = ?(5)
答:(1)17 (2)4 (3) 4 (4)4 (5)4
写出string类的构造函数,拷贝构造函数,析构函数,赋值函数。
#include<iostream>
using namespace std;
class String
{
public:
       String(const char *str=NULL);
       String(const String &other);
       ~String(void);
       String &operator =(const String &other);
private:
       char *m_data;
};
String::String(const char *str)
{
    cout<<"构造函数被调用了"<<endl;
    if(str==NULL)//避免出现野指针,如String b;如果没有这句话,就会出现野
                  //指针
   {
        m_data=new char[1];
        *m_data='\0';
    }
    else
    {
      int length=strlen(str);
      m_data=new char[length+1];
      strcpy(m_data,str);
    }
}
String::~String(void)
{
    delete m_data;
    cout<<"析构函数被调用了"<<endl;
}
String::String(const String &other)
{
 cout<<"赋值构造函被调用了"<<endl;
 int length=strlen(other.m_data);
 m_data=new char[length+1];
 strcpy(m_data,other.m_data);
}
String &String::operator=(const String &other)
{
      cout<<"赋值函数被调用了"<<endl;
      if(this==&other)//自己拷贝自己就不用拷贝了
                 return *this;
      delete m_data;//删除被赋值对象中指针变量指向的前一个内存空间,避免
                    //内存泄漏
      int length=strlen(other.m_data);//计算长度
      m_data=new char[length+1];//申请空间
      strcpy(m_data,other.m_data);//拷贝
      return *this;
}
void main()
{
      String b;//调用构造函数
      String a("Hello");//调用构造函数
      String c("World");//调用构造函数
      String d=a;//调用赋值构造函数,因为是在d对象建立的过程中用a来初始化
      d=c;//调用重载后的赋值函数
}
1. 写一个函数实现字符串反转
版本1 - while版
void strRev(char *s)
{
 
 
 
 
 
 
 
 
 
}
用链表实现通用堆栈
#include <assert.h>
#include <stdlib.h>
typedef struct Stack//定义结构体
{
 int num;
 struct Stack *next;
}Stack;
/*尾节点:链表堆栈中最后一个入栈的节点*/
static Stack *stack;//指向尾节点的指针
int isempty()//判断是否链式堆栈是否为空
{
 return stack == NULL;
}
int isfull()//该情况不存在
{
 return 0;
}
void push(Stack *newStack)//结构体入栈,加入链表尾节点
{
 Stack *temp = (Stack *)malloc(sizeof(Stack));
 assert( !isfull() );//链表堆栈是否满
 assert( temp != NULL );//新节点空间分配是否失败
 temp->num = newStack->num;//新节点初始化
 temp->next = stack;//新节点指向旧的尾节点
 stack = temp;//链表堆栈指针指向尾节点
}
void pop()//删除尾节点
{
 Stack *temp;
 assert( !isempty() );//链表堆栈是否空
 temp = stack;//保存旧的尾节点
 stack = temp->next;//链表堆栈指针指向次尾节点
 free(temp);//释放旧的尾节点。注意:一定要释放,否则容易引起内存泄露
}
Stack f_top()//返回尾节点,但并不删除
{
 assert( !isempty() );//链表堆栈是否为空
 return *stack;//返回尾节点,但并不删除
}
void del_stack()//删除整个链表堆栈,释放内存空间
{ 
 while( !isempty() )
  pop();
}
                    
                
                
            
        
浙公网安备 33010602011771号