#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
cout.precision(10);
// *****************const***************//
//const限定符 即定义一个不会更改的变量
const double PI = 3.1415926;
const double E = 2.7;
//E = 2; 报错 不可更改
cout << PI <<" "<< E << endl;
//可定义为表达式的运算结果 定义后就不会改变
int v = 10;
const double n = PI + v;
v = v + 2;
cout <<"express: "<< n << endl;
//const的引用 引用即别名
const int G = 124;
const int &g = G;
// g和G一样也不能更改
cout << "reference: " <<g << " " << G << endl;
//对常量的引用
const int &r1 = 10;
const int &r2 = 2*r1;
cout << "reference of constant: "<< r1 <<" " << r2 << endl;
//对可变变量的引用
double dval = 3.2;
const double &v2 = dval;
dval = 3.1;
cout << "reference of variable: " <<dval << " " << v2 << endl;
//v2 = 5.2; 允许定义可变变量的const引用 但不允许通过const引用来修改原可变变量的值。
//const指针
//指针不同于引用 指针是一个对象 所以可以定义const指针
int var = 2;
int *const p_var = &var;
*p_var = 1; //仍可通过指针来修改指定变量的值,因为定义的是const指针,不可修改的是所指向的地址——不变的是指针本身(指向地址)而不是指向的变量
int var1 = 2;
//p_var = &var1; //报错 不能修改const指针p_var指向的地址
//const指针的声明方法 (指针指向对象的类型) *const (指针名称) = 地址值 如:int *const p_var = &var;
//对const量的指针定义方法:
const double pi_ = 3.1415926;
const double *const pip = &pi_; // 定义const double类型的const指针
cout << "const pointer: " << var <<' ' << *p_var <<" "<< pi_ <<" "<<*pip<< endl;
//由上述可知 指针本身是一个常量 和 指针所指向的变量是一个常量 是相互独立的问题
//把 指针本身是一个常量 用顶层const表示
//把 指针指向的变量是一个常量 用底层const表示
int i = 0;
int *const pi = &i; //指针本身是一个常量,是一个顶层const
const int ci = 10; //其本身值不能改变 是一个顶层const
const int *p2 = &ci; //允许改变指针的值,但其指向是一个常量 是一个底层const
const int *const p3 = &ci; //靠右的const为顶层const,靠左的const为底层const
// ***************处理类型***************//
//类型别名:typedef和using
typedef double dbl; //dbl是double的同义词
dbl var_1 = 1.34;
cout << "typedef of double: " << var_1 << endl;
using dab = double; //dab是double的同义词
dab var_2 = 1.35;
cout << "using of double " << var_2 << endl;
// auto类型说明符 auto会自动计算结果类型
int var_3 = 9;
int var_4 = 2;
double var_5 = 2.4;
auto var_6 = var_3 + var_4; // int + int 自动为int
auto var_7 = var_4 + var_5; // int + double 自动为double
cout << "auto: " << var_6 << " " << var_7 << endl;
// decltype: 希望用表达式的类型推断出要定义的变量类型,但是又不想用表达式的值来初始化变量。
//decltype(var_3) var_8; //用var_3的类型来定义var_8
//decltype(f()) sum = x; //用函数f的返回值类型来定义sum
// 类型判断函数 typeid
int i_;
cout << typeid(i_).name() << endl; //返回 i_ 说明类型是int
//system("pause");
return 0;
}