C/C++关键字详解-----`const`的使用

2024-03-11 08:28:43 浏览数 (1)

作为一个关键词,你可以将 const 视为对数据的权限控制机制之一,它主要用于限制数据的可变性,从而提高代码的安全性和可靠性。通过使用 const,可以缩小对数据的修改权限,确保数据在某些情况下不被意外修改。

而根据使用。

下面我讲叙述几种const的使用场景:

常量声明

const 关键字可以用于声明常量,语法为:const <类型> <变量名> = 值;。例如:

代码语言:javascript复制
const int a = 100;
int const a=100;//等价于上面
指针

const 关键字也可以用于指针和引用,从而创建指向常量对象的指针或引用。这意味着指针或引用指向的值不能被修改。例如:

代码语言:javascript复制
const int* ptr=12; // 指向常量的指针,即const数据,非const指针
int const* ptr=12; // 与上一行相同,指向常量的指针
int* const ptr=12; // 常量指针,指针本身是常量,即const指针,非const数据
const int& ref = some_value; // 常量引用,引用的值不能被修改

其中

  1. 当为常量指针时,不可以通过修改所指向的变量的值,但是指针可以指向别的变量。
  2. 当为指针常量时,指针常量的值不可以修改,就是不能指向别的变量,但是可以通过指针修改它所指向的变量的值。
函数参数

在函数的参数列表中,使用 const 关键字可以声明不可修改的参数。这样做可以确保函数内部不会修改参数的值。例如:

代码语言:javascript复制
codevoid print(const string& str) {
    cout << str << endl;
}
成员函数

在类的成员函数中,其实会默认传入一个this指针如果函数不会修改成员变量的值,可以在函数声明和定义中使用 const 关键字,从而使其成为常量成员函数。例如:

代码语言:javascript复制
codeclass MyClass {
public:
    void print() const {
        cout << "This is a constant member function" << endl;
    }
};

当我们对成员函数使用const时,无法使this指针中的成员变量进行修改。

函数指针

其实函数指针也是指针,使用const时任然遵循const和指针的结合使用方法。当 const 与函数指针结合时,主要涉及到指向常量的函数指针以及常量函数指针。

1.指向常量的函数指针:可以使用 const 修饰函数指针,使其指向的函数不能修改其所操作的数据。这种用法适用于指向不会修改数据的函数,以确保函数的调用不会导致数据被修改。示例如下:

代码语言:javascript复制
cppCopy codevoid func(int x) {
    cout << "Value: " << x << endl;
}

int main() {
    void (*const ptr)(int) = func; // 指向常量的函数指针,不能修改指针指向的函数
    ptr(5); // 调用函数
    // ptr = nullptr; // 错误,不能修改指针
    return 0;
}

在上面的示例中,ptr 是一个指向常量的函数指针,它指向了 func 函数,而且在声明后不能再指向其他函数。

2.常量函数指针:也可以将指针指向的函数声明为常量函数,这样的函数指针就只能指向这种类型的函数。示例如下:

代码语言:javascript复制
cppCopy codevoid func(int x) {
    cout << "Value: " << x << endl;
}

int main() {
    void (*ptr)(int) const = func; // 常量函数指针,不能修改指针指向的函数
    ptr(5); // 调用函数
    // ptr = nullptr; // 错误,不能修改指针
    return 0;
}

在这个示例中,ptr 是一个常量函数指针,它指向了 func 函数,并且不能指向其他函数。

常量表达式和引用

const 还可以用于创建常量表达式,这些表达式在编译时就可以求值,并且被视为常量。例如:

代码语言:javascript复制
const int sum = 2   3; // 常量表达式

const 和引用结合在 C 中通常用于创建指向常量的引用,即 const 引用。这种结合的主要目的是确保引用在其生命周期内不会修改所引用的值,从而提高代码的安全性和可靠性。

通过使用 const 关键字,可以提高代码的可读性、可维护性,并且在一定程度上增强了代码的安全性,防止意外修改常量值。

在 C 中,const 引用通常用于以下情况:

避免数据修改:将参数声明为 const 引用可以确保在函数内部不会修改参数的值。这样做既可以提高代码的安全性,也可以避免不必要的拷贝操作。

代码语言:javascript复制
void print(const string& str) {
    cout << str << endl;
}

引用临时对象**:const 引用可以绑定到临时对象(右值),以便在函数调用或表达式求值中使用。

代码语言:javascript复制
string getName() {
    return "John";
}

const string& name = getName(); // 将临时对象绑定到const引用

引用常量const 引用可以指向常量,保证了引用的内容在引用生命周期内不会被修改。

代码语言:javascript复制
const int& value = 10; // 引用常量值

通过使用 const 引用,可以确保在函数调用或对象操作中不会修改数据,并且能够更加灵活地处理临时对象和常量值。

const在C和C 之间的区别

在 C 和 C 中,const 关键字的基本作用是相似的,都是用于创建常量并限制变量的修改。然而,在具体的使用和行为上,C 和 C 中的 const 有一些区别:

  1. 字符串常量
  • 在 C 语言中,字符串常量(如 "hello")被视为字符数组的常量,而不是指向常量的指针。因此,可以使用指针指向字符串常量,但不能修改字符串的内容。
  • 在 C 中,字符串常量被视为指向常量的指针(const char*),因此使用指针指向字符串常量时,不能修改字符串的内容。为了更严格地保护字符串常量不被修改,可以使用 const char* 或者更好的方式,比如使用 const char[]std::string
  1. 全局常量
  • 在 C 语言中,全局常量可以在声明时使用 const 关键字,但通常也可以使用 #define 指令来定义全局常量。
  • 在 C 中,推荐使用 const 关键字来声明全局常量,因为 const 具有类型安全性,而 #define 宏定义则可能导致类型不匹配和错误使用的问题。
  1. const 修饰函数参数
  • 在 C 语言中,const 关键字通常被忽略,因为 C 语言没有函数参数的类型检查。
  • 在 C 中,const 关键字用于声明函数参数时,表示参数是只读的,即函数内部不会修改该参数的值。这种用法有助于提高代码的可靠性和安全性。
  1. const 成员函数
  • 在 C 中,const 关键字还用于声明成员函数,表示该成员函数不会修改对象的状态。这样的成员函数被称为 const 成员函数,可以在 const 对象上调用,从而提高了 const 对象的使用灵活性。

总的来说,虽然 C 和 C 中的 const 关键字都用于创建常量和限制变量的修改,但在一些具体的用法和语义上存在一些差异。在 C 中,const 的使用更为严格,并且常常被用于提高代码的类型安全性和可维护性。

0 人点赞