C++小结<1>数据类型

以下内容主要一《C++ primer Plus》为参考

一、C++入门

1、 C++文件的后缀名为.cpp;C++是C语言的超集;C++使用coutcin等来进行输出和输入,需要使用编译指令using namespace std ; (该指令表示可以使用名称空间std内的任一定义名称,如果需要指定仅可使用std 名称空间的cou定义可以使用 using std::cout;)且需要包含文件iostream #include <iostream>
2、cout输出:cout << "hello word !" ;该指令后输出显示hello word ! ,指令的意思为将hello word !字符串插入cout输出流中。
3、endl控制符:cout << endl ;,表示重起一行,与\n的区别在于使程序在继续运行前刷新输出。
4、C++要求main()函数以函数头int main()开始,在main()函数中需要加一条return 0指令,若没有的话,编译器会自动加上(此种情况仅限于main()函数),在C++中括号()空着与(void)等价,使用分号;来表示一条语句的结束;以大括号{}来区分;
5、C++的注释与C相同,都是///*...*/
6、C++编码风格:
1)每条语句占一行
2)每个函数都以一个花括号开始,以一个花括号结束,两个花括号各占一行
3)函数中的语句都相对花括号进行缩进
4)与函数名称相关的圆括号附近没有空白,以和C++的内置结构(for循环等)相区别
7、声明语句和变量
例:int number ; 此处提供了两项信息,1)需要的内存,2)该内存单元的名称 ,C++与C的不同之处在于C++的变量声明可以在函数的任意位置,只需要保证在首次使用之前声明即可,C语言则是在函数的开头处声明;复制可用number = 0,也可以有:
赋值从右到左进行,0赋给b,b的值赋给a,cout << a 后输出0,此处cout首先将a替换为0,然后将0转换为字符’0’ ,之后进行输出;与C的printf()相比,更为智能方便,printf中需要指明输出的类型如printf("a: %d\n", a)使用printf输出a时的
8、cin输入:cin的使用cin >> a ; 信息流从cin流入a

#include <iostream>
int main()
{
	using namespace std ;
	int a ;
	int b ;
	a = b = 0 ;
	cout << a ;
	return 0 ;
}

9、函数的统一格式:

type functionname(argumentlist)
{
	statements
}

C++不允许将函数定义嵌套在另一个函数定义中。每个函数都是独立的,所有函数的创建都是平等的

二、数据类型

1、面向对象设计的本质是设计并扩展自己的数据类型,设计自己的数据类型就是让类型与数据匹配。
为把信息存储在计算机中,程序必须记录3个基本属性:1)信息的存储位置 2)存储的值 3)存储的类型信息
2、c++命名规则:1)在名称中只能使用字母字符,数字和下划线(_) ;2)名称的第一个字符不能是数字;3)区分大小写字符;4)C++的关键字不能用作名称;5)以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符;6)C++对于名称的长度没有限制,名称中所有的字符都有意义,部分平台有限制
3、

整型

1)C++的基本整型:char、 short、 int、 long、 long long(C++11新增),每种类型都有符号版和无符号版,其中char通常用于表示字符而不是数字
2)对于short、int、long、long long,C++要求的最小长度为 :short至少16位;int至少与short一样长;long至少32位,且至少与int一样长;long long至少64位,且至少与long一样长。不同的系统所分配的位数可能有所不同
3)可以使用C++工具来检测类型的长度,sizof()运算符可以返回类型或变量的长度,单位是字节,同时在头文件climits中包含了关于整型限制的信息,其定义了各种限制符号的名称,如INT_MAX是int的最大值,CHAR_BIT为字节位数,示例:

#include <iostream>
#include <climits>

int main()
{
	using namespace std;
	int n_int = INT_MAX ; //int的最大值
	short n_short = SHRT_MAX ; // short 的最大值
	long n_long = LONG_MAX ; //long的最大值
	long long n_llong = LLONG_MAX ; //long long的最大值
	cout << "int max:"<< n_int << endl ;
	cout << "int is " << sizeof(int) << " bytes " << endl ; //int分配的字节数
	return 0 ;
}

climits中的符号常量:

CHAR_BIT				char的位数				INT_MAX		int最大值
CHAR_MAX				char的最大值				INT_MIN		int最小值
CHAR_MIN				char的最小值				UNIT_MAX	unsigned int 最大值
SCHAR_MAX				signed char的最大值		LONG_MAX	long最大值
SCHAR_MIN				signed char的最小值		LONG_MIN	long最小值
UCHAR_MAX				unsigned char的最大值	ULONG_MAX	unsigned long 最大值
SHRT_MAX				short的最大值			LLONG_MAX	long long 最大值
SHRT_MIN				short的最小值			LLONG_MIN	long long最小值
USHAR_MAX				unsigned short的最大值	ULLONG_MAX 	unsigned long long 最大值

4)变量初始化
变量A的初试化可以使用另一个变量B,前提是B已经定义过,也可以使用表达式来对变量初试化,C++独有的变量初试化:示例

int number(32) ; //number初始化为32
int a{12} ; // a初始化为12
int c = {1} ; //c初始化为1
int b{} ; // b初始化为0
int d= {} ; // d初始化为0

大括号初始化也可用于数组、结构;大括号内不包含任何东西,变量将被初始化为0,且大括号初始化有助于防范类型转换错误;C++可以将大括号初始化用于任何类型,这是一种通用的初始化语法;
整型选择:通常,int被认为是目标计算机最自然的长度。自然长度是指计算机处理起来效率最高的长度;short比int小,使用short较为节省内存,若只需要一个字节可以使用char
5)整型常量
整型字面值:c++使用前一(两)位来标识数字常量的基数:若第一位是1~9则基数为10;若第一位是0,第二位是1-7则基数为8,若前两位是0x或0X则基数为16;
可以使用dec、hex、oct控制符来指示cout以十进制、十六进制和八进制格式来显示整数。如cout << oct之后cout输出以八进制输出,默认十进制
C++确定常量类型:如1499,在C++中除非有理由(有特殊的后缀或者值太大不能使用int存储)否则使用int类;
后缀:l或L表示为long型常量,如1049L,也可以在L前加上u或U表示无符号型;ll或LL表示long long型,也可以在前面加u或U表示无符号型
char整型:其是专为存储字符而设计的,在使用cout输出char型变量时,会自动将其内部的数字转换为对应的字符,在cin输入时会自动将字符转换为数字存储与变量所在的存储空间 ,char在默认情况下既不是有字符的,也不是无字符的,具体由C++的实现来确定,也可以显式的确定为有无字符 使用 signed char 或unsigned char
wchar_t:当程序中存在有字符无法用一个8位字节表示时,有两种解决办法:首先是编译器厂商将char定义为一个16位字节的或更长的,另一种是使用wchar_t可以表示扩展字符集。这种类型与与另一个整型的长度和符号属性相同,这个底层类型究竟是那个却决于实现,cin和cout将输入输出看作是char流,不适于wchar_t,可以使用wcin和wcout来处理
char16_t和char32_t:两者都是无符号的,前者16位,后者32位;前者使用小写u来表示字符常量和字符串常量如u’c’和u"hello",后者使用大写U来表示,如U’H’和U"hello"
6)bool类型
布尔变量的值可以是true和false,C++将非零值视为true,将零示为false
4、const限定符
符号常量主要有两种处理,首先是使用#define预编译来处理,此种处理无法确定常量在内存中所使用的位数和类型,更好的处理办法是使用const限定符,创建如:const type name = value;之后此变量的值就固定了,若程序中有试图修改此变量值的,则编译器会报错,指出试图给一个只读变量赋值
5、

浮点数

1)书写浮点数主要有两种方法首先是最常用的标准小数点表示法,如12.45,第二种为E表示法,如3.45E6,表示3.45乘以10的6次方所得到值,再如3.45E-6表示3.45除以10的6次方所得到的值,E可大写也可以小写。此方法通常用于表示一些很大和很小的数,E表示法数字中不能有空格,如3.23 e6即为非法
2)浮点类型:C++的浮点类型主要有3种:float、double、long double。其是按照它们可以表示的有效位和允许的指数最小范围来描述的。有效位:数字中有意义的位数;c和c++对有效位的要求是float至少32位,double至少48位,long double至少和double一样多。通常是float 32位,double 64位,long double为80、96或128位,3种类型的指数范围至少是-37至37,可以从头文件cfloat或float.h中得到
float、double位数分配:

种类		符号位			指数位				尾数位
float		第31位(占1bit)	第30-23位(占8bit)	第22-0位(占23bit)
double		第63位(占1bit)	第62-52位(占11bit)	第51-0位(占52bit)
尾数就是有效位
取值范围的大小主要看指数:float为-2^128-2^128
double 为-2^1024-2^1024

3)cout的输出可以使用cout.setf()确定其输出的小数点后的位数,以验证数字的精度
4)浮点常量:默认的浮点常量在程序中存储为double型,如2.12和2.3e9都会存储为double型,如果想存为float型可以在常量值尾部加上f或F,如2.13f或2.356e3F都会存储为float型
5)浮点数的优缺点:1)其可以表示整数之间的值;2)有缩放因子,可以表示的范围很大;3)其运算速度较整数慢,且精度会降低
6)C++运算符: +、-、*、/、%;其中优先级为先乘除后加减,同一优先级的看结合性是自左向右还是自右向左,例如如果是自左向右的话则先进行左侧的运算;除法中又分为int、float和double除法,若为int除法则,最终结果也为int小数点后的会被忽略
6、

类型转换

1)、C++自动执行的类型转换有以下3种情况:1)将一种算术类型的值赋给另外一种算术类型的变量时,会对值进行转换,变为被赋值变量的类型;2)表达式中包含不同的类型时,C++会对值进行转换,向上转换;3)将参数传递给函数时,C++会对值进行转换。
数值转换潜在的问题:

			转换														潜在的问题
1)将较大的浮点类型转换为较小的浮点类型,如将double转换为float 			精度(有效位数)降低,值超出目标类型的取值范围之后,系统会丢失部分数据,此时的结果将不确定		
2)浮点数转换为整型时													系统会舍弃浮点数的小数部分,若原来浮点数的值超出了目标整型的取值范围,此时的数值也将不确定
3)将取值范围较大的整型转换为取值范围较小的整型时,如将long转换为short		若原来的值超出了目标类型的表示范围,系统通常只取右边字节
4)0赋给bool变量时,会被转换为false		非0值会被转化为true

2)、以{}方式初始化时进行转换(C++11):
C++11把使用大括号初始化的称为列表初始化,这种初始化常用于给复杂的数据提供列表,其对数据的转换要求更为严格,不允许进行缩窄(即变量的类型可能无法表示赋给它的值),不允许浮点数转换为整型,但允许整数转换为浮点型和整型之间的转换可能是可以的(具体看需不需要缩窄,如果需要则不会被允许),用大括号进行初始化赋值时所赋的值需要是常量,不可以是变量,如:

/******#1*****/
const int x = 120 ;
int b {x} ;
int c = {10} ;
int d {10}
/*******#2*****/
int x1 = {10.1} ;
int b1 = 12 ;
int b3 = {b1}

以上#1出的均允许的,#2处的均为不允许
3)、表达式中的转换
C++在表达式中的转换分为:某些类型出现后自动转换,另一个则是一个类型与其他类型一起出现时会被转换。
自动转换:当表达式中出现bool、char、unsigned char、signed char和short值转换为int,true被转换为1,false被转换为0.称为整型提升,此规则提升不会使数据有所损失。
被动转换:此种情况通常是由于参与运算的数据类型不一致所导致的,此时的转换也是向上转换,也就是向取值范围更广的类型转换,小的类型会被转换为较大的类型
3)传递参数时的数据转换
4)强制类型转换
C++允许通过强制类型转换来显式的进行转换,可以通过以下方法来转换:

int x = 20 ;
/* #1 */
(long) x ;
/* #2 */
long (x) ;

以上#1的转换来源于为C语言,#2的转换是纯粹的C++,两者都是将int型的x转换为long型;除了上述2种转换以外C++还提供了4个强制运算符进行类型转换,它们的使用要求较为严格,后续会对其进行说明。

7、

数组

1)数组创建:typename arrauName[arraySize],同一数组内所有元素的类型都是一样的,且arraySize需为常量,且需是整数;可以是整型常量如(8)也可以是const值,也可以是常量表达式如(8*sizeof(float)),不能是变量(仅在初始化的时候不可以是变量,在后续的使用时是可以为变量的但要防止数组越界,如果数组越界的话编译器通常是不会报错的但是在运行过程中有出现问题的可能),后面的new运算符是可以是变量
2)可以单独访问数组中的单个元素,使用下标或索引来访问,且数组的最后一个元素的索引是(元素数-1,因为索引是从0开始的)
3)在数组初始化时可以对其进行赋值(通过大括号),若没有赋值则默认是0,同时在初始化时arraySize为非必须的,若其值为空则编译器会根据初始化时赋值的元素个数确定arraySize的值(通常不建议使用这种办法)
4)在C++11中初始化数组可以省略等号;可以在赋值的大括号内不包含任何东西,则默认每个元素都为0;列表初始化时禁止进行缩窄
5)数组名(arr)实际上表示的是数组元素的首地址即与&arr[0]相同,但从概念上说,&arr[0]表示的是一个int型的地址,而&arr表示的是3个int类型的内存块地址,若对arr +1 则地址增加一个int类型所占的字节数,若对&arr+1则增加的是3个int类型所占的字节数

int arr[3] ;

6)二维数组创建

int arr[3][4] = 
{
	{1, 2, 3, 5},
	{21, 32, 28, 65},
	{54, 89, 37, 64}
};//创建一个3行4列的二维数组
char cities [4][25] = 
{
	"BeiJing",
	"NanJing",
	"TianJing",
	"ZhenZhou"
};
string cititess[4] = 
{
	"BeiJing",
	"NanJing",
	"TianJing",
	"ZhenZhou"
};

8、

字符串

在C中字符串通常是存储于char型数组中,对char数组的初始化可以使用大括号,也可以不用大括号而使用双引号(此种方式下隐式的包括了字符串结尾的空字符,所以不用显式的包含;此时最好让编译器去计算元素数目,避免自己给定的arraySize不够使用)进行如下:

char arrayChar[9] = {'h','e','l','l','o''\0'};
char arrayChar_1[9] = "hello" ;
char array_Char_2[] = "hello"

上述3种都可以对char型数组进行初始话,在使用cout进行输出字符串数组时只需把数组名(即数组的首地址)给cout即可,cout输出至空字符结束;在使用键盘输入时,字符串读入char数组时,会自动在结尾加上空字符,在输入时要保证待存储的数组的空间足够的大;字符常量(单引号)不能与字符串常量(双引号)互换因为双引号实际表示的是双引号里内容的地址,而单引号的字符则是ASCII值,同时也不能直接将一个数组赋给另一个数组(可以使用遍历的方法来进行赋值);可以使用strlen()来确定数组的长度(以字节为单位,需要包含cstring文件),在使用cin进行输入时与cout类似,只需要把数组名给其即可,cin通过空白(空格、制表符、换行符)来确定一个字符串的结束(即其一次只能读一个单词);
读取一行的字符可以使用getline()和get(),这两个函数都读至换行符后结束:1)getline函数读取整行,它通过回车键输入的换行符来确定输入结尾,可以使用cin.get()来调用此方法。其有两个参数第一个是用来存储输入行名称的数组名称,第二个是要读取的字符数,getline()对回车符的处理是读取并丢弃,若输入的字符数不足第二个参数-1,则后面多余的均填充为空字符。2)get()函数读取整行,其传入的参数与getline()相同,也是到换行符结束读取,不同之处是get()不会读取并丢弃回车符,而是将其留在输入队列中,这样下一次使用get()读取时便会直接结束,可以使用cin.get()来跳过这个回车符,可以组合起来使用:cin.get(arrayName,arraySize).get();但get的此种问题也有一定好处,就是可以确定get()退出是由于数组已存满还是遇到了回车符,通过读取下一个字符若其不会直接退出则是数组满否则就是碰到了回车符
当get()读取到空行时会设置失效位,阻断接下来的输入,可以使用命令cin.clear()来恢复,当输入字符串比分配的空间长时,get和getline()都会将多出的字符留在输入队列中,单getline()会设置失效位,阻断后续输入。
9、

string类

要想使用string类需要包含string文件,且string包含在名称空间std中,所以需要一条using编译指令,例:

#include <iostream>
#include <string>

int main()
{
	uisng namespace std ;
	char arr[10] = "hello" ;
	char arr1[10] ;
	string str1 = "hello" ;
	string str2 ;
	cin >> arr1 ;
	cin >> str2 ;
	cout << arr ;
	cout << str1 ;
	cout << arr []
	return 0 ;
}

由上可知string类与char数组有很多相似之处,两者的主要区别在于string对象可以为简单变量,不必是数组;类设计程序让程序能够自动处理string的大小,即string类型的变量存储的字符串长度不是固定的,是可变的而char型数组一经声明定义则其可存储的字符串长度就以经固定。
string变量可以直接其值赋给另外一个string变量,也可以进行string类变量之间的拼接和附加,如下:

#include <iostream>
#include <string>
int main()
{
	using namespace std ;
	string str1 = "hello" ;
	string str2 = "word" ;
	string str3 ;
	str3 = str1 +' ' + str2 ;
	str3 += '!' ;
	cout << str3 ;
	return 0 ;
}

最终的输出为hello word!
获取string对象的字符串的字符数可以使用size()方法,具体为:int len = str1.size()
输入字符串给string类:getline(cin,str1)
10、

结构

1)定义:
struct为关键字,表明代码定义的是一个结构布局,标识符是这种数据格式的名称。

struct 新类型标识符
{
	数据类型
}

2)创建变量:标识符 变量名 ;即可不需要struct关键字(C中需要,所以C中常使用typedef将其整个重新定义一个名字,以便于使用)
3)使用:

#include <iostream>
#include <string>
using namespace std ;
struct student
{
	string name ;
	int age ;
	int sex ; 
} ;
int main ()
{
	student f1 ;
	f1 = {"zhang hua", 22,1} ;
	cout << f1.name << " is a " << f1.age << " years ";
	if(f1.sex)
		cout << "boy" ;
	else cout << "girl" ;
	return 0 ;
}

如上所示:对结构体变量的访问可以使用句点法来访问,需要记清楚结构体内定义的变量的名即可,同时也可以通过句点法去修改变量的某一值,也可以通过大括号进行所有值的修改
4)结构数组
结构数组的创建与普通数据类型创建数组的方法基本类似,示例如下:

#include <iostream>
#include <string>
using namespace std ;
struct student
{
	string name ;
	int age ;
	int sex ; 
} ;
int main ()
{
	student students[12] ;
	students[0] = {"zhang hua", 22,1} ;
	cout << students[0].name << " is a " << students[0].age << " years ";
	if(students[0].sex)
		cout << "boy" ;
	else cout << "girl" ;
	return 0 ;
}

其对结构体内数据的访问与修改也是通过句点法来表示,从某种程度上可以认为结构体就是利用C++所提供的基本数据类型,组合而成的自己需要的一种新类型,其使用与C++基本数据类型的访问基本一致
结构中的位字段:
与C语言一样,C++也允许指定占用特定位数的的结构成员,这种方法主要用于创建与硬件相关的寄存器对应的数据结构,字段的类型应为整型或枚举,然后冒号,后面是数字用于指定位数,示例:

#include <iostream>

int main()
{
	struct f1_register
	{
		unsigned int bit7_6 : 2 ;
		unsigned int EXT_SYNC_SET : 3 ;
		unsigned int DLPF_CFG : 3 ;
	};
	f1_registr = {0x0,0x4,0x5} ;
}

11、

共用体

共用体与结构体有些许相似之处,不同之处在于:共用体虽然可以声明多种数据类型,但只能使用其中的一种,共用体所占的存储空间是它所声明的类型中需要空间最大的类型的空间,而不是所声明的各类型所需空间之和(结构体是这样的)可以发现共用体相较于结构体占用内存较少。关键字为union,示例:

union f1
{
	int i;
	float f ;
	double d ;
};

f1 number ;
number.i = 12 ;
number.f = 10.1 ;

同时可以将共用体嵌套进入结构体中,此时的共用体称为匿名共用体,共用体内的成员可以被视为是结构体的成员(因为共用体是匿名的,单所需要的内存长度是共用体所需要的长度,节省内存)示例:

struct student
{
	string name ;
	int classes ;
	union
	{
		int score_i ;
		float score_f ;
	};
}
student f1[2] ;
f1[0].name = "zhao zi long" ;
f1[0].classes = 316 ;
f1[0].score_i = 91 ;
f1[1].name = "zhang fei" ;
f1[1].classes = 310 ;
f1[1].score_i = 70.5 ;

12、

枚举

关键字为enum,枚举提供了一种创建符号常量的方式,另一种方法是const,示例:

enum color {red, orange, green, blue, violet, indigo, ultraviolet};
color band ;
band = red ;
band = 1 : //错误
band = color(1) ; //可以

color为新类型的名称,被称为枚举,类似struct变量被称为结构,color中的red 、orange、green等作为符号常量,对应整数值0 - 7,这是默认的赋值,也可以手动的赋值,后方没有赋值的在前方变量的基础上依次增1,枚举量的特殊属性:
1)只能将定义枚举时使用的枚举量赋给枚举变量,非枚举量赋给枚举会报错
2)枚举量是整型,可以被提升为int型,但int型不能自动转换为枚举型(否则报错)
3)枚举量没有+运算符,所以不允许枚举量之间运算之后在赋给枚举变量(实质是进行运算时整型会自动提升为int型,但枚举变量不能自动将int型转换为枚举型)可以通过强制类型转换。
13、指针
指针是用于存储值的地址,所以指针名表示的是地址,使用*号可以得到指针中所存储的地址中所存储的数值,使用&运算符可以得到存储数值的地址。
1)指针声明:因为不同的数据类型所所需要的字节数是不一样的,所一指针声明必须指出指针所指向的数据类型,不可将其他类型数据的地址赋给该地址。例:

int *p ;

该例声明了一个指向int类型的指针,(*号两边的空格是可选的,在C++中int * 是一种符合类型,是指向int的指针 )
注:在C++中创建指针时,计算机只分配用来存储地址的内存而不分配用来存储指针所指向的数据的内存,如下则为错误的:

int *p ;
*p = 200 ; //200不知道存储在何地

在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的,适当的地址
对于指针不能直接将数值符给指针,虽然计算机通常是将地址当作整数处理的,但两者是不同的概念,对整数可以进行乘除运算,但对地址进行相乘运算则没有任何意义,指针可以进行加减运算所加的是指针类型所占的字节数。示例:

int *p ;
p = 0xC80000; //错误,整数不能直接赋给指针
p = (int *)0xc800000 ; // 通过强制类型转换则是可以的

对于cout来说若提供给其一个指针则其通常会打印楚指针内存储的地址,但若是char *型则会打印出该指针所指向的字符串,字符串常量双引号实际表示的是地址,为字符串中首个字符的地址,所以字符串可以直接赋给指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值