C++ —— 数据类型 ::const、引用与指针

1. 引用

是对象的别名,分为左值引用和右值引用。

1. 1 左值引用

其定义方法如下:

int ival=1;
int &refval = ival;

这样定义后,变量ivalrefval指向的是同一个对象,他们都可以更改对象的值。
其注意事项如下:

  1. 引用必须在定义的时候被初始化,作为函数形参也属于左值引用,因为在编译链接的过程中,会给函数形参进行初始化。
  2. 引用类型的初始值必须是一个对象,而不能是一个具体的值,比如这样是错误的int & a=1024;

1.2 右值引用

只能绑定到一个将要销毁的对象上,用&&来获得右值引用。 其可以自由接管所引用对象的资源。
例如:

int i=42;
int && rr2=i*43;//i*43会创建一个临时变量来存储计算结果,赋值后即销毁。

2. 指针

    int b=1;
    int * a;
    a=&b;
    *a=2;//*a表示解引用,此时b变量的值是2
    int & c=*a;//c是一个引用,代表*a的别名
    c=3;//此时b的值是3 
    std::cout<<"*a: "<<*a<<std::endl;
    std::cout<<"b: "<<b<<std::endl;
    std::cout<<"c: "<<c<<std::endl;

变量a是一个指针对象,指向变量b所代表的对象。
变量a的内容是b的地址.
*a表示解引用,等同于b。
上述代码打印结果如下:

*a: 3
b: 3
c: 3

3. const

定义常量,其值只可读不可修改。
例如:

const int bufsize=512;

3.1 常量引用

常用的一种用法是常量引用,引用只能读,不能写。

int r2=3;
const int & r1=r2;

3.2 常量指针与指向常量的指针

int num=2;
int * const p1 = &num;// 常量指针(顶层const):p1将一直指向num所代表的对象,不能指向别的对象,num的值可以改变


const int num2=2;
const int *p2=&num2;//指向常量的指针(底层const):p2指向常量对象,常量对象的值不能改变,但是p2可以指向别的常量对象

4.代码说明

例如下面函数的形参msg是一个 常量引用,引用的是类型为::planning_msg::planned_trajectory的对象。所以传入的参数应该是类型为::planning_msg::planned_trajectory的变量。

void setMsg(const ::planning_msg::planned_trajectory& msg) { msg_ = msg; }

下面我们来看需要传入的变量_planning_data,它是一个函数的传入参数,其在形参中的定义为:

const planning_msg::planned_trajectory::ConstPtr& _planning_data

这一个常量引用,引用的是类型是planning_msg::planned_trajectory::ConstPtr,这个类型是ros msg编译出来的一个类型,是planning_msg::planned_trajectory::的一个常量共享指针类型。
因为_planning_data是一个指针,而setMsg的参数是一个::planning_msg::planned_trajectory类型变量,所以我们在调用的时候需要解引用指针,然后传参,如下所示:

setMsg(*_planning_data);

版权声明:本文为xiaodouhao123456原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。