关于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