const修饰普通变量
const修饰普通变量时要初始化赋值
#include<iostream>
using namespace std;
/*
const修饰常量
---修饰成员变量时,必须在构造函数的参数列表中初始化
---修饰成员函数时,加在函数后面,并且该函数无法修改成员属性
*/
//const修饰普通变量时要初始化赋值
int main(int argc, char const *argv[])
{
int x = 1;
const int a = 10;
int const b = 20;
//定义两个整形常量,以上两种写法作用一致,没有区别
const int *c = &a;
//const修饰指针指向的值为常整形,
//指针的地址可以修改,但锁指向的数据不能修改
int * const d = &x;
//const修饰的是指针本身,为常指针
//即指针变量(地址)不能修改,但是指针指向的数据可以修改
const int * const e = &a;
//const同时修饰指针和指针指向的数据,两针皆不可修改
cout << "-------------------初值---------------------" << endl;
cout << "x = " << x << " " << "&x = " << &x << endl;
cout << "a = " << a << " " << "&a = " << &a << endl;
cout << "b = " << b << " " << "&b = " << &b << endl;
cout << "c = " << c << " (a的地址)" << " *c = " << *c << endl;
cout << "d = " << d << " (x的地址)" << " *d = " << *d << endl;
cout << "e = " << e << " (a的地址)" << " *e = " << *e << endl;
// a = 200;
// b = 300;
int m = 80;
c = &m;
/* *c = 400; */
// d = &m;
*d = 500;
// e = &m;
/* *e = 600; */
cout << "-------------------赋值---------------------" << endl;
cout << "x = " << x << " " << "&x = " << &x << endl;
cout << "a = " << a << " " << "&a = " << &a << endl;
cout << "b = " << b << " " << "&b = " << &b << endl;
cout << "c = " << c << " (a的地址)" << " *c = " << *c << endl;
cout << "d = " << d << " (x的地址)" << " *d = " << *d << endl;
cout << "e = " << e << " (a的地址)" << " *e = " << *e << endl;
return 0;
}
const修饰成员变量
在C++类中的成员变量,只能使用初始化参数列表进行初始化赋值
#include<iostream>
using namespace std;
class A
{
public:
A() //构造函数声明
{
}
int a;
char c;
};
A::A():a(6),c('e') //构造函数定义,参数列表初始化
{
}
const修饰类对象
const修饰成员函数
1、const成员函数可以访问const和非const成员变量,但是不能修改任何成员变量的值
2、非const成员函数不能访问const成员变量,只能访问和修改非const成员变量
3、const 成员函数是不能调用类中非 const 成员函数的。(const成员函数在只能调用const成员函数)
const构造函数初始化
const在C语言和C++中的比较:
在C中const是“冒牌货”
在C中 const int a = 10;
不是真的说a被定义为一个常量(冒牌货),a依旧可以通过指针修改其数据值
C语言中const变量是只读变量,有自己的存储空间
在C++中 const int a = 10;
const 定义的才是常量,不可修改。
可能分配存储空间,也可能不分配存储空间(C++中编译器将const修饰的变量放置在符号表中,在这个表中,不论是变量名、地址、数据本身都是不允许被改变的——就是完完全全的常量,当需要去地址的时候,会单独再分配一块空间,用指针存取(拷贝)变量的地址,这个地址对应的新空间数据和原来的数据没有一点点关系,不会影响到原来的数据值,如下图:)
当const常量为全局,并且需要在其它文件中使用或者当使用&操作符取const常量的地址的时候,才分配内存空间,但也只是取地址,依旧不能修改内存中存放的2数据本身
当使用&操作符,取const常量的地址时,会分配存储空间
当const int &a = 10; const修饰引用时,也会分配存储空间
正因为单独给const常量分配内存,导致有机会通过地址修改数据值,这样和常量初衷矛盾;
正常情况下,C语言const会分配单独内存空间,但C++一般不会首先这样做。当C++需要分配内存空间的时候(编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间),也只能通过&获取地址,但不能更改存储空间的数据本身
const和#define比较
const和#define相同之处
C++中的const常量类似于宏定义 const int c = 5; ≈ #define c 5
const和#define的区别
const常量是由编译器处理的(编译期间),提供类型检查和作用域检查
宏定义由预处理器处理(编译预处理),单纯的文本替换