0
点赞
收藏
分享

微信扫一扫

C++ 基础知识整理

西特张 2022-02-07 阅读 129

前言

本文整理C++基础知识,用于开发中日常查阅。

引用

int main() {
	return 0;
}

智能指针

int main() {
	return 0;
}

const关键字

const修饰变量

  • const修饰的变量也称为常量。
    使用关键字const对限定变量的值,避免其他操作改变该值,不可修改;
    const 数据类型 变量名 = 常量值

  • const对象一旦创建后就不能改变,所以必须对其进行初始化。

默认情况下,const对象仅在文件内有效。

  • 编译器在编译过程中会把用到该const变量都替换成对应的值。
    添加volatile后,可以禁止编译器对该值进行优化,必须在运行时去读取该const值。

  • 默认情况下,const对象仅在文件内有效。
    当多个文件中出现同名const变量时,其实等同于在不同文件中分别定义了独立的变量。因为在编译时会替换,所以相当于是独立的变量。

  • 可以使用extern关键字修饰,让他可以在多个文件中被共享。
    在声明和定义中都添加extern关键字,这样就只需要定义一次,别的文件也能使用该常量了。

// file1.h头文件中声明,用extern表明该const值并非本文件独有,他的定义将在别处出现
extern const int buffer_size;
// file1.cc文件中定义
extern const int buffer_size = 512;

const修饰指针

也可以用指针指向const常量或非常量。
指向常量的指针不能用于改变其所指对象的值,也只能使用指向常量的指针。

区分指针常量和常量指针,可以从右往左读,看const具体修饰的是谁。

  • 底层const,表示指针所指的对象是一个常量
    常量指针,const int *p = &PI。指针指向的值不可更改,但指针的指向可以更改。
    常量指针必须初始化,一旦初始化不可更改。

  • 顶层const,表示指针本身是个常量
    指针常量,int *const p2 = &a。指针的指向不可以改,指针指向的值可以改,

  • 当对象执行拷贝操作时,进行拷贝的对象要具有相同的底层const资格,或者这两个对象必须的数据类型必须能够互相转换。

const double PI = 3.14;
const double *p = Π // 正确,必须添加const关键字,即不能通过*p赋值PI,常量指针

int a = 1;
int b = 2;

// 常量指针,指针指向的值不可以改,但指针的指向可以改
const int *p = &a;
// *p = b; 错误,指向的值不可以改
p = &a; // 指针的指向可以改

// 指针常量,指针的指向不可以改,指针指向的值可以改,
int *const p2 = &a;
*p2 = b; // 指针指向的值可以改
// p2 = &b; 错误,指针的指向不可以改

// const修饰指针和常量,都不可以改
const int *const p3 = a;
// *p3 = b;
// p3 = &b;

const修饰引用

可以把引用绑定到const对象上,就像绑定到其它对象上一样,称之为对常量的引用,可以成为常量引用。
当然const也可以修饰引用,即引用非常量。

int a = 1024;
const int &ra = a;  // 正确,允许将一个常量引用绑定到普通对象上,但不允许通过ra改变a的值,a的值依然可以变化

const int b = 1024;
const int &rb = b;   // 正确,引用及其对应的常量都是常量

ra = 1;// 错误,不能修改常量
rb= 1;  // 错误,不能修改常量
int &r2 = b;  // 错误,必须是一个常量引用才行

double c = 3.14;
int &rc = c;  // 错误,必须添加const,Non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'double'
const int &rc1 = c; // 正确

const修饰函数参数

可以使用const修饰函数入参,防止在函数体内部修改该变量

class Person {
public:
    string name;
    mutable int age;
};

void testPerson(const Person *person) {
    person->age = 1; // 可以修改
    // person->name = "aa"; // 不可修改
}

void testPerson(const Person& person) {
    person.age = 1; // 可以修改
    // person.name = "aa"; // 不可修改
}

const修饰成员函数

使用const修饰的成员函数,即常量成员函数,const成员函数内部不允许修改非mutable成员变量。

class Person {
private:
    int age; // 常量成员函数内不允许修改非mutable的值
    mutable int number; // 常量成员函数内可以修改mutable的值
public:
    int getAge() const {
        // age = 1; // 错误,不能更改
        return age;
    }

    int getNumber() const {
        number = 1;
        return number;
    }
};

const修饰表达式

常量表达式constexpr, const expression,是指值不会改变并且在编译过程就能得到计算结果的表达式。

const int max_file = 20;  // 常量表达式
const int limit = max_file + 1; // 常量表达式
const int size = get_size(); // 不是常量表达式,得运行时才能确定


constexpr int max= 20;  // 常量表达式
constexpr int limit = max+ 1; // 常量表达式
constexpr int sz = size(); // 只有当size()函数是一个constexpr函数时才是正确的

操作符重载

int main() {
	return 0;
}
举报

相关推荐

0 条评论