C++中的各种小细节(三)

十一、创建数组的两种形式

形式一:

        #define N 10
        int a[N];
	int n = 10;
	int b[n];//编译报错

注意这种定义数组的形式有很多缺点,例如:1:数组的长度必须是在编译时就知道的,即数组的长度不能改变,
在定义数组指定数组的长度值必须为一个常量值,2:数组只在定义它的语句块内存在,因为这种形式属于是编译器
自动在栈内存为数组分配空间。

形式二:

        int n = 10;
	int *c = new int[n]();//编译成功通过

动态分配数组时,可以用一个变量指定数组的长度,即程序可以在运行时动态的去判断数组的实际长度,而且
数组的内存空间是在堆内存中,数组的内存数据存在时间受程序员自己控制。
注意:在形式二中,1:即使当程序运行时得出数组的长度为0,程序也不会出错,因为调用new动态创建长度为0的
数组也是合法的。2:在程序的结尾程序也一定要显示的自己去释放数组的动态空间。


十二、C++string类型和c风格字符串代码的相互兼容

1:c风格字符串转换成string类型对象

int a[1];
	int * b = new int[0]();
	string str("asd");//直接构造一个string新对象
	string ss = (string)("asd");//使用强制类型转换成string对象
	cout<<ss<<endl;//输出asd

2:string类型对象转换成c风格字符串
直接调用string类型成员函数.c_str()即可

const	char * s = str.c_str();
	while (*s)
	{
		cout<<*s<<flush;
		s++;
	}//输出asd

十三、用typedef简化多位数组的指针
在C++中当要定义指向数组的指针时,一个很灵活的方法就是用typedef类型定义,这将会
使该指向数组的指针更加的易读、易写和方便理解。

For Examp:
        typedef int int_array[4];//声明int_array是一个有4个int类型元素的数组类型
	int_array a;//a是一个有4个int类型元素的数组类型,即a为int * 类型对象
	//测试a
	a[0] = 1;
	a[1] = 2;
	a[2] = 3;
	a[3] = 4;
	int * p1 = a ;
	//int * * p2 = a;//错误原因:“不能将int* 类型赋值给int**类型”
	for(int i = 0;i<4;i++)
	{
		cout<<a[i]<<flush;  
	}//输出1234

	//用typedef简化多位数组的指针
	int_array * p;//声明p是一个指向数组的指针,而且该数组必须是一个含有4个int类型元素的数组
	int array[2][4]= {{1,2,3,4},{5,6,7,8}};
	p = array;
	for(int i = 0;i<2;i++)
	{
		for(int j = 0;j<4;j++)
		{
		  cout<<p[i][j]<<flush;
		}
	}//输出123456789

十四、按位操作中的左移、右移
注意:使用左移操作符时,将会在左边插入0以补充空位,而对于右移操作符时,
如果其操作数是无符号数,则从右边开始插入0,如果是有符号数,则插如符号位的副本或者0值。


十五、赋值操作符的右结合性
赋值操作符是从右往左结合的,且其返回值是左值。


C++中的各种小细节(三),布布扣,bubuko.com

C++中的各种小细节(三)

上一篇:C++中的各种小细节(二)


下一篇:《C++ Primer第五版》读书笔记(9)--ASSOCIATIVE CONTAINERS