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 的第二章也有少许的介绍。