第一篇
1. 指针初始化
int * p1 = new int(10)
int * p2 = new int[10]
int * p3 = new int[10]()
P1是初始化一个整型变量,初始化值为10。
p2,p3是一个指向数组的指针。
对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数。
对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()。
2. enum枚举
enum枚举类型是C/C++中的一种数据类型,与struct和class一样是用户自定义的类型,其特点在于enum类型的变量取值是有限的,是可以一一列举出来的。
enum bool {false,true}; //bool类型就是C++预定义的枚举
枚举在C语言标准里面定义的就是整型,不管哪个编译器都遵循这个标准。
在系统内部,C语言会把枚举变量和常量作为整数来处理,默认情况下,编译器会把整数0、1、2、3……赋给特定枚举中的常量。
enum {Sun, Mon = 5, Tue, Wed, Thu, Fri, Sat} d1, d2, d3, d4;
d1 = Sun; //初始化
d2 = Mon; //初始化
d3 = Tue; //初始化
d4 = Wed; //初始化
cout << d1<<endl;
cout << d2 << endl;
cout << d3 << endl;
cout << d4 << endl;
程序输出为:0, 5, 6, 7
d1,d2,d3,d4在函数内部定义时,一定要进行初始化,不然会是一个随机值。
d1,d2,d3,d4在函数外部定义时,自动进行初始化,值0。
3. 指针和数组的sizeof
32位机器上:
void example(char acWelcome[]){
printf("%d",sizeof(acWelcome));
return;
}
void main(){
char acWelcome[]="Welcome to Huawei Test";
example(acWelcome);
printf("\n%d\n", sizeof(acWelcome));
return;
}
程序输出:
4
23
数组作为函数的参数是会退化为函数指针(数组作为函数参数的时候经常是需要传递数组的大小)
sizeof(数组): 数组占用空间的字节数(会计算进结束符号:\0,占据一个字节)
sizeof(指针) :机器地址的位数
4. 虚函数与函数重载
虚函数是类的成员函数,而函数重载可以是类的成员函数也可以是非成员函数:
int fun(int a);
int fun(int a, int b);
函数重载不需要是成员函数,在类外声明或定义的函数同样可以对其进行重载.但是虚函数必须是某个类的成员函数。
重载的调用主要根据参数个数,参数类型,参数顺序来确定, 函数重载是忽略返回值的
虚函数和函数重载都实现了C++的多态性,但表现形式不一样,函数重载调用根据参数个数、参数类型等进行区分,而虚函数则是根据动态联编来确定调用什么.
多态性分为编译时多态性和运行时多态性:
(1) 编译时多态性通过静态编联完成,例如函数重载,运算符重载;
(2) 运行时多态性则是动态编联完成,主要通过虚函数来实现;
备注:
虚函数可以在子类中进行重载,也可以不重载而沿用父类中的方法。但纯虚函数必须重载,因为在其声明类中没有函数实现。包含纯虚函数的类为抽象类,抽象类不能声明对象,只能作为基类。
5 强制类型转换
char str[] = "glad to test something";
char *p = str;
p++;
int *p1 = reinterpret_cast<int *>(p);
p1++;
p = reinterpret_cast<char *>(p1);
printf("result is %s\n", p);
reinterpret_cast用来将类型A按照类型B来解释。这样,就可以按照B类型来处理对象,当需要再按照A类型处理时,则需要再次使用该关键字将对象按照A类型解释。这样使用不安全,但是有时候非用不可。
(1) reinterpret_cast是强制转换但编译器不检查
(2) static_cast 是强制转换编译器在编译时检查(推荐的)
(3) dynamic_cast 是强制转换编译器在运行时检查
功能一样(至少在强制转换上是一样),但是安全性不一样