指针和引用的区别;vector;双冒号

来源:互联网 发布:淘宝女装拍摄灯光布置 编辑:程序博客网 时间:2024/06/18 11:19

1、指针是指向一个对象,它自己本身也有值,其值是所指向对象的地址。引用是一个对象的别名,指向同一个对象,它本身无值。

2、指针可为空,引用不能为空,引用必须初始化,所以使用指针之前必须要判空。

3、指针可以改变指向,但是引用不能改变,除非是变量自身在改变的一些操作是可以的。

4、再次,引用的大小是所指向的变量的大小,因为引用只是一个别名而已;指针是指针本身的大小,4个字节

5、最后,引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const 指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。

总而言之,言而总之——它们的这些差别都可以归结为"指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。"(此段为摘录)

6、虽然指针和引用最终在编译中的实现是一样的,但是引用的形式大大方便了使用也更安全。有人说:"引用只是一个别名,不会占内存空间?"通过这个事实我们可以揭穿这个谎言!实际上引用也是占内存空间的。

通过以上内容大体了解到,具体的应用中还要仔细揣摩,交换中就有相关的应用,值传递和地址传递。

vector:

摘自百度答案

vector 一般把它叫做动态数组,但是其实它是一个顺序容器,能够在尾部高效的插入和删除数值,同时支持随机访问其中的值,也就是说vector重载了[]运算符。但是不支持在前端进行同样的操作,而deque支持在两端完成同样的操作。在C++中凡是使用数组的地方,都可以使用vector。它的一个最大特点是可以动态的增加大小,无需程序员关心,你可以使用push_back(),往对象里面插入数据。下面是他的一些成员函数的测试!#include<iostream> #include<vector> /*******主要是测试一下vector的各个 成员函数的用法。 ********/ using namespace std; int main() { vector<int> v; vector<int> w; int n; while(cin>>n) v.push_back(n);//在其尾部添加值 cout<< v.at(1)<<endl;//相当于[]运算符,数组从零开始计数s copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl; v.erase(v.begin());//删除指定位置上的元素,参数为迭代器。此函数重载了,可以指定一个范围或者是一个位置 v.erase(v.begin(),v.begin()+3);//同样是左闭右开区间 copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl; int a[]={12,11,32}; /* insert()也进行了重载,如下面的 例子所示: */ v.insert(v.begin(),9);//表示在指定迭代器位置的前面插入一个值 v.insert(v.begin(),2,10);//表示在指定迭代起位置的前面插入若干个值,本例子为插入2个10 v.insert(v.begin(),a,a+3);//在指定迭代器位置的前面插入一个范围的数值,同样是左闭右开区间 copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl; v.reserve(4);//这个函数有什么用处?还待测试 v.swap(w);//更另外的一个vector的数据交换 copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl; copy(w.begin(),w.end(),ostream_iterator<int>(cout," ")); copy(v.rbegin(),v.rend(),ostream_iterator<int>(cout," ")); return 0; }
双冒号:

1、作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分

2、全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分如

3、::是C++里的“作用域分解运算符”。比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数


原创粉丝点击