C++常量
一. 字面值常量
字面值常量是直接写在代码中的固定值。
| 类型 | 描述 | 示例 |
|---|---|---|
| 整型 | 整数值,可以使用不同的后缀来指定类型。 | 100 (int), 100L (long), 0xFF (十六进制) |
| 浮点型 | 带有小数点的数值。 | 3.14 (double), 3.14F (float) |
| 字符型 | 单个字符,用单引号 ' ' 括起来。 |
'A', '\n' (换行符) |
| 字符串型 | 零个或多个字符的序列,用双引号 "" 括起来。 |
"Hello World", "" (空字符串) |
| 布尔型 | 只有两个值:true 和 false。 |
true, false |
1.字符常量
在 C++ 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:
| 转义序列 | 含义 |
|---|---|
| \ | 字符 |
| \’ | ‘ 字符 |
| \” | “ 字符 |
| \? | ? 字符 |
| \a | 警报铃声 |
| \b | 退格键 |
| \f | 换页符 |
| \n | 换行符 |
| \r | 回车 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \ooo | 一到三位的八进制数 |
| \xhh . . . | 一个或多个数字的十六进制数 |
下面的实例显示了一些转义序列字符:
using namespace std;
int main()
{
cout << "Hello\tWorld\n\n";
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:Hello World
2.字符串常量
字符串字面值或常量是括在双引号 “” 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
您可以使用 做分隔符,把一个很长的字符串常量进行分行。
下面的实例显示了一些字符串常量:
using namespace std;
int main() {
string greeting = "hello, runoob";
cout << greeting;
cout << "\n"; // 换行符
string greeting2 = "hello, \
runoob";
cout << greeting2;
return 0;
}
hello, runoob |
二.定义常量
在 C++ 中,有两种简单的定义常量的方式:
- 使用 #define 预处理器。
- 使用 const 关键字。
1.#define 预处理器
下面是使用 #define 预处理器定义常量的形式:
具体请看下面的实例:
using namespace std;
int main()
{
int area;
area = LENGTH * WIDTH;
cout << area;
cout << NEWLINE;
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:50
2.const 关键字
一、const 修饰变量:定义常量
最基础的用法是将变量声明为 “只读”,一旦初始化后就不能被修改。
1. 普通变量
const int num = 10; // num 是常量,初始化后不可修改 |
- 必须初始化:
const变量定义时必须赋值(或在构造函数初始化列表中初始化,针对类成员),否则编译报错。 - 作用域:同普通变量(局部
const变量仅在块内有效,全局const变量默认仅当前文件可见,类似static)。
2. 指针与 const:两种场景
const 与指针结合时,需区分 “指针指向的内容不可改” 和 “指针本身不可改”,核心看 const 位置:
const修饰指针指向的内容(常量指针):
const int* p;或int const* p;(两种写法等价)
指针p可以指向其他地址,但不能通过p修改它所指向的内容。int a = 10, b = 20;
const int* p = &a;
*p = 30; // 错误!不能修改指向的内容
p = &b; // 正确!指针本身可以改const修饰指针本身(指针常量):
int* const p;
指针p一旦指向某个地址,就不能再指向其他地址,但可以通过p修改指向的内容。int a = 10, b = 20;
int* const p = &a; // 必须初始化(指针本身不可改)
*p = 30; // 正确!可以修改指向的内容
p = &b; // 错误!指针本身不能改
3. 引用与 const(常量引用)
const 修饰引用时,表示该引用是 “只读引用”,不能通过引用修改被引用的变量,但变量本身可以被修改(如果它不是 const 的)。int a = 10;
const int& ref = a; // 常量引用
ref = 20; // 错误!不能通过引用修改 a
a = 20; // 正确!变量 a 本身可以改
二、const 修饰函数:限制函数行为
1. 修饰函数参数
表示函数内部不会修改该参数(类似常量引用,增强安全性)。
void print(const std::string& str) { // str 不可被修改 |
2. 修饰函数返回值
表示返回值是只读的,不能被修改(常用于返回指针或引用时,防止外部篡改内部数据)。const int* getArray() { // 返回常量指针
static int arr[3] = {1,2,3};
return arr;
}
int main() {
const int* p = getArray();
// *p = 10; // 错误!返回值是 const 的
return 0;
}
3. 修饰类的成员函数(const 成员函数)
在类中,const 放在成员函数参数列表后,表示该函数不会修改类的任何非静态成员变量,也不能调用非 const 成员函数(防止间接修改数据)。class MyClass {
private:
int num;
public:
void setNum(int n) { num = n; } // 非 const 函数,可修改成员
int getNum() const { // const 成员函数,不可修改成员
// num = 10; // 错误!不能修改成员变量
return num;
}
};
- 调用规则:
const对象只能调用const成员函数,非const对象可以调用任意成员函数。
三、const 修饰类的成员变量
==类的 const 成员变量必须在构造函数的初始化列表中初始化==,不能在函数体内赋值。
常成员变量一旦初始化,就不能再被赋值或修改,任何试图修改它的操作(如在成员函数中赋值)都会导致编译错误。
每个对象的常成员变量是独立的,仅当前对象内不可变。class MyClass {
private:
const int MAX_SIZE; // const 成员变量
public:
// 必须在初始化列表中初始化
MyClass(int size) : MAX_SIZE(size) {}
};