<<程序员面试宝典>>读书笔记 2

  • 函数指针的应用
#include<stadio.h>
int jug(int x,int y)
{
    if(x>=0||y=0){
    return x;
    }
    else 
      return x/y;
}

int sub(int x,int y) {
   return (x+y);
}

void test(int (*p)(int,int),int x,int y)
{
  int i=(*p)(int,int);
  print(“a=%d,a=%d %d\n”,a,b,i);
}


  • STL容器
    两大类序列容器和关联性容器。
    常用的几个容器:

vector,内部数据结构为数组。随机访问每个元素所需要的时间为常量,在末尾增删元素与元素数目无关,在中间或者开头增删则与元素数目呈线性关系。
vector可动态增删,内存管理自动完成,但我们可用reserve成员函数来管理内存。
迭代器在内存分配时讲失效,指向被删除元素以后的任何元素的迭代器都将失效。

deque与vector基本相似,主要区别就是deque可以在两端迅速增删。

list双向环状链表,不能随机访问一个元素,但可以双向遍历,在任意位置增删所需的时间均为常量,增加元素时迭代器不会失效。删除时也只有指向被删除的元素的迭代器会失效。

set,按照key来进行升序存储元素。

map,按照key,值来进行快速增删改查,默认升序。

1.OO编程语言必须提供对象,类,和继承。

2.对于一个空类,编译器默认产生4个函数,默认构造函数,析构函数,拷贝构造函数,赋值函数。

3.静态成员变量是在这个类中所有对象间共享,如果想限制对静态成员变量的访问可以将它声明为保护型或私有型,不允许用静态成员变量去存放某一个对象的数据。
常量必须在类成员初始化列表内初始化,或将其设成static。

4.析构函数可以是内联函数。

5.将基类的析构函数设为virtual型,则所有派生类的析构函数都将自动变为虚拟型,这保证在任何情况不会出现由与析构函数未被调用而导致的内存泄露。

6.虚函数采用一种虚调用的办法。特别允许我们调用一个只知道接口而不知道其准确对象类型的函数,但是要创建一个对象必须知道它的准确类型。

7.实现虚函数需要对象附带一些额外信息,以使对象在运行时可以确定该调用哪个虚函数。对大多数编译器来说,这个额外信息的具体形式是一个称为vptr(虚函数表指针)的指针。vptr指向的是一个称为vtbl(虚函数表)的函数指针数组。每个有虚函数的类都附带有一个vtbl。当对一个对象的某个虚函数进行请求调用时,实际被调用的函数是根据指向vtbl的vptr在vtbl里找到相应的函数指针来确定的。

8.编写String类的析勾函数,构造函数和赋值函数。

Class MyString
{
  public:
  MyString(const char*str=NULL);
  MyString(const MyString&other);
  ~MyString();
  MyString& operator=(const MyString&other);
  private:
  char* data;
}
MyString::MyString(const char*str)
{ 
  if(str==NULL)
  {
  data=new char[1];
  *data='\0';
  }
  else{
  data=new char(strlen(str)+1);
  strcpy(data,str);
  }
}
MyString::~MyString()
{
 delete []data;
}
MyString::MyString&(const MyString&other)
{
 int length=strlen(other.data);
 data=new char(length+1);
 strcpy(data,other.data);
}
MyString& MySting::operator=(cosnt MyString& other)
{
 delete []data;
 int length=stelen(other.data);
 data= new char(length+1);
 strcpy(data,other.data);
 return *this;
}

你可能感兴趣的:(<<程序员面试宝典>>读书笔记 2)