扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
文章目录前言:考虑到c++兼容c语言,但又有所区别。先讲c语言中的类型。
创新互联公司是一家专注于成都网站制作、做网站与策划设计,江西网站建设哪家好?创新互联公司做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:江西等地区。江西做网站价格咨询:18980820575
考虑到是面向新手,仅做了简单介绍。我会在每段最后附上链接,在另外的地方进行深入探讨。
整形:int
int在32和64位windows系统中均为4字节。
长整形:long
long在32位系统中4字节,在64位系统中8字节。
扩展:long long类型在32位和64位系统中均为8字节。
短整形:short
short在32和64位windows系统中均为4字节。
单精度: float
在32和64位系统中均为4字节。有效数字位(包括整数小数部分)为6-7位(必定保证长度6位的数字准确,有部分7位数字准确,建议超过6位数字的用double)
双精度: double
在32和64位系统中均为8字节。有效数字位为15-16位。
传送门:浮点数进阶
char:32和64位系统都占一个字节。
3.构造类型数组:
通常数组的基本形式可以写成:数组名【常量表达式】
数组名由程序员决定,常量表达式指的是0,1,2,3…这样的不变量,是不允许使用变量作为数组长度的。比如:int arr[a];
拓展:以const标识的变量(const标识的值不能再改变)在c++中允许作为常量表达式。c语言不能这么写
允许:
int arr[3]; //定义了一个未初始化的整形数组
这个例子中,数组长度为3,允许存放3个int类型的数据。不难想象,我们还可以定义不同类型的数组,例如:
long LongArr[3]; //存放3个long类型数据
short ShortArr[3]; //存放3个short类型数据
struct StructArr[3]; //存放3个结构体
int* PIntArr[3]; //存放3个int指针
数组的使用:
int arr[3] = {1,12.33}; //定义了一个已初始化的数组
int a = arr[0]; //将数组第一个位置(arr[0])的值赋值给a
printf("%d", arr[1]); //以c语言的方式将arr[1]的值(即12)显示到控制台
传送门:数组进阶
结构体:struct
struct MyStruct
{int a;
int arr[3];
int* p;
};
从这个例子中,不难看出,结构体可以存放各种类型的数据,不包括函数。
注意:c语言的结构体和c++的结构体有区别,下面会讲c++的结构体。
结构体的使用:
struct MyStruct struct1; //创建了一个名为struct1的MyStruct结构体
struct MyStruct struct2; //创建了一个名为struct2的MyStruct结构体
struct1.a = 3; //给struct1结构体里的a赋值3
struct2.a = 6; //给struct2结构体里的a赋值6
struct1.arr[0] = 33; //给struct1结构体里的数组arr第一个位置赋值33
struct2.arr[0] = 66; //给struct2结构体里的数组arr第一个位置赋值66
共用体(联合):union
结构上union与struct类似
union MyUnion
{int a;
int b;
int arr[3];
int* p;
};
但是用起来却和struct有很大区别。
共用体(联合)的使用:
union MyUnion union1; //创建一个名为union的联合
union1.a = 1; //将union1中的1赋值为1
printf("%d", a); //此时输出a到控制台为1
union1.b = 2;
printf("%d", b); //此时输出b到控制台为2
printf("%d", a); //此时输出a到控制台为2,为什么?
经过几遍尝试,发现共用体中只有最后的赋值(这个例子中a赋值在前,b在后)才会正确显示,给人一种后者覆盖前者的感觉。
所以,共用体顾名思义就是所有数据共用一块内存,只有最后赋值的数据生效。当不太确定是否要用到结构中所有的数据时,建议不要使用共用体。
枚举:enum
enum MyEnum{enum_0, enum_1, enum_2};//定义了一个名为MyEnum的枚举类型
这时你就有了3个有名字的可以使用的常量,enum_0代表0,enum_1代表1,enum_2代表2。显然,它是自动从0按顺序给定值得。
枚举的使用:
//这里举一个游戏中控制方向常用到的例子
enum Direction{UP, RIGHT, DOWN, LEFT}; //使用大写更规范
//key为玩家按下的按键值
if(key == UP) //当玩家按上方向时执行的代码
{}
else if(key == DOWN)//当玩家按下方向时执行的代码
{}
在其它功能的地方,也同样可以使用这四个值来对应。这样,就不必使用0,1,2,3可读性几乎为0的值来标识方向了。
4.指针类型指针作为c语言的灵魂,亦是重难点。
举例一些指针:
int* pInt = NULL; //定义了一个int类型的指针,并指向空(初始化为空)
short* pShort = NULL;
char* pChar = NULL;
int* SomePInt[3]={0}; //指针数组:存放多个int类型指针的数组
struct MyStruct* pStruct1 = NULL;
void* pVoid = NULL; //空指针,也叫万能指针,有兴趣可以研究下
指针的使用:
//每个数据(无论是自己定义的,还是系统中的)都存放在内存中
int a = 2; //这里有一个变量a。
int* pInt = NULL; //有一个Int指针,暂且为空
pInt = &a; //&表示取a的地址,指针存放的是地址
printf("%d", *pInt);//*取地址对应存放的值
传送门:指针进阶
5.空类型void:
一般用来定义函数,void function();,void定义的函数不需要返回值。
struct MyStruct
{int a = 3; //c++允许使用默认值
void function() //c++允许存在函数
{}
{
c++的结构体和它的class比较类似,有public,protected,private权限的划分,也有构造函数,可以有属性函数。
struct的使用:
MyStruct struct1; //c++不需要写struct MyStruct struct1
2.bool类型bool bFlag = 0; //不成立
bool bFlag = 666; //成立
非零值表示成立,只有0和空(NULL)表示不成立,占有一个字节。输出到控制台时,只显示0和1(不显示其它数字)。常用在if判断语句中.
3.引用类型int Num = 1;
int &b = Num;
上述代码中,b就是Num,Num就是b(用使用Num的方式,换成b也一样)。从内存的角度也是。int &b = 1;这是不被允许的。
传送门:引用进阶
class类:
class MyClass
{public:
//公共访问权限
protected:
//保护,限制外部用户访问(非派生类,非友元)
private:
//限制外部用户及派生类访问
};
传送门:class进阶详解
5.string字符串相比较于c语言中的字符序列,c++的string类有一套自己的体系。有各种定义好的功能完善的成员函数供程序员使用,使得项目做起来更加便捷。
这里看到一篇比较详细的博客:string详解
const修饰的类型代表只可读,不可修改。
c++的const比c语言严格,不像c语言函数参数可以用c普通类型接受const类型。
class MyClass
{public:
MyClass(int num);
const int m_constNum;
};
//构造函数
MyClass::MyClass(int num):m_constNum(num) //参数列表
{}
void func() const; //声明常成员函数
void MyClass::func() const //定义
{}
static修饰的静态数据成员属于所有对象共有的。(一个对象改了,同步到所有对象)(内存共享)
class MyClass
{public: //也受权限限定
MyClass();
static int m_num;
};
//必须先初始化在全局区(分配空间)
int MyClass::m_num = 1;
int main()
{MyClass class1;
MyClass class2;
class1.m_num = 2; //当class1修改了,class2同样会修改
MyClass::m_num = 2; //也可以不借助对象修改
}
static修饰的静态成员函数:
static void func();
准守以下规则:
1.静态成员函数不能直接访问非静态数据成员(函数内)。
2.静态成员函数没有this指针。
Tips: 需要有推断依据
class MyClass
{public:
MyClass();
void func();
};
//得到成员函数指针
void (MyClass::*pfunc)() = &MyClass::func; //函数指针
auto func = &MyClass::func; //自动推断
看到如果直接用它原来的样子,会比较麻烦,这时用auto就会比较方便。
auto num = 3; //int
auto Fnum = 3.3; //float
还有这些,都是能正确推断的。函数指针有它固有的形式,int类型,float类型也能很好分辨。
9.其它c++还有很多的数据类型,这里就不一 一详细介绍了。
shared_ptrpInt;
本质是个模板类,通过类的对象生命周期的自动结束,实现内存的自动释放(把指针当做对象去处理)。
weak_ptrpInt;
这个指针的出现主要是为了解决shared_ptr循环引用导致的内存未被释放的问题。该指针不会累计计数。
unique_ptrpInt;
限制了任何时候都只能存在一个操作
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流