面试题(八)

python面向对象

http://www.imooc.com/article/3066

python内没有new关键字
python类方法的定义时第一个参数一定是self
@classmethod是类方法,传入的参数一定有cls
@property是对象属性的另一种定义方式,调用时不需要加上()。并且只有一个参数self

C++的构造函数和析构函数调用顺序

http://www.cnblogs.com/Aion/p/3429515.html

C++中构造函数的顺序是
1)如果某个类具体基类,执行基类的默认构造函数。

(2)类的非静态数据成员,按照声明的顺序创建。

(3)执行该类的构造函数。

即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数。
C++中析构函数的顺序是正好和构造函数反过来。

C++ union类型

http://www.cnblogs.com/xdotnet/archive/2011/04/20/cpp_union.html

union主要是共享内存,分配内存以其最大的结构或对象为大小,即sizeof最大的。

32位系统和64位系统区别

这里写图片描述
指针不论是什么类型在32位系统都占4字节,64位系统占8字节。

stack和heap区别

http://www.ruanyifeng.com/blog/2013/11/stack.html

这里写图片描述
这里写图片描述

C++多态

C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

struct A{
  void foo(){printf("foo");}
  virtual void bar(){printf("bar");}
  A(){bar();}
};
struct B:A{
  void foo(){printf("b_foo");}
  void bar(){printf("b_bar");}
};
那么 
A *p=new B;
p->foo();
p->bar();
输出为:
bar // 因为A为基类,所以要先调用基类的构造函数
foo // 由于foo没有声明为虚函数,所以调用的是基类的方法
b_bar // bar声明为虚函数,调用派生类方法

int * const / int const *的不同

首先注意,const int *p 和int const *p 是一样的。

int const * p = &a;
// pointer to const int
// 表示不能通过指针p修改a的值
int * const p = &a;
// const pointer to int
// 表示指针p不可以再指向别处了
int main()
{
   int i=10;
   int j=1;
   const int *p1;//(1)
   int const *p2=&i; //(2)
   p2=&j;//(3)正确的语句,p2可以改变指向
   int *const p3=&i;//(4)
   *p3=20;//(5)正确的语句,可以通过p3修改i的值
   *p2=30;//(6)错误的语句,不可以修改p2的值
   p3=&j;//(7)错误的语句,不可以修改p3的指向
return 0;
}

多进程和多线程

这里写图片描述

这里写图片描述

虚函数和纯虚函数

虚函数就是使用virtual定义的函数,基类可以在里面实现。
纯虚函数则是使用virtual void function a() = 0声明,也可看作接口。每个派生类都要有实现纯虚函数的具体方法。

sizeof(struct)

http://www.cnblogs.com/lazycoding/archive/2011/03/22/sizeof-struct.html

使用对齐的方式分配内存空间。

struct A{
 long a1; // 占8个字节
 short a2; // 占2个字节,但是8是其倍数,所以直接2+8 = 10
 int a3; // 占4个字节,但是10不是其倍数,加到12后有12+4 = 16
 int *a4;// 占8个字节,16是其倍数,直接16+8 = 24
};

C++内存释放

new -> delete
malloc -> free

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章