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

六:string::size_type 类型
string::size_type 类型对象用来存储string类型中的成员函数size()的返回值。任何存储string的size操作结果的变量必须为
string::size_type 类型。特别应该注意的不能把size()的返回值赋值给一个int类型的变量。
因为在有些机器上int变量的表示范围太小,甚至无法存储实际并不长的string对象。所以为了解决该问题string类型和许多其他库
类型一样都定义了一套配套类型,能够使库的使用与机器无关。


七:vector<type>::difference_type、vector<type>::size_type
vector<type>::size_type 类型用于存储该容器的大小值,vector<type>::difference_type 类型用于存储该容器类型的两个迭代器
之差的值类型。


八、指针的状态
C++中指针的状态有有效状态和非有效状态,其中有效状态可以分为两种情况:情况一:该指针保存一个特定对象的地址;情况二:
该指针保存的值是0,当该指针所保存的值是0时,表明它不指向任何对象,因为在C++中所有的内存地址值都是大于0的数。
另外的非有效状态的指针也就是,没有被初始化的指针了,对于大多数的编译器来说,在未初始化的指针中保存的是一个不确定的值,
而如果对该保存不确定值的指针进行解引用时通常都会导致程序崩溃。


九、void*指针的利用
void*指针是C++中的一类比较特殊的指针,它可以存储任意类型对象的地址,而void*类型则只能表明该类型对象存储的是一个地址值
,但不能指出该地址上对象的具体类型。同时也因此void*类型的指针能够进行的操作也很有限。
一、void*指针能够进行的操作:

1:与另一个指针进行比较。

#include<iostream>
using namespace std;
int main()
{
	//与另一个指针进行比较。
	//测试栈的生长方向
	int a = 1,b=2;
	cout<<"&a:"<<&a<<endl;
	cout<<"&b:"<<&b<<endl;
	void * va = &a;
	void * vb = &b;
	if(va > vb)
	{
		cout<<"栈是向下生长的!"<<endl;
	}
	else
	{
		cout<<"栈是向上生长的!"<<endl;
	}
	/*
	*输出:
	* &a:003CFC08
    * &b:003CFBFC
    * 栈是向下生长的!
	*/

	//测试栈的生长方向
	int *array= new int [10]();
	array[0] = 1;
	array[1] = 0;
    void* a1 = array;
	void* b1 = &array[1];
	if(a1>b1)
	{
	cout<<"堆是向下生长的!"<<endl;
	}
	else
	{
		cout<<"堆是向上生长的!"<<endl;
	}
	delete[] array;
	/*
	*输出:"堆是向上生长的!"
	*/
	return 0;
}

2:向函数传递void*或函数返回void*类型的指针。


3:给另一个void*指针赋值。

  int a = 1;
	void * p1 = &a;
	void * p2 = p1;

二、void*指针的特殊说明
1:不能通过void*指针来操纵它所指向的对象。
2:在知道该void*指针所指向的具体类型后可以显示强制转换来从新获取该对象值。

#include<iostream>
#include<string>
using namespace std;
union  test_un
{
	int a ;
	double b;
	char c;
};
//联合体里面不能拥有不确定长度类型的数据成员
int main()
{ 
	test_un * un = new test_un();
	void * vp;
	vp = un;
	(*un).c  = ‘c‘;
	cout<<*(static_cast<char *>(vp))<<endl;//输出c
	(*un).a  = 1;
	cout<<*(static_cast<int *>(vp))<<endl;//输出1
	(*un).b  = 2.01;
	cout<<*(static_cast<double *>(vp))<<endl;//输出2.01
}

十、指针与const、typedef
一、指向const对象的指针
     const int * pl;或者 int const * pl;


二、const指针
     int * const pl;


三、指向const对象的const指针
     const int * const pl;
注意:const限定符在声明一个常量对象的时候既可以放在类型的前面也可以放在类型的后面
例如:
int const a = 2;
const int a = 2;//与上一句同效
但是可能有人会认为一中的 const int * pl;应该也是int * const pl;即一个常量指针。但是事实并不
是这样的,主要原因是因为C++编译器在将程序分割成一段段有效的符号时所采用处理方法是“贪心法”(
即直到读入的字符组成的字符串已不再可能组成一个有意义的符号为止)。而(const int *)本身就能结
合组成一种有意义的类型,所以它的真正含义是指向const对象的指针。


四、用typedef与const结合定义const指针
typedef int * pint;
const pint a;
或者
pint const a;
再不用怀疑,a的真实类型就是一个常量指针而不是一个指向常量的指针,其主要原因是typedef已经
改变了该语句的结合性。

C++中的各种小细节(二),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。