C++中的指针、引用与常量修饰符const
一、C++中的指针
指针:一种存储数据内存地址的数据类型。因为其表示的是地址信息,所以不论何种数据类型,其指针都占用相同的存储空间。
二、C++中的引用
引用:已存在对象的别名,不属于数据类型,不占用存储空间。通过引用对对象的操作类似与指针,会真正改变对象。引用必须进行初始化,且不能再次引用其他对象。
注意:
1.在声明引用时,必须对其进行初始化(引用用作函数参数、函数返回值除外);
2.指针通过地址间接访问某变量,引用通过别名直接访问;
3.引用的初始值可以是一个变量,也可以是一个引用;
4.引用初始化后不能用来声明为另一个变量的引用;
5.不允许建立void类型的引用,void只在语法上相当于一个类型,其实质为无类型或空类型;
6.不能建立引用数组;
7.不能建立引用的引用,不能建立引用的指针,引用本身不是一种数据类型;
8.可以将引用的地址传给指针,此时,指针指向原来的变量;
将引用作为函数参数:1.效果与指针相同;2.函数调用不会产生实参副本;3.访问叫指针便捷。
使用常引用的场合:既要节省程序空间,又要保护数据不被改变。
将引用作为函数返回值:1.不可返回局部变量的引用;2.不能返回函数体中动态分配空间的引用;3.尽量返回类成员的const引用;4.流操作符重载声明为引用。
三、C++中的常量修饰符
常量修饰符:const。表示该对象为常量,不可修改。
常量的分类:顶层层常量&底层常量:
顶层常量(top-level const):表示所修饰的变量名引用的对象为常量,其值不可修改–>const typename variable_name;
底层常量(low-level const):表示所修饰的变量名为常量,不可修改,即不可引用其他对象–> const variable_name.
Note:
类型:
基本类型:算数类型与空类型(int)。
复合类型:基于其他类型定义的类型(int*,int &,int *&…)。
#include<iostream>
typedef struct data{
data()
{
num = 0;
cha = 'a';
}
int num;
char cha;
} Node;
int main()
{
Node node;
node.cha = 'a';
node.num = 10;
//const Node c_n_node = node;
//c_n_node.cha = 'b'; -->error: assignment of member ‘data::cha’ in read-only object
//c_n_node.num = 20; -->error: assignment of member ‘data::num’ in read-only object
Node const n_c_node = node;
node.cha = 'b';
node.num = 20;
//Node t_node;
//n_c_node = t_node; -->error: passing ‘const Node {aka const data}’ as ‘this’ argument of ‘data& data::operator=(const data&)’ discards qualifiers [-fpermissive]
//Node const *n_c_p = &node;
//n_c_p->num = 20; -->error: assignment of member ‘data::num’ in read-only object
Node * const n_p_c = &node;
//Node t_node;
//n_p_c = &t_node; -->error: assignment of read-only variable ‘n_p_c’
n_p_c->num = 20;
Node const *n_c_p = &node;
//n_c_p->num = 10; -->error: assignment of member ‘data::num’ in read-only object
Node t_node;
n_c_p = &t_node;
return 0;
}