const

const

作用

  • 类型检查,#define只是简单的字符串替换

  • 定义常量,防止修改

  • const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝,from 关于C++ const 的全面总结_亿言-CSDN博客_const

  • 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高

特性

局部变量

const变量默认为局部变量,如果想在其他文件访问需要前面加extern

1
extern const int ext;

初始化

1
2
3
4
const int b = 10;
b = 0; // error: assignment of read-only variable ‘b’
const string s = "helloworld";
const int i,j=0 // error: uninitialized const ‘i’

指针

  • 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量

  • 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

  1. 指向常量的指针
1
2
3
const char * a; //指向const对象的指针或者说指向常量的指针。
char const * a; //同上
char* a = "abc"; //error

允许把非const对象的地址赋给指向const对象的指针。只不过无法通过这个指针修改基础对象,但可以通过其他方法修改

1
2
3
const int *ptr;
int val = 3;
ptr = &val; //ok
1
2
char * const a; //指向类型对象的const指针。或者说常指针、const指针。
const char * const a; //指向const对象的const指针。
  1. 常指针
1
2
int num = 0;
int * const ptr = # //指向类型对象的const指针。或者说常指针、const指针。const指针必须初始化!且const指针的值不能修改

要指向一个变量而不是一个常量

1
2
const int num=0;
int * const ptr=# //error! const int* -> int*

指向常量的常指针

1
2
const int p = 3;
const int * const ptr = &p;

函数

  • 对于非内部数据类型的输入参数,应该将值传递的方式改为const 引用传递,目的是提高效率。

  • 对于内部数据类型的输入参数,不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。不要将值传递的方式改为const 引用传递,否则既达不到提高效率的目的,又降低了函数的可理解性。

1
2
3
4
5
void func(A a)
void func(const A &a) //good

void func(int x)
void func(const int &x) //bad

  • 任何不会修改数据成员的函数都应该声明为const类型。

  • 使用const关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象,没有使用const关键字声明的成员函数不能用来操作常对象。

  • 对于类中的const成员变量必须通过初始化列表进行初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
class Apple
{
private:
int people[100];
public:
Apple(int i);
const int apple_number;
};

Apple::Apple(int i):apple_number(i)
{

}

const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//apple.cpp
class Apple
{
private:
int people[100];
public:
Apple(int i);
const int apple_number;
void take(int num) const;
int add(int num);
int add(int num) const;
int getCount() const;

};
//main.cpp
#include<iostream>
#include"apple.cpp"
using namespace std;

Apple::Apple(int i):apple_number(i)
{

}
int Apple::add(int num){
take(num);
}
int Apple::add(int num) const{
take(num);
}
void Apple::take(int num) const
{
cout<<"take func "<<num<<endl;
}
int Apple::getCount() const
{
take(1);
// add(); //error add方法并非const修饰,所以运行报错
return apple_number;
}
int main(){
Apple a(2);
cout<<a.getCount()<<endl;
a.add(10);
const Apple b(3);
b.add(100);
return 0;
}
//编译: g++ -o main main.cpp apple.cpp
//结果
take func 1
2
take func 10
take func 100
  • Copyrights © 2018-2022 Haojia Zhu
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信