备战校招 C++ primer笔记

2020-03-14  本文已影响0人  不知名小号

只是开稿,会陆续更新。
一定要写得很详细,就好像面试一样

多文件的程序

参考 https://blog.csdn.net/Eric_4300741/article/details/52998531

const

const的对象只能被const引用所绑定
所以以下代码会报错

#include <iostream>
using namespace std;

int main(){
    const int ci = 1024;
    int &r1 = ci;
    cout << r1 << endl;
}

const与指针

const对象只能被“指向常量的指针”指向。

const double pi = 3.14;
double *ptr = &pi; // 错误,因为ptr只是一个普通指针
const double *cptr = &pi; // 正确,cptr是一个指向“const double”的指针

const double * cptr 与double *const cptr

const double * cptr

const double *cptr表示cptr是一个指向const double的指针,它的值是可以变的(你可以让它指向另外一个对象),但是它指向的内容不能通过它来改变。
因此,建议把const double连起来读,表示这是一个const double类型的指针或者对象!
例子如下:

#include <iostream>
using namespace std;
int main(){
    const double pi = 3.14;
    const double *cptr = &pi; // 一个const double类型的指针指向一个const double类型,没错。
    double a = 123.456;
    cout << *cptr << endl;
//  *cptr = 1;  // 这句会报错
    cptr = &a; // 这句不会报错
    // 因为:const double * cptr表示cptr是一个指向const double的指针,
    // **它的值是可以变的(你可以让它指向另外一个对象),但是它指向的内容不能通过它来改变。**
    cout << *cptr << endl;
}

double *const cptr

double *const cptr表示cptr是一个const指针,它的值不能被改变,也就是说,你不能让它指向另外一个东西

#include <iostream>
using namespace std;
int main(){
    double pi = 3.14; // 这里不能加const,因为const double类型只能被const double类型的指针指向。
    double *const cptr = &pi;
    cout << *cptr << endl;
    double a = 123.456;
//  cptr = &a; // 会报错,因为改变了const指针cptr的值
    *cptr = 123.456; // 正确,因为cptr指向的值是可以改变的

    cout << *cptr << endl;
}

双重const

#include <iostream>
using namespace std;
int main(){
    double pi = 3.14;
    const double *const cptr = &pi; // 加了双重const
    cout << *cptr << endl;
    double a = 123.456;
//  cptr = &a; // 会报错,因为改变了const指针cptr的值
//  *cptr = 123.456; // 错误,cptr的值也不能被改变

    cout << *cptr << endl;
}

顶层const和底层const

顶层const表示任意对象是常量,底层const表示指针指向的东西是常量。

int i = 0;
int *const p1 = &i; // 不能改变p1的值,这是顶层const
const int ci = 42; // ci的值不能被改变,这是顶层const
const int *p2 = &ci; // p2指向的东西的值不能通过p2改变,这是一个底层const
const int *const p3 = p2; // 左边的时底层const,右边的是顶层const。
const int &r = ci; // 用于引用声明的const都是底层const(表示它引用的那个东西不能通过这个引用来改变)

const赋值操作

再回顾一下,顶层const表示的是这个对象不能被改变,底层const是表示这个指针指向的对象不能通过这个指针被改变
当我们进行赋值操作时,将顶层const赋值给常量或者非常量都是可以的。

i = ci; // ci是顶层const,把它拷贝给变量i,顶层const不受影响。
p2 = p3; // p2、p3指向的类型都是const int,p3的顶层const不受影响。

但是,将底层const赋值给非底层const就不可以。
比如说p3是顶层const加底层const,表示它本身不能被改变,而且它指向的对象不能通过它被改变。

int *p = p3; // 这个操作是错误的,看之后的解析。

因为p3时底层const,它指向的东西不能通过它被改变。但p不是,这么赋值之后,p3原来指向的不可变的对象可以通过p来被改变了

constexpr变量

将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。

上一篇 下一篇

猜你喜欢

热点阅读