C++ 中的 const 知识点详解,c++和c语言区别

目录

  • [一。C++ 中的 const 知识点详解](#一。C++ 中的 const 知识点详解)
    • [1. 基本用法](#1. 基本用法)
      • [1.1) 定义常量](#1.1) 定义常量)
      • [1.2) 指针与 const](#1.2) 指针与 const)
    • [2. 函数中的 const](#2. 函数中的 const)
      • [2.1)const 参数](#2.1)const 参数)
      • [2.2)const 成员函数](#2.2)const 成员函数)
    • [3. 类中的 const](#3. 类中的 const)
      • [3.1)const 成员变量](#3.1)const 成员变量)
      • [3.2)const 对象](#3.2)const 对象)
    • [4. const 返回值](#4. const 返回值)
    • [5. constexpr (C++11 引入)](#5. constexpr (C++11 引入))
    • [6. const 重载](#6. const 重载)
    • [7. mutable 关键字](#7. mutable 关键字)
    • [8. const 引用与临时对象](#8. const 引用与临时对象)
    • [9. const 转换](#9. const 转换)
    • [10. const 正确性的好处](#10. const 正确性的好处)
    • 常见面试题
  • [二. C 语言中 const 的主要知识点](#二. C 语言中 const 的主要知识点)
    • [1. 基本用法](#1. 基本用法)
    • [2. 函数参数中的 const](#2. 函数参数中的 const)
    • [3. const 返回值](#3. const 返回值)
    • [4. 数组与 const](#4. 数组与 const)
    • [5. 结构体与 const](#5. 结构体与 const)
    • [6. const 转换](#6. const 转换)
    • [7. const 正确性的好处](#7. const 正确性的好处)
    • 注意事项
    • 示例代码

一。C++ 中的 const 知识点详解

C++ 中的 const 知识点详解

const 是 C++ 中一个重要的关键字,用于定义常量或指定不可修改的对象。以下是关于 const 的全面知识点总结:

1. 基本用法

1.1) 定义常量

cpp 复制代码
const int MAX_VALUE = 100;  // 常量,初始化后不可修改
// MAX_VALUE = 200;  // 错误:不能修改常量

1.2) 指针与 const

cpp 复制代码
const int* ptr1;       // 指向常量对象的指针(指针指向的内容不可变)
int const* ptr2;       // 同上
int* const ptr3;       // 常量指针(指针本身不可变,但指向的内容可变)
const int* const ptr4; // 指向常量对象的常量指针(指针和内容都不可变)

2. 函数中的 const

2.1)const 参数

c 复制代码
void print(const std::string& str) {
    // str 不能被修改
    std::cout << str << std::endl;
}

2.2)const 成员函数

c 复制代码
class MyClass {
public:
    int getValue() const {  // 常量成员函数,不能修改成员变量
        return value_;
    }
    void setValue(int v) {  // 非常量成员函数
        value_ = v;
    }
private:
    int value_;
};

3. 类中的 const

3.1)const 成员变量

c 复制代码
class MyClass {
public:
    MyClass(int v) : value_(v) {}  // 必须在初始化列表中初始化
private:
    const int value_;
};

3.2)const 对象

c 复制代码
const MyClass obj(10);
// obj.setValue(20);  // 错误:不能调用非常量成员函数
int val = obj.getValue();  // 可以调用常量成员函数

4. const 返回值

c 复制代码
const int* getPointer() {
    static int value = 42;
    return &value;
}
// 防止返回的指针被用于修改值

5. constexpr (C++11 引入)

c 复制代码
constexpr int square(int x) {
    return x * x;
}
constexpr int size = square(10);  // 编译时常量

6. const 重载

c 复制代码
void process(int& val) { /* ... */ }
void process(const int& val) { /* ... */ }


int getValue() const {  // 常量成员函数,不能修改成员变量
    return value_;
}
void setValue() {  // 非常量成员函数
    value_ = 10;
}

7. mutable 关键字

c 复制代码
class MyClass {
public:
    void doSomething() const {
        count_++;  // mutable 成员可以在常量对象中被修改
    }
private:
    mutable int count_ = 0;
};

8. const 引用与临时对象

c 复制代码
const std::string& getString() {
    return "Hello";  // 绑定到临时对象是安全的
}

9. const 转换

c 复制代码
void print(const std::string& s);
 
std::string str = "test";
print(str);       // 正确:非常量可以转为常量
print("test");    // 正确:字符串字面量转为 const char*

10. const 正确性的好处

c 复制代码
提高代码安全性:防止意外修改
明确编程意图
允许函数接受常量和非常量参数
优化机会:编译器可能进行更好的优化

常见面试题

1.const int*, int const* 和 int* const 的区别?

  1. 如何在常量成员函数中修改成员变量?

mutable

3.为什么成员函数要有const 重载?

通过 const 重载,可以为一个类提供两种接口:一种用于修改对象,另一种用于只读访问。

4.const 和 constexpr 有什么区别?

const

表示"不可修改",适用于运行时逻辑,防止意外修改对象或变量。

constexpr

表示"编译期常量",适用于需要编译期优化的场景(如数组大小、模板参数),要求值必须在编译期确定。

二. C 语言中 const 的主要知识点

在 C 语言中,const 关键字用于定义常量或指定不可修改的对象。以下是关于 C 语言中 const 的主要知识点总结:

1. 基本用法

1.1)定义常量

c 复制代码
const int MAX_VALUE = 100;  // 常量,初始化后不可修改
// MAX_VALUE = 200;  // 错误:不能修改常量

1.2)指针与 const

c 复制代码
const int* ptr1;       // 指向常量对象的指针(指针指向的内容不可变)
int const* ptr2;       // 同上
int* const ptr3;       // 常量指针(指针本身不可变,但指向的内容可变)
const int* const ptr4; // 指向常量对象的常量指针(指针和内容都不可变)

2. 函数参数中的 const

c 复制代码
void print(const char* str) {
    // str 不能被修改
    printf("%s\n", str);
}

3. const 返回值

c 复制代码
const int* getPointer() {
    static int value = 42;
    return &value;
}
// 防止返回的指针被用于修改值

4. 数组与 const

c 复制代码
const int arr[] = {1, 2, 3};  // 常量数组,内容不可修改
// arr[0] = 4;  // 错误:不能修改常量数组元素

5. 结构体与 const

5.1const 结构体成员

c 复制代码
struct Point {
    const int x;
    const int y;
};
// 必须在初始化时赋值
struct Point p = {.x = 1, .y = 2};

5.2const 结构体变量

c 复制代码
struct Point p = {1, 2};
const struct Point cp = p;
// cp.x = 3;  // 错误:不能修改常量结构体成员

6. const 转换

c 复制代码
void print(const char* s);
 
char str[] = "test";
print(str);       // 正确:非常量可以转为常量
print("test");    // 正确:字符串字面量转为 const char*

7. const 正确性的好处

c 复制代码
提高代码安全性:防止意外修改
明确编程意图
允许函数接受常量和非常量参数
优化机会:编译器可能进行更好的优化

注意事项

  • C 语言中的 const 变量默认具有外部链接性,除非显式声明为 static。
  • 在 C 语言中,const 变量并不是真正的常量表达式,不能用于数组大小声明等需要常量表达式的场合。
  • C 语言中的 const 变量可以通过指针间接修改(如果指针不是 const 限定的),这被认为是一个设计缺陷。

示例代码

c 复制代码
#include <stdio.h>
 
int main() {
    const int a = 10;
    // a = 20;  // 错误:不能修改常量
 
    const int* ptr = &a;
    // *ptr = 30;  // 错误:不能通过 ptr 修改 a
 
    int b = 20;
    int* const ptr2 = &b;
    *ptr2 = 30;  // 正确:可以修改 b
    // ptr2 = &a;  // 错误:不能修改 ptr2
 
    return 0;
}
相关推荐
小坏坏的大世界1 小时前
C++ STL常用容器总结(vector, deque, list, map, set)
c++·算法
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
liulilittle2 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
励志要当大牛的小白菜4 小时前
ART配对软件使用
开发语言·c++·qt·算法
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
PAK向日葵5 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
爱装代码的小瓶子6 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
YuTaoShao7 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw7 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨8 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发