c++教程-数据类型简介

前言:考虑到c++兼容c语言,但又有所区别。先讲c语言中的类型。
考虑到是面向新手,仅做了简单介绍。我会在每段最后附上链接,在另外的地方进行深入探讨。

一丶c语言中的类型

1.基本数据类型

(1)数值类型

整形:int
int在32和64位windows系统中均为4字节。
长整形:long
long在32位系统中4字节,在64位系统中8字节。
扩展:long long类型在32位和64位系统中均为8字节。
短整形:short
short在32和64位windows系统中均为4字节。

(2)浮点型

单精度: float
在32和64位系统中均为4字节。有效数字位(包括整数小数部分)为6-7位(必定保证长度6位的数字准确,有部分7位数字准确,建议超过6位数字的用double)
双精度: double
在32和64位系统中均为8字节。有效数字位为15-16位
传送门:浮点数进阶

2.字符类型

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定义的函数不需要返回值。

二丶c++增加的类型

1.c++的struct结构体与c的一些区别

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; 这是不被允许的。
传送门:引用进阶

4.class类型

class类:

  • c++面向对象思想的主要实现。
class MyClass
{
public:
		//公共访问权限
protected:
		//保护,限制外部用户访问(非派生类,非友元)
private:
		//限制外部用户及派生类访问
};

传送门:class进阶详解

5.string字符串

相比较于c语言中的字符序列,c++的string类有一套自己的体系。有各种定义好的功能完善的成员函数供程序员使用,使得项目做起来更加便捷。
这里看到一篇比较详细的博客:string详解

6.c++中的const

const修饰的类型代表只可读,不可修改。

c++的const比c语言严格,不像c语言函数参数可以用c普通类型接受const类型。

  • 常数据成员的初始化必须要采用初始化参数列表(不可直接赋值)。
class MyClass
{
public:
	MyClass(int num);
	const int m_constNum;
};
//构造函数
MyClass::MyClass(int num):m_constNum(num)  //参数列表
{
	
}
  • const修饰的常成员函数在该函数中不能修改数据成员
void func() const; 			//声明常成员函数

void MyClass::func() const	//定义
{
}
  • 允许void func();和void func() const;同时存在类中。(不是重载)
    但准守以下规则:
    1.普通对象可以调用普通函数(指不带const的)或者常成员函数。
    2.普通对象优先调用(当调用func();时)普通函数。
    3.常对象(const修饰的对象)只能调用常成员函数。

7.c++中的static

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指针。

8.auto自动推断类型

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_ptr<int> pInt;

本质是个模板类,通过类的对象生命周期的自动结束,实现内存的自动释放(把指针当做对象去处理)。

  • 弱引用指针
weak_ptr<int> pInt;

这个指针的出现主要是为了解决shared_ptr循环引用导致的内存未被释放的问题。该指针不会累计计数。

  • unique_ptr
unique_ptr<int> pInt;

限制了任何时候都只能存在一个操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小冯爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值