眨眼大三就过了一半了,来年就要准备上战场了,感觉颇有压力。近日开始重新翻读C++,不看不知道,看了吓一跳,发现在自己不懂的还很多。于是下定决心,静心研读,打好基础,每日多待图书馆。
近日看到了一本名叫《程序员面试宝典》的书,感觉里边讲的很多东西都很中肯,正好能打中我的缺点,于是每日去读一点,并把感觉比较重要的记在这里,方便以后阅读。
一、static
static可以限制作用域,即只能够在本文件中使用。
(static的三种使用请参看本栏目中《
static关键字的作用
》)
二、类/结构体的大小
空类的大小为1,不含虚函数的类的大小等于其去除所有方法后的大小,含虚函数(无论数量)大小+sizeof(int)(一个指针指向虚函数表)
结构体(类)的大小问题:
(1)结构体对齐规则,自动设置下,按最大成员长度对齐
(2)继承规则,继承情况下子类与父类相互独立,子类的大小=父类大小+子类大小(不考虑继承时大小);
子类的对齐时要考虑父类。
需要特别指出的是,如果有虚函数继承,只需要加一次指针大小,而不需要父子都加。
class A
{
char a;
double c;
int b;
};
class B:public A
{
int b;
};
sizeof(A) = 24;
sizeof(B) = 32;
三、指针
指针可以说是C++中一个很重要的概念,也是C++极有一用的一个特征。但是确也令很多人感到反感,确实,指针如果使用不好,极有可能带来灾难性的后果,这个我是深有体会的。
废话少说,言归正传。
1、注意指针类型
int a[2][4] = {1,2,3,4,5,6,7,8};
*(a+1) 为 5;
int a[] = {1,2,3,4};
*(m+1) = 2;
*(&m+1) 指向第5个元素(虽然不存在)
2、malloc/free C/C++语言中的库函数
new/delete C++中的运算符
四、类的几点注意
static成员必须在类声明以外显示初始化
const成员必须在构造函数初始化列表中初始化
class A{
A():a(0){};
const int a;
static int b;
static const int c=100;
}
int A::b = 0;
struct与class的唯一区别
默认成员保护级别与默认的派生保护级别
class:private
struct:public
派生类构造函数的合成
默认情况:先调用直接基类的默认构造函数,再调用自己的构造函数
指定情况:class B:public A{
B(int m,int n):A(n){}
}//只能初始化直接基类
析构函数:编译器显示地调用派生类对象基类部分的析构函数,每个析构函数只负责清除自己的成员
派生类中定义的函数不重载基类成员,局部作用域中声明的函数不重载全局作用域中定义的函数
例:void fun(int);
void main{
void fun();
fun(1);//error
}
对象不是多态的,将派生类对象复制到基类对象时,派生类对象将被切掉。要想使用多态,必须使用
引用或指针。
一个空类将自动生成以下四个函数:
A();
A(const A&);
A& operator=(const A&);
~A();
C++新标准中加入了虚函数返回值的松散规则(下面这种写法是合法的)
class A{
public: virtual A* clone()=0;
}
class B:public A{
public: virtual B* clone(){};
}
五、宏定义
条件编译、带参数宏定义(#/##)
#define ABC(a) printf("this is "#a);
#define s5(a) supper_ ## a
void supper_printf( ){cout<<"super"<<endl;}
int main(){s5(printf)();return 0;}