C++ 小细节2:复合类型

本文探讨了C++中的复合类型,包括C++11的初始化方式、数值转换问题,以及数组、指针、指针引用、new和delete操作、strcpy与strncpy函数的使用。还介绍了struct结构、union共用体和enum枚举的特性,强调了C++中指针的重要性及安全使用指针的方法。
摘要由CSDN通过智能技术生成

04/17/2020
10/27/2020

C++小细节2

C++11 初始化方式

//列表初始化
int b = {3};
int c{3};
int d{}; //初始化为0
char c1 {32325}; //Invalid, 因为char的范围-128~127
int x = 77;
char c2 = {x}; //Invalid, x 不是一个常量
int e {3.14};//Invalid, float 转 int 不行
int b[3]{1,2,3}; //数组
struct boy //结构体
{
	string name;
	int age;
};
boy Alex{"Jack",23};

大括号初始化的好处:可以防范类型转换错误

  • 不允许缩窄,例如浮点型转整型
  • 但是可以在整型之间转换。
    整型包括:char,short,int,long,long long;

数值转换问题

double 到 float,结果不确定如果值范围超标
float 到 int,小数部分被舍去;结果不确定如果值超标
long 到 short,通常只赋值右边的字节
bool 接受0,将转换为false,而非零的被转换为true;

复合类型

C++11 数组初始化

数组

int arr[3]{1,2,3};
int arr2[3]{};// 所有元素都设置为0

指针

  • 数据的3中基本属性
    • 信息存储在何处(分配内存)
    • 存储的值多少
    • 存储的信息是什么类型(数据类型)

C程序员使用

int *ptr;/*强调*ptr是一个int类型的值*/

C++程序员使用

int* ptr; //int*是一种类型--指向int的指针。
int* p1, p2; //注意:p1是指针,p2不是指针。

记住:指针初始化为一个确定的、适当的地址。
int* ptr = 23; //错误的

指针的引用

int i = 43;
int *p;
int *&r = p; //r是一个对指针p的引用,必须初始化
r = &i; 	//引用= 绑定,改变引用 = 改变引用对象的值,即改变了p的指向,指向i
*r = 0;		// p的指向i,i的值编程0

要理解r类型到底是什么,最简单的办法是从右往左阅读r的定义

new和delete

  • new创建对象,分配内存,delete释放对象
  • new和delete成对出现
  • new 数组与delete数组都需要有中括号
  • delete可以对空指针使用

指针算数

将指针变量加1,增加的量等于它指向的类型的字节数,就是数组下一个元素的位置。
有了指针算数就可以解释,指针指向数组第一个元素,数组可以赋值给指针,因为C++把数组名字解释为地址

int arr[3]{};//初始化都为0
int* pArr = arr; //指向arr的第一个元素的地址,arr被解释为地址
pArr = &arr[0];//另一种表示方式
//下面有什么区别
*(pArr + 1); //pArr移动到下标为1的元素, == pArr[1]
*pArr + 1; //当前地址解引用得到的值加上1;
//下面一样吗?
cout << sizeof(arr);//数组的长度
cout << sizeof(pArr);//得到的是指针的长度,即使它指向数组。
//下面一样吗?
cout << arr << endl; //下标为0的元素的地址 == &arr[0]
cout << &arr << endl;//整个数组的地址

题外话:操作系统是多少位?可以用指针来判断,因为指针指向地址。

如何接受整个数组的地址呢?

int* arr[3];
int (*arr)[3] = &arr; //指向一个有3个int元素的数组的指针,括号不能少。

strcpy 和 strncpy

char animal[10]{"tiger"};
char* pAnimal = animal; //把指针指向animal的下标是0的元素的地址;并不是赋值;
pAnimal = new char[strlen(animal)+1];
strcpy(pAnimal,animal);//第一个目标地址,第二个参数是字符串地址
strcpy(pAnimal,"I am a large tiger!");//超标会覆盖之后地址内存空间,导致其他数据被修改
strncpy(pAnimal,"I am a large tiger!",9); //赋值最多9个元素
pAnimal[9] = '\0';//最后一个被改成空字符。

struct 结构

C的结构声明和C++结构声明变量的区别,C++兼容C的内容。

struct boy //一个新类型boy诞生,不需要强调struct类型
{
	string name;
	int age;
};
struct boy Jack;//C
boy Jack; //C++, C++允许在声明结构变量时省略关键字const

结构中的字段

struct low_programmer //低级编程,课外拓展。
{
	unsigned int t1 : 4;
	unsigned t2 : 4;
	bool isFound : 1;
}

union共用体

  • 与struct结构类型,但只是共用一块内存,所以长度是最大的成员的长度
  • 为了节省空间

enum枚举

enum提供另一种创建符号常量的方式,可以代替const。

  • 枚举第一个元素默认初始化为0,后面元素依次递增1。
  • 没有为枚举定义算术运算
enum color {RED,ORANGE,BLUE,GREEN};
color cloth = RED;//Valid
color cloth = 4;//Invalid
cloth = color(3);//valid
cloth = RED + ORANGE//Invalid;
cloth = color(RED+ORANGE);//valid == 0 + 1; 输出是1

所以小细节在C++ primer 会有更多更好的解释和例子,C++ primer 的第二章也有少许的介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值