C/C++学习笔记

C/C++关键字介绍

2020-02-15  本文已影响0人  零岁的我

一、 typedef

typedef为C/C++的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。作用是为一种数据类型定义一个新名字,或者简化一些复杂类型的声明。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
1.用途示例——定义一种类型的别名(注意区别于#define)

typedef long byte_4;
typedef char* pStr;
pStr s1,s2; //s1,s2都被定义为char*类型
//区别与#defin,#defin只是简单的字符替换
#defin pStr1 char*
pStr1 s3,s4; //s3被定义为char*类型,而s4只是char类型

2.用途示例——定义新结构struct的新名字

typedef struct tagMyStruct{
  int num;
  int len;
}MyStruct;

上述例子定义一个新的结构类型struct tagMyStruct,并定义新结构类型的别名为MyStruct,可以使用Mystruct varName来定义变量,但是直接使用tagMyStruct varName定义变量是不对的,只能使用struct tagMyStruct varName。
3.用途示例——定义机器无关的类型,在目标机器上获得最高精度

//定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL; 
//在不支持 long double 的平台二上,改为:
typedef double REAL; 
//在连 double 都不支持的平台三上,改为:
typedef float REAL; 

也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
4.用途示例——为复杂的声明定义一个新的简单的别名。

typedef map<int,double,greater<double> > MYMAP; 

具体方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:

4.1 原声明:int *(*a[5])(int, char*);
变量名为a,直接用一个新别名pFun替换a就可以了:
typedef int *(*pFun)(int, char*);
原声明的最简化版:
pFun a[5];

4.2 原声明:void (*b[10]) (void (*)());
变量名为b,先替换右边部分括号里的,pFunParam为别名一:
typedef void (*pFunParam)();
再替换左边的变量b,pFunx为别名二:
typedef void (*pFunx)(pFunParam);
原声明的最简化版:
pFunx b[10];

4.3 原声明:doube(*)() (*e)[9];
变量名为e,先替换左边部分,pFuny为别名一:
typedef double(*pFuny)();
再替换右边的变量e,pFunParamy为别名二
typedef pFuny (*pFunParamy)[9];
原声明的最简化版:
pFunParamy e;


二、C语言中struct和C++中class的区别

注意C语言中是没有class关键字的。
C语言中struct和C++中class都是一种构造类型,结构体和类都可以看作是由用户自定义的一种复杂数据类型。
二者的区别可以总结为如下几点:

  1. C语言的struct中只能包含成员变量,而C++的class中不仅可以包含变量,还可以包含成员函数;
  2. C语言中可以通过结构体名来定义变量,C++中也可以通过类名定义变量。不同的是通过结构体定义的变量还是变量,而通过类定义的变量,有了新名称(对象)。

三、C++中struct和class的区别

C++中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,struct 只能包含成员变量,不能包含成员函数。而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。

C++中struct和class是可以通用的,但是有几个细节不同:

  1. struct中的成员变量默认是public属性的,class中的成员变量默认是private属性的;
  2. struct继承默认是public的,class继承默认是private的;
  3. class可以使用模板,而struct不能。

四、operator关键字

operator专门用于定义重载运算符的函数。
运算符重载的格式为:

返回值类型 operator 运算符名称 (形参列表)
{
  //todo
}

可以将operator 运算符名称这一部分看作函数名。
运算符重载函数除了函数名有特定的格式外,其他和普通函数并没有区别。

学习笔记啊,持续更新......

上一篇下一篇

猜你喜欢

热点阅读