只是开稿,会陆续更新。
一定要写得很详细,就好像面试一样
多文件的程序
参考 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 = π // 错误,因为ptr只是一个普通指针
const double *cptr = π // 正确,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 = π // 一个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 = π
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 = π // 加了双重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类型以便由编译器来验证变量的值是否是一个常量表达式。
网友评论