C++中const限定符的几种常见用法
发布网友
发布时间:2022-04-29 12:12
我来回答
共1个回答
热心网友
时间:2022-06-27 12:09
我以前的笔记,可以参考下。
/*const用法总结*/
#include <iostream>
using namespace std;
class basic
{
public :
basic () {cout<<"default\n"; }
~basic () {cout<<"bye~\n";}
//const int a;// 错误,知识点0 因为此时对象还没生成,可以设置为类所属const static int a;
void A () {}//对应知识点12 应该是 void A ()const
};
struct S
{
int a;
mutable int b;
};
//const int c_a1=5;//知识点1 const 变量因为不能通过程序改变,必须在定义时进行初始化
int a2=2;
const int c_a3=a2;//知识点 2 const定义的变量连接性为内部链接,也就是只能在该源文件下可见,相当于static const int a3,如果要让c_a3所有文件可见必须显示的说明exter const int c_a3;
//知识点3 int类型的a2可以赋值给const int类型的a3,反之则不行
int main()
{
const int *p1;//知识点4 这个表示p1存储的数据是一个const int类型变量的地址,也就是*p1的值不能改变
int* const p2=NULL;//知识点5 const粘着谁,谁就被const,所以p被const了,它不能指向其他地址 ,同理,因为他不能改变,必须在定义的时候为他初始化
int *const*p3;//知识点6 p3是一个二级指针,本着粘着谁const谁的原则,*p3被const了,也就是二级指针里存储的那个指针的值不能变。
/*关于指针*/
const int *p4=&a2;//知识点7 int变量的地址可以存入const int*
int *p5=&a2;
//const int **p3=&p2;//错误,知识点8 int*的地址不能存入const int**
/*关于引用*/
const int a4=a2;//知识点9 const变量可交由const引用
int *p6=&a2;
//const int*&p7=p6;//错误,知识点9扩充,此例的const引用写法应该是int *const& ,错误写法里表达的是p7是一个引用,他引用的对象是一个指针,这个指针不允许修改他地址里那个变量的值。const引用指的应该是该引用本身表示的对象值不能改变
//int& a5=3;
/*错误,知识点10 引用只能引用有具体地址的变量,数面值常量(如3,'a'等)、被引用对象与引用类型不同但是可以进行转换的(#1)还有临时变量不能交给一般引用, 对于前两者,一般的做法是分配一块内存,生成他们正确类型的临时变量。
C++同时明确 了,const引用可以引用临时对象(#2)*/
/*关于结构*/
const S B={1,2};
// B.a=3;//错误
B.b=3;//知识点11 即使是const的结构变量,对于声明时加上mutable说明符的,依然可以修改他的值
/*关于类*/
const basic bc;
//bc.A();//错误 ,知识点12 即使A是public,依然不能使用它,因为bc是const的,但是A函数无法保证不修改他。正确的写法见开头A函数声明的说明
return 0;
}
/*注释:
#1:比如等号两边的类型是可以进行转换的,那么会生成临时变量,比如 double& a=2;其中2是int类型,int是可以通过提升转化变成double的2.0的,所以会产生一个2.0的临时变量,引用
a实际是对那个临时变量进行引用
#2:临时对象:是指临时产生,如果被引用了,则内存继续存在,否则马上消失,产生临时变量的情况有很多,比如类型转换 (int)2.5,比如调用构造函数 A a=A(3),比如函数的形参是值而不是引用
或者返回值是值,都会产生临时变量。临时变量还有一个特点就是,A a=b,如果b是一个临时变量,且他的类型是A类,那么此时不会调用拷贝构造函数,而是直接进行成员的赋值,
同样道理,赋值完了这个临时对象消失,但是他也不会调用析构函数!所以避免了如果a中有new出来的空间不会被析构两次。*/