其他分享
首页 > 其他分享> > 关于const和constexpr

关于const和constexpr

作者:互联网

1const 修饰变量,指针,函数,返回值,

const修饰变量的时候,表示你要声明的是一个常量,需要在声明的时候初始化;

const修饰函数的形参的时候,不需要初始化,但是用const修饰的形参是为了告诉你,在使用的时候不能改变这个参数的内容;

const修饰指针的时候:const int*P, int const*P,说明这个指针指的内容你不能改;

                                     int *const P;说明这个指针指的地址不能变;

const修饰函数返回值,说明返回值是个常量;

const写在函数参数列表的后边的时候,说明这个函数里边不能修改成员的值;且函数调用只能调用常成员函数;

我们现在来用代码验证一下:

1常量类型变量必须初始化,如果是外部传来的常量,可以不初始化(形式参数是常量)

 

 2 常量类型参数,可以不用设置初始值;const修饰的形参,告诉内部你不能修改这个值;

 

 

 

 

 3关于常指针,指向常量的指针;下图const修饰的是P1,P1指向的内容,一旦他们有指向的内容,你不能通过这个指针去修改内容;但是指针本身可以指向别的地方;

 

 4指针常量,是常量;常量声明时候要初始化;常量的值不可以改,这里P指向Arr,你不能再给它指向别的地方,但是它指向的内存的内容可以改;

给指针常量修改指向,就不行:

 

 

 5指向常量的指针常量,指针指向不能改,指针指向的地址里的内容也不能改

 

 6 const 修饰函数返回值;说明函数的返回值是一个常量;char* pre = fun();这行代码编译器会检查报错,但是你也可以强转char* pre =(char*) fun();

不过使用static_cast<char*>不行,static不能丢掉常量或者类型限定符

 

 

 

 7 const修饰函数;函数内部不能发生写操作,不能修改成员变量的值

#include "stdafx.h"
#include<stdio.h>
using namespace std;

class MyClass
{
public:
    
    const int fun();
    int fun2();
    int FunCCC2()const;

private:
    int myparam;

};

const int MyClass::fun()
{
    return 0;
}

int MyClass::fun2()
{
    return 1;
}

int MyClass::FunCCC2()const 
{
    printf("cal :%d",myparam);
    myparam = 33;
    return 0;
}

int main()
{
    MyClass A ;
    A.FunCCC2();
    return 0;
}

 

 

 

 我们来试试在FunCCC2里调用一下非const函数:你会看到这句话:不能将“this”指针从“const MyClass”转换为“MyClass &”

 

FUnCCC 调用一个“返回值类型是const但是函数不是const修饰的” 函数,可以吗?

 

 const修饰的函数调用const修饰的函数是可以的:

 

 


 

constexpr 编译阶段就要知道值;

 

 constexpr修饰函数,里边只能直接是return;甚至打印,const类型变量声明定义都不能在constexpr函数里边;constexpr里边使用的变量或者函数或者表达式,需要是能在编译阶段知道值的

 

 。。。未完待续

标签:const,常量,int,函数,constexpr,关于,修饰,指针
来源: https://www.cnblogs.com/8335IT/p/16304015.html