python面向对象
python内没有new关键字
python类方法的定义时第一个参数一定是self
@classmethod是类方法,传入的参数一定有cls
@property是对象属性的另一种定义方式,调用时不需要加上()。并且只有一个参数self
C++的构造函数和析构函数调用顺序
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区别
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