指针常量、常量指针和引用(本质是 *const)This的理解

在面试中我们经常会被面试官问到什么是常量指针,什么又是指针常量。可能第一次被问到都会有些懵逼(大神略过)。我今天就来讲一讲这二者的区别。 
下面开始正题。。。。

指针常量

指针常量:顾名思义它就是一个常量,但是是指针修饰的。 
格式为:

int * const p //指针常量

在这个例子下定义以下代码:

int a,b;
int * const p=&a //指针常量
//那么分为一下两种操作
*p=9;//操作成功
p=&b;//操作错误

 因为声明了指针常量,说明指针变量不允许修改。如同次指针指向一个地址该地址不能被修改,但是该地址里的内容可以被修改

常量指针

常量指针:如果在定义指针变量的时候,数据类型前用const修饰,被定义的指针变量就是指向常量的指针变量,指向常量的指针变量称为常量指针,格式如下

const int *p = &a; //常量指针

 

int a,b;
 const int *p=&a //常量指针
//那么分为一下两种操作
*p=9;//操作错误
p=&b;//操作成功

因为常量指针本质是指针,并且这个指针是一个指向常量的指针,指针指向的变量的值不可通过该指针修改,但是指针指向的值可以改变。

int const*p=const int *p;都表示*p的值不能改变,而p(即地址)是可以改变的;

附加题

指向常量的指针常量该怎么写? 
答案:

const int * const b = &a;//指向常量的指针常量

 引用(本质是*const)

1)Const int & e  相当于 const int * const e   //e是指向常量的指针常量,既不能修改其值,也不能修改让其指向其他内存空间;

2)普通引用 相当于 int *const e1

3)当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名,但是他不能修改值,也不能修改让其指向其他内存空间;就是一个指向常量的指针常量,例如:const int &m = 43; //==const int * const m = 43;

4)使用字面量对const引用初始化后,将生成一个只读变量

例子:
#include
using namespace std;

//常引用的知识架构
void main1301()
{
    //普通引用

    int  a = 10;
    int &b = a;
    printf("b:%d \n", b);

    //常引用
    int  x = 20;
    const int &y = x;  //常引用 是 让变量 引用只读属性 不能通过y去修改x了
    //y = 21;

    //常引用 初始化 分为2种情况
    //1> 用变量 初始化 常引用
    {
        int x1 = 30;
        const int &y1 = x1; //用x1变量去初始化 常引用
    }
    //2> 用字面量 初始化 常量引用
    {
        const int a = 40;  //c++编译器把a放在符号表中
        int &m = 41; //普通引用 引用一个字面量 请问字面量有没有内存地址
        //引用 就是给内存取多个门牌号 (多个别名)
        //printf("&40:%d \n", &40);
        const int &m = 43;  //c++编译器 会 分配内存空间   ==const int * const m = 43;
    
    }
    cout<<"hello..."<     system("pause");
    return ;
}


//
struct Teacher
{
    char name[64];
    int age ;
};


//void printTeacher(const Teacher  * const myt)
void printTeacher(const Teacher &myt)
{
    //常引用 让 实参变量 拥有只读属性 
    //myt.age = 33;
    printf("myt.age:%d \n", myt.age);
    
}

void main()
{
    Teacher  t1;
    t1.age = 36;

    printTeacher(t1);

    
    cout<<"hello..."<     system("pause");
    return ;
}
文章上面部分转自:https://blog.csdn.net/weibo_dm/article/details/80445205

上面部分出自传智播客培训班

This的理解

添加一个实例,帮助理解(类的构造函数)this指针是指针常量   

Test1::Test1(int a) //实质是 Test1(Test1*const this,int a)
{
    m_a = a;
    cout << "构造函数" << endl;
}  
this指针是指针常量,不可以修改,也就是this指针指向对象本身是不能被修改的。这是C++编译器设计的

Test1::Test1(int a)const // 实质是Test1(const Test1*const this,int a)
{
    m_a = a;
    cout << "构造函数" << endl;
}

一方面,this指针是指针常量,不可以修改,也就是this指针指向对象本身是不能被修改的。

另一方面,this指针又是常量指针,也就是this指针指向的变量值不可以修改,因此m_a = a;是错误的。

因此,在C++类中,成员函数加了const,就代表属性是不可以修改的。

你可能感兴趣的:(c++知识)